Translated ['binary-exploitation/rop-return-oriented-programing/ret2csu.

This commit is contained in:
Translator 2024-09-25 16:50:23 +00:00
parent 8e1c9a4687
commit 7a9a36436d

View file

@ -48,7 +48,7 @@ mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
```
2. 也许你不知道要写入哪个地址,并且你**需要一个 `ret` 指令**。请注意,第二个 gadget 也将**以 `ret` 结束**,但你需要满足一些**条件**才能到达它:
3. 也许你不知道要写入的地址,并且你**需要一个 `ret` 指令**。请注意,第二个 gadget 也将**以 `ret` 结束**,但你需要满足一些**条件**才能到达它:
```armasm
mov rdx, r15;
mov rsi, r14;
@ -78,7 +78,7 @@ gef➤ search-pattern 0x400560
## RDI 和 RSI
从 ret2csu gadget 控制 **`rdi`** 和 **`rsi`** 的另一种方法是通过访问特定的偏移量
通过访问特定的偏移量,从 ret2csu gadget 控制 **`rdi`** 和 **`rsi`** 的另一种方法是:
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
@ -92,14 +92,14 @@ gef➤ search-pattern 0x400560
### 使用调用
想象一下,你想进行系统调用或调用像 `write()` 这样的函数,但需要在 `rdx``rsi` 寄存器中作为参数的特定值。通常,你会寻找直接设置这些寄存器的 gadgets但你找不到任何。
想象一下,您想要进行系统调用或调用像 `write()` 这样的函数,但需要在 `rdx``rsi` 寄存器中作为参数的特定值。通常,您会寻找直接设置这些寄存器的 gadgets但您找不到任何。
这时 **ret2csu** 就派上用场了
这时 **ret2csu** 发挥作用
1. **设置寄存器**:使用第一个魔法 gadget 从栈中弹出值并放入 rbx、rbp、r12edi、r13rsi、r14rdx和 r15。
2. **使用第二个 gadget**:在这些寄存器设置好后,使用第二个 gadget。这使你能够将所选值移动到 `rdx``rsi`(分别来自 r14 和 r13为函数调用准备参数。此外通过控制 `r15``rbx`你可以使程序调用位于你计算并放入 `[r15 + rbx*8]` 的地址的函数。
2. **使用第二个 gadget**:在设置好这些寄存器后,您使用第二个 gadget。这使您能够将所选值移动到 `rdx``rsi`(分别来自 r14 和 r13为函数调用准备参数。此外通过控制 `r15``rbx`您可以使程序调用位于您计算并放入 `[r15 + rbx*8]` 的地址的函数。
可以在这里找到一个 [**使用此技术并解释的示例**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation),这是它使用的最终利用:
可以在这里找到一个 [**使用此技术并解释的示例**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation),这是它使用的最终利用:
```python
from pwn import *
@ -181,4 +181,4 @@ target.interactive()
```
### 为什么不直接使用libc
通常这些情况也容易受到[**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/)的攻击但有时你需要控制比直接在libc中找到的gadgets更复杂的参数。例如,`write()`函数需要三个参数,而**直接找到设置所有这些的gadgets可能是不可能的**。
通常这些情况也容易受到[**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/)的攻击,但有时你需要控制的参数比直接在libc中找到的gadgets更复杂。例如`write()`函数需要三个参数,而**直接找到设置所有这些的gadgets可能是不可能的**。