碎碎念
应该不算一个链 只能说一种堆风水的手法吧 叫这个名字有点怪怪的 不过总归是一个很好的手法
适用于没有堆溢出 但是有UAF 而且比较少见 不过不排除有的厉害的师傅自己就能发现这个手法。。。 我还是太菜了
分析
2.27 以后(指9.0那个新版本) tcachebin 新增了key 给double free起了干扰的作用 如果要绕过 有三种办法
1.覆盖tcachebin的bk域 也就是key
2.修改tcachebin chunk的size 使其key检测的时候绕开原本的链表
3.house of botcake
这个手法的本质 是利用chunk overlap来突破没有堆溢出的限制 覆盖fd域
我们知道 在chunk被释放进入tcachebin后 其bk域会被写入key 如果想要再次释放 就需要绕过key 但是 如果chunk是先被释放进入unsortedbin呢 当我们填满tcachebin链表后 再次释放同大小的chunk 就会释放进入unsortedbin 此时再从tcachebin链表中申请出来一个chunk 再次释放已经被释放进入unsortedbin chunk 就可以成功释放两次
此时如果再次申请一个比原本的chunk大的chunk 就会从合并后的chunk中分配 从而可以覆盖到位于tcachebin chunk的fd域 这样就达到了任意写的目的
上面这么讲可能不明不白 下面直接来看吧
利用
首先填满tcachebin的一个链表
for i in range(9): |
chunk0和chunk1用来释放进入unsortedbin
此时二者成功合并
我们再次申请一个0x200的chunk 把链表腾出一个位置 随后再次释放chunk1 成功进入tcachebin链表
add(0x200) |
此时随便申请一个比0x200大 比0x410小的chunk 就可以触碰到chunk1的fd域了 从而实现任意地址写