文件路径(malloc/malloc.c) 这段代码是向后合并的操作,p是刚刚被释放的堆块。如果它的prev_inuse位是0 的话(正常情况是上一个相邻堆块被释放),就会执行这段代码。先把前一个堆块的大小(p->prev_size)赋给prevsize,把p的大小修改为两个堆块的大小之和。通过p的地址减去上一个堆块的大小,找到合并后,p应该在的地址,并更新p。再用新的p去执行unlink。 unlink操作在这里没有具体的利用,我们只是最后需要绕过这样的一个检测。让它可以正常进行合并。这里第9行是针对lagebin的一个检测,而在我们这个利用手法中,基本都是lagebin,所以我们需要对这个fd_nextsize和bk_nextsize,做一个绕过的检测。因为当lagebin中只有一个堆块时,fd_nextsize和bk_nextsize,都指向p自己,所以我们把这两个设置为p的地址即可。 这段就是就是把与topchunk 相邻的空闲堆块与top chunk合并。并更新top chunk的大小和地址。 这里是这样,利用某些手段伪造出一个fakechunk,这个chunk位于我们想要分配的目的地址上(记为target)。 同时,我们利用可以正常分配到的一个 chunk (记为p)。通过修改p 的 prevsize和pre_inuse,让p 和target 合并为一个堆块,当然p本身是与topchunk相邻的。此时,target 和 p 都被 topchunk 合并为新的topchunk。此时topchunk 的地址,就迁移到了 target 所在的地址。那么再次分配堆地址,就可以把这个空间分配到手。 1.伪造fakechunk ,需要泄露 栈地址和堆地址。总之要能泄露地址
2.off-by-one 或off-by-null,要能修改pre_inuse。 请在ubuntu16下编译(即使用glibc-2.23)。编译时记得关掉pie,这样便于打断点。
编译时参数(只能在64位下编译) 这个demo是自己写的,在how2heap的基础上添加了一些基础的描述。希望可以更清楚的表达出,漏洞利的一个思路。同时,关于合并后的size大小,这里描述也做了修改。因为合并是b和fakechunk以及topchunk,所以最后的大小理论上也是三个堆块的大小相加。
事实上,也确实如此
这里因为pwndbg的原因,所以使用heap命令查看到的信息会和实际有出入if (!prev_inuse(p)) {
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287392.htm
[分享]House of Einherjar
241 浏览
3 回复
可以私聊吗
mb_yqsvfqmf
可以私聊吗
有什么问题吗
可以私聊吗
有什么问题吗
江畔
有什么问题吗
有点私活
有什么问题吗
有点私活