mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['binary-exploitation/rop-return-oriented-programing/ret2csu.
This commit is contained in:
parent
b184d76e9f
commit
88099d85e7
1 changed files with 7 additions and 7 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue