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

This commit is contained in:
Translator 2024-09-25 16:50:32 +00:00
parent b184d76e9f
commit 88099d85e7

View file

@ -27,7 +27,7 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
**`__libc_csu_init`**에는 강조할 두 가지 명령어 시퀀스(gadgets)가 있습니다:
1. 첫 번째 시퀀스는 여러 레지스터(rbx, rbp, r12, r13, r14, r15)에 값을 설정할 수 있게 해줍니다. 이들은 나중에 사용하고 싶은 숫자나 주소를 저장할 수 있는 슬롯과 같습니다.
1. 첫 번째 시퀀스는 여러 레지스터(rbx, rbp, r12, r13, r14, r15)에 값을 설정할 수 있게 해줍니다. 이는 나중에 사용하고자 하는 숫자나 주소를 저장할 수 있는 슬롯과 같습니다.
```armasm
pop rbx;
pop rbp;
@ -37,7 +37,7 @@ pop r14;
pop r15;
ret;
```
이 가젯은 스택에서 값을 꺼내어 이러한 레지스터를 제어할 수 있게 해줍니다.
이 가젯은 스택에서 값을 꺼내 레지스터를 제어할 수 있게 해줍니다.
2. 두 번째 시퀀스는 우리가 설정한 값을 사용하여 몇 가지 작업을 수행합니다:
* **특정 값을 다른 레지스터로 이동**시켜 함수의 매개변수로 사용할 준비를 합니다.
@ -48,7 +48,7 @@ mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
```
2. 아마도 그곳에 쓸 주소를 모르고 **`ret` 명령어**가 필요할 것입니다. 두 번째 가젯도 **`ret`로 끝나지만**, 그것에 도달하기 위해서는 몇 가지 **조건**을 충족해야 합니다:
3. 아마도 거기에 쓸 주소를 모르고 **`ret` 명령어**가 필요할 것입니다. 두 번째 가젯도 **`ret`로 끝나지만**, 그것에 도달하기 위해서는 몇 가지 **조건**을 충족해야 합니다:
```armasm
mov rdx, r15;
mov rsi, r14;
@ -76,9 +76,9 @@ gef➤ search-pattern 0x400560
* `rbp``rbx`는 점프를 피하기 위해 동일한 값을 가져야 합니다.
* 고려해야 할 생략된 pop이 있습니다.
## RDI RSI
## RDI RSI
ret2csu 가젯에서 **`rdi`** **`rsi`**를 제어하는 또 다른 방법은 특정 오프셋에 접근하는 것입니다:
ret2csu 가젯에서 **`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,12 +92,12 @@ ret2csu 가젯에서 **`rdi`** 및 **`rsi`**를 제어하는 또 다른 방법
### 호출 사용
syscall을 하거나 `write()`와 같은 함수를 호출하고 싶지만 `rdx` `rsi` 레지스터에 특정 값이 필요하다고 가정해 보겠습니다. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾겠지만, 찾을 수 없습니다.
syscall을 하거나 `write()`와 같은 함수를 호출하고 싶지만 `rdx` `rsi` 레지스터에 특정 값이 필요하다고 가정해 보겠습니다. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾겠지만, 찾을 수 없습니다.
여기서 **ret2csu**가 등장합니다:
1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 pop하여 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), r15에 넣습니다.
2. **두 번째 가젯 사용**: 이러한 레지스터가 설정되면 두 번째 가젯을 사용합니다. 이를 통해 선택한 값을 `rdx``rsi`(각각 r14 및 r13에서)로 이동시켜 함수 호출을 위한 매개변수를 준비합니다. 또한 `r15``rbx`를 제어하여 프로그램이 계산한 주소에 있는 함수를 호출하고 `[r15 + rbx*8]`에 배치할 수 있습니다.
2. **두 번째 가젯 사용**: 이러한 레지스터가 설정되면 두 번째 가젯을 사용합니다. 이를 통해 선택한 값을 `rdx``rsi`(각각 r14와 r13에서)로 이동시켜 함수 호출을 위한 매개변수를 준비합니다. 또한 `r15``rbx`를 제어하여 프로그램이 계산한 주소에 있는 함수를 호출하도록 할 수 있습니다. 이 주소는 `[r15 + rbx*8]`에 배치됩니다.
이 기술을 사용한 [**예제와 설명이 여기에 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), 그리고 이것이 사용된 최종 익스플로잇입니다:
```python