일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Network
- libtins
- BEST of the BEST
- #Qt Creator
- command
- 오버워치 세이버메트릭스
- >
- vi
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- KASAN
- #MINT64 #Sqix
- ftz
- linux
- 오버워치
- libpcap
- FTZ 레벨2
- #Best of the Best #OS #MINT64 #Sqix
- #
- vim
- #IntelManual
- Overwatch League SaberMetrics
- 인터럽트
- Sqix
- vi 외부 명령어
- Find
- C++11
- Today
- Total
Sqix
Stack Pivoting 본문
Stack Pivoting은 여러 Gadget을 이용해서 쓰기 가능한 공간에 Fake Stack을 구성해 놓고 Chaining하는 기법입니다.
오버플로우 기법을 사용해야 하는데 덮어쓸 수 있는 입력공간이 너무 부족한 경우 이러한 기법을 사용합니다.
단, 이 때 반드시 Gadget이 있어야 합니다.
1. Fake Stack으로 사용할 공간 찾기
가장 먼저 fake stack으로 사용할 공간을 찾아내야 합니다.
당연히 스택처럼 사용할 것이기 때문에, RW권한이 있어야 합니다.
peda에 있는 vmmap과, 이전 각 메모리 영역을 볼 수 있는 objdump -h를 이용해서 쓸 공간을 찾을 수 있습니다.
보통 bss영역과 bss영역 이후의 빈 공간을 많이 이용합니다.
다만, 해당 영역(여기로 치면 0x804a00c ~ 0x804b000 사이)에 stdout, stdin 등이 있을 수 있으므로 주의해야 합니다.
이러한 지정된 값들이 덮어씌워지는 경우, Segmentation Fault가 발생하여 머리 위에 물음표가 띄워질 수 있습니다.
2. 적합한 Gadget 찾기
Gadget은 esp를 건드리는 명령어 + ret이 gadget이 될 수 있다고 합니다.
Fake ebp 기법에 많이 쓰이는 leave-ret gadget으로 예시를 들어서 알아봅시다.
leave는 mov esp, ebp; / pop ebp; 명령어를, ret은 pop eip; / jmp eip; 명령어를 나타냅니다.
이는 이전 함수에서 사용하던 Frame Pointer 주소를 ebp에 저장하고, esp를 증가시킵니다. (leave)
이후 스택 최상단의 값(return address)을 eip에 저장하고, 그 주소로 이동합니다. (ret)
Gadget은 다음과 같이 찾을 수 있습니다.
3. Exploit
기존 ROP와 같이 필요한 정보를 수집합니다.
함수의 plt, got, fake stack으로 사용할 영역의 주소, stack pivot gadget의 주소,
leak을 위한 함수의 주소, payload 입력을 위한 read의 주소, leak을 통해서 system이나 "/bin/sh"의 주소 등을 구합니다.
Fake stack으로 이동을 하려면 스택의 구성과 함수 실행 흐름을 파악해야 합니다.
보통 스택은 다음과 같이 형성됩니다.
(var, buf) ... - [ Stack Frame Pointer Address ] - [ Return Address ] - ...
SFP에는 RET로 돌아가는 함수에서 사용할 EBP를 저장하고, Return Address엔 함수가 끝나고 돌아갈 주소를 저장합니다.
여기서 SFP를 fake stack로 덮고, RET을 read의 주소, ret+4를 leave-ret gadget로 덮어씌운다고 가정해 봅시다.
그럼 스택은 다음처럼 바뀔 것입니다.
(var, buf) ... - [ &fake stack ] - [ read ] - [ leave_ret ] - [ read_argv1 ] - [ read_argv2 ] - [ read_argv3 ]
sfp, ret을 fake stack, gadget으로 바꿨기 때문에 fake stack의 주소가 ret 이후의 esp로 바뀝니다.
따라서 해당 fake stack에는 SFP, RET과 같은 역할을 하는 곳이 새로 형성이 됩니다.
이를 이용해서 허용된 공간 내로 필요한 만큼의 chaining이 가능합니다.
예를 들어, fake stack을 두 개 만들고, 첫 stack 에서는 libc, system leak을 위해 공간을 활용합니다.
이후 2번째 stack에서는 exploit을 위한 payload를 올려서 system("/bin/sh")을 실행하도록 할 수 있습니다.
'Exploit Techniques > Pwnable' 카테고리의 다른 글
Return Oriented Programming (0) | 2019.09.20 |
---|