From 9c06a67c1aa6d35ead537f0946264de5f1154f46 Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 19 Apr 2024 14:50:11 +0000 Subject: [PATCH] Translated ['binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-e --- .../stack-pivoting-ebp2ret-ebp-chaining.md | 99 +++++++++++++------ 1 file changed, 70 insertions(+), 29 deletions(-) diff --git a/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md b/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md index 36cec29c6..2ef7639f2 100644 --- a/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md +++ b/binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md @@ -6,17 +6,17 @@ HackTricks를 지원하는 다른 방법: -* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* **회사가 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)**를 팔로우하세요.** -* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 기여하세요.** +* [**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을 제출하세요. ## 기본 정보 -이 기술은 **베이스 포인터 (EBP)**를 조작하여 **EBP 레지스터와 `leave; ret` 명령어 시퀀스를 신중하게 사용하여 여러 함수의 실행을 연결하는 능력을 악용**하는 것입니다. +이 기술은 **베이스 포인터 (EBP)**를 조작하여 EBP 레지스터와 **`leave; ret`** 명령어 시퀀스를 신중하게 사용하여 여러 함수의 실행을 연결하는 능력을 악용합니다. `leave`는 기본적으로 다음을 의미합니다: ``` @@ -24,51 +24,51 @@ mov ebp, esp pop ebp ret ``` -**EBP가 스택에 있기 때문에** EIP 이전에 있으므로 스택을 제어하여 EBP를 제어할 수 있습니다. +그리고 **EBP가 EIP보다 먼저 스택에 있기 때문에** 스택을 제어하여 EBP를 제어할 수 있습니다. ### EBP2Ret 이 기술은 **EBP 레지스터를 변경할 수 있지만 EIP 레지스터를 직접적으로 변경할 방법이 없을 때 특히 유용**합니다. 함수가 실행을 마치면서 동작을 활용합니다. -`fvuln`의 실행 중에 스택에 **가짜 EBP**를 주입하여 셸코드 주소가 있는 메모리 영역을 가리키도록 설정하면(4바이트를 `pop` 작업을 고려하여 더한 값), 간접적으로 EIP를 제어할 수 있습니다. `fvuln`이 반환되면 ESP는 이 조작된 위치로 설정되고, 이후의 `pop` 작업은 ESP를 4만큼 감소시키므로, **사용자가 설정한 주소를 가리키도록 효과적으로 만듭니다.**\ -여기서 **2개의 주소를 알아야 한다는 점**에 유의하세요: ESP가 이동할 위치 및 ESP가 가리키는 주소를 작성해야 하는 위치입니다. +`fvuln`의 실행 중에 스택에 **가짜 EBP**를 삽입하여 셸코드 주소가 위치한 메모리 영역을 가리키도록 설정하면(4바이트를 `pop` 작업을 고려하여 더한 상태), 간접적으로 EIP를 제어할 수 있습니다. `fvuln`이 반환되면 ESP는 이 조작된 위치로 설정되고, 이후의 `pop` 작업은 ESP를 4만큼 감소시키므로, **사용자가 설정한 주소를 가리키도록 효과적으로 만듭니다.**\ +여기서 **2개의 주소를 알아야 한다는 점**에 주목하세요: ESP가 이동할 위치 및 ESP가 가리키는 주소를 써야 하는 주소. -#### 공격 구성 +#### Exploit 구성 -먼저 **임의의 데이터/주소를 쓸 수 있는 주소를 알아야** 합니다. ESP는 여기를 가리키고 **첫 번째 `ret`를 실행**합니다. +먼저 **임의의 데이터/주소를 쓸 수 있는 주소를 알아야** 합니다. ESP는 여기를 가리키고 **첫 번째 `ret`를 실행**할 것입니다. -그런 다음, **임의의 코드를 실행할** `ret`에 의해 사용되는 주소를 알아야 합니다. 다음을 사용할 수 있습니다: +그런 다음, 임의의 코드를 **실행할 `ret`에 사용되는 주소**를 알아야 합니다. 다음을 사용할 수 있습니다: * 유효한 [**ONE\_GADGET**](https://github.com/david942j/one\_gadget) 주소. * **`system()`** 주소 뒤에 **4바이트의 쓰레기 바이트**와 `"/bin/sh"` 주소(x86 비트). -* **`jump esp;`** 가젯([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)) 주소 뒤에 실행할 **셸코드** 주소. +* **`jump esp;`** 가젯([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)) 주소 뒤에 실행할 **셸코드**. * 일부 [**ROP**](../rop-return-oriented-programing/) 체인 -제어 가능한 메모리의 이 부분에 이러한 주소 중 어느 것이든 앞에 **`4`바이트**가 있어야 합니다. 이는 `leave` 명령의 `pop` 부분 때문입니다. 이 4바이트를 악용하여 **두 번째 가짜 EBP를 설정하고 실행을 계속 제어**할 수 있습니다. +제어 가능한 메모리의 이 부분에 이러한 주소 중 어느 것이든 사용하기 전에 **`4`바이트**가 있어야 합니다. `leave` 명령의 **`pop`** 부분 때문에 이 4바이트를 악용하여 **두 번째 가짜 EBP를 설정하고 실행을 계속 제어**할 수 있습니다. #### Off-By-One Exploit -이 기술의 특정 변형인 "Off-By-One Exploit"이 있습니다. 이는 **EBP의 가장 낮은 유효 바이트만 수정할 수 있는 경우** 사용됩니다. 이 경우, **`ret`로 이동할 주소를 저장하는 메모리 위치**는 EBP와 처음 세 바이트를 공유해야 하므로 더 제약 조건으로 유사한 조작이 가능합니다.\ -보통 가장 멀리 이동하려면 바이트 0x00을 수정합니다. +이 기술의 특정 변형인 "Off-By-One Exploit"이라고 알려진 것이 있습니다. 이는 **EBP의 가장 낮은 유효 바이트만 수정할 수 있는 경우** 사용됩니다. 이 경우, **`ret`로 이동할 주소를 저장하는 메모리 위치**는 EBP와 처음 세 바이트를 공유해야 하므로, 더 제약 조건으로 유사한 조작이 가능합니다.\ +보통 가장 멀리로 이동하기 위해 바이트 0x00을 수정합니다. -또한, 스택에 RET 슬레드를 사용하고 실제 ROP 체인을 끝에 놓아 새 ESP가 RET 슬레드 내부를 가리키고 최종 ROP 체인이 실행될 가능성을 높이는 것이 일반적입니다. +또한, 스택에 RET 슬레드를 사용하고 실제 ROP 체인을 끝에 놓아 새 ESP가 RET SLED 내부를 가리키고 최종 ROP 체인이 실행될 가능성을 높일 수 있습니다. ### **EBP Chaining** -따라서 스택의 `EBP` 항목에 제어 가능한 주소를 넣고 `EIP`에 `leave; ret` 주소를 넣으면 **`ESP`를 스택에서 제어 가능한 `EBP` 주소로 이동**할 수 있습니다. +따라서, 스택의 `EBP` 항목에 제어 가능한 주소를 넣고 `EIP`에 `leave; ret` 주소를 넣으면 **`ESP`를 스택의 제어 가능한 `EBP` 주소로 이동**할 수 있습니다. 이제 **`ESP`**가 원하는 주소를 가리키고 실행할 다음 명령이 `RET`인 상태입니다. 이를 악용하기 위해 제어 가능한 ESP 위치에 다음을 놓을 수 있습니다: * **`&(다음 가짜 EBP)`** -> `leave` 명령의 `pop ebp`로 새 EBP를 로드합니다. * **`system()`** -> `ret`에 의해 호출됩니다. * **`&(leave;ret)`** -> 시스템이 종료된 후 호출되며, ESP를 가짜 EBP로 이동시키고 다시 시작합니다. -* **`&("/bin/sh")`**-> `system`에 대한 매개변수 +* **`&("/bin/sh")`**-> `system`의 매개변수 -기본적으로 이 방법을 사용하여 프로그램의 흐름을 제어하기 위해 여러 가짜 EBP를 연결할 수 있습니다. +기본적으로 이 방법을 사용하여 프로그램의 흐름을 제어하는 여러 가짜 EBPs를 연결할 수 있습니다. -이는 [ret2lib](../rop-return-oriented-programing/ret2lib/)와 유사하지만, 명백한 이점은 없지만 일부 특수한 경우에 흥미로울 수 있습니다. +이는 [ret2lib](../rop-return-oriented-programing/ret2lib/)과 유사하지만, 명백한 이점은 없지만 일부 특수한 경우에 흥미로울 수 있습니다. -또한, 여기에는 이 기술을 사용하여 **스택 누출**을 통해 이기는 함수를 호출하는 [**도전 과제 예제**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)가 있습니다. 이는 페이지의 최종 페이로드입니다: +또한, 여기에는 이 기술을 사용하여 **승리 함수를 호출하는 스택 누출**을 사용하는 [**도전 과제 예제**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave)가 있습니다. 이것은 페이지의 최종 페이로드입니다: ```python from pwn import * @@ -106,8 +106,8 @@ print(p.recvline()) ``` ## EBP가 사용되지 않을 수 있음 -[**이 게시물에서 설명한대로**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), 일부 최적화로 컴파일된 이진 파일의 경우 **EBP는 ESP를 제어하지 못할 수 있으므로**, EBP를 제어하여 작동하는 어떤 악용도 실제로 효과가 없기 때문에 실패할 것입니다.\ -이는 **프롤로그와 에필로그가** 최적화된 경우 변경되기 때문입니다. +[**이 게시물에서 설명한대로**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), 일부 최적화로 컴파일된 이진 파일의 경우 **EBP는 ESP를 제어하지 못합니다**, 따라서 EBP를 제어하여 작동하는 모든 exploit은 기본적으로 실제 효과가 없기 때문에 실패할 것입니다.\ +이는 이진 파일이 최적화되었을 때 **프롤로그와 에필로그가 변경**되기 때문입니다. * **최적화되지 않음:** ```bash @@ -135,7 +135,7 @@ ret # return ### **`pop rsp`** 가젯 -[**이 페이지**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp)에서 이 기술을 사용한 예제를 찾을 수 있습니다. 이 도전 과제에서는 2개의 특정 인수를 사용하여 함수를 호출해야 했으며 **`pop rsp` 가젯**이 필요했으며 **스택에서의 누출**이 있었습니다: +[**이 페이지**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp)에서 이 기술을 사용한 예제를 찾을 수 있습니다. 이 도전 과제에서는 2개의 특정 인수를 사용하여 함수를 호출해야 했으며 **`pop rsp` 가젯**이 있으며 **스택에서의 누출**이 있었습니다: ```python # Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp # This version has added comments @@ -187,21 +187,62 @@ xchg , rsp ``` ### jmp esp -여기서 ret2esp 기술을 확인하십시오: +여기서 ret2esp 기술을 확인하세요: {% content-ref url="../rop-return-oriented-programing/ret2esp-ret2reg.md" %} [ret2esp-ret2reg.md](../rop-return-oriented-programing/ret2esp-ret2reg.md) {% endcontent-ref %} -## 참고 자료 및 다른 예시 +## 참고 자료 및 다른 예제 * [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) * [https://guyinatuxedo.github.io/17-stack\_pivot/dcquals19\_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/dcquals19\_speedrun4/index.html) -* 64 비트, ret sled로 시작하는 rop 체인을 사용한 off by one exploitation +* 64 bits, off by one exploitation with a rop chain starting with a ret sled * [https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html) -* 64 비트, relro, canary, nx 및 pie가 없습니다. 프로그램은 스택 또는 pie의 leak를 허용하고 qword의 WWW를 제공합니다. 먼저 스택 leak을 가져와서 WWW를 사용하여 pie leak을 가져옵니다. 그런 다음 `.fini_array` 항목을 남용하고 `__libc_csu_fini`를 호출하여 "eternal" 쓰기를 만들어 ROP 체인을 .bss에 쓰고 RBP로 피벗팅합니다. +* 64 bit, no relro, canary, nx and pie. The program grants a leak for stack or pie and a WWW of a qword. First get the stack leak and use the WWW to go back and get the pie leak. Then use the WWW to create an eternal loop abusing `.fini_array` entries + calling `__libc_csu_fini` ([more info here](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md)). Abusing this "eternal" write, it's written a ROP chain in the .bss and end up calling it pivoting with RBP. ## ARM64 -ARM64에서 함수의 **프롤로그와 에필로그**는 **SP 레지스트리를 스택에 저장하고 검색하지 않습니다**. 따라서 기본적으로 스택 내부의 일부 데이터를 덮어쓰는 것으로 SP 레지스트리를 제어할 수 없습니다. +ARM64에서 함수의 **프롤로그와 에필로그**는 **SP 레지스트리를 저장하고 검색하지 않습니다**. 더구나 **`RET`** 명령은 SP가 가리키는 주소로 돌아가지 않고 **`x30` 안의 주소로 돌아갑니다**. + +그러므로 기본적으로 에필로그를 남용하여 스택 내부의 데이터를 덮어쓰는 것으로 SP 레지스트리를 제어할 수 없습니다. 그리고 SP를 제어할 수 있다 하더라도 **`x30` 레지스터를 제어해야** 합니다. + +* 프롤로그 + +```armasm +sub sp, sp, 16 +stp x29, x30, [sp] // [sp] = x29; [sp + 8] = x30 +mov x29, sp // FP points to frame record +``` +* 에필로그 + +```armasm +ldp x29, x30, [sp] // x29 = [sp]; x30 = [sp + 8] +add sp, sp, 16 +ret +``` + +{% hint style="danger" %} +ARM64에서 스택 피봇을 수행하는 방법은 **`SP`를 제어**할 수 있어야 하며, 그 레지스터의 값이 `SP`로 전달되거나 `SP`가 스택에서 주소를 가져오는 이유가 있어야 합니다. 그런 다음 에필로그를 남용하여 **제어된 `SP`에서 `x30` 레지스터를 로드**하고 **`RET`**로 이동해야 합니다. +{% endhint %} + +또한 다음 페이지에서 **ARM64에서 Ret2esp의 동등한 내용**을 볼 수 있습니다: + +{% content-ref url="../rop-return-oriented-programing/ret2esp-ret2reg.md" %} +[ret2esp-ret2reg.md](../rop-return-oriented-programing/ret2esp-ret2reg.md) +{% endcontent-ref %} + +
+ +제로부터 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) 컬렉션 +* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.** +* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요. + +