前言
一种结合了unsortedbin attack和largebin attack的攻击办法 可以达到任意地址写的效果
在学习这两个漏洞的时候 其各自效能不大 unsortedbin 受限于对于fake chunk的size域和bk域的检查
largebin attack受限于其只能单一的在任意地址写堆地址
但是如果将二者结合起来 就可以达到任意地址申请chunk的效果
不过这个办法也是旧时代的眼泪了 在libc2.30以后就诞生了新的检查机制来防止
源码分析
首先我们要清楚整个漏洞的触发流程 先是利用unsortedbin chunk放入到largebin chunk中 从而将fake chunk链入unsorted_chunks (av)
/* remove from unsorted list */ |
同时还可以将fake chunk的fd域修改为unsorted_chunks (av)
为了达到这一目的 我们就需要更改unsortedbin chunk的bk域为fakechunk_addr - 0x10
这里之所以还要减去0x10 是为了腾出size域和prev_size域的空间
紧接着我们需要利用largebin attack来写fake chunk的size域 以及完善fake chunk的结构 以供绕过双向链表的检测
else |
实际利用
为了配合上述的源代码 我们需要将两个chunk的布局构造成下面这样
ptr_addr = 你想要任意写的地址-0x10 |
具体的数值计算就自己根据源码来看了 应该挺好懂的 还有一点需要注意的就是unsoretbin chunk和largebin chunk的释放时机
add(0x418,b'aaaa')#0 |
你可以看到 要先释放largebin chunk 这是因为要将size小的放在链表头 不然后续无法将其放入largebin
总体利用还是比较简单的 难在理解