tcache七星剑法IV:见影
本文最后更新于:2023年11月1日 下午
爷爷,你最喜欢的动画片更新了!
tcache七星剑法IV:见影——uaf与off-by-null的巧妙联动
题目简介
这题是做的一个付费题库的题,所以因为这个特殊原因,不能放出来。
不过我可以简要讲一下题目的条件:堆题,仅有add和delete两个功能,delete有uaf漏洞;add有两个指针槽位,读入字节范围是0-0x100,无溢出,且add时可以选择idx。add如果读入了\n,会在\n后面加一个\x00。
没有show和edit,libc版本为2.31
思路分析
没有show的打法可以参考这个系列上一篇文章:tcache七星剑法III:留光——巧用残留指针劫持tcache链表,大体思路差不多,都是通过硬填或者劫持堆块打tcache_struct的方法去让一个堆块突破tcache count而进入unsorted bin,在其fd位置留下next指针并将其取出进行低位爆破令其指向_IO_2_1_stdout_,然后再设法将这个堆块放进tcache中(用tcache中堆块的uaf进行局部覆盖或者直接劫持tcache进行局部覆盖),让tcache链最终指向_IO_2_1_stdout_,修改其中magic和缓冲区指针使其泄露libc地址。
(过两天我会在那篇后面更新一下,详细讲解没有show情况下各种情况的应对)
关键问题是这题怎么起手。给的漏洞是一个没有edit和show来辅助的uaf,和一个常用与堆缩的off-by-null(堆缩这个技巧和tcache八竿子打不着,你tcache bin打个🔨的合并)。
因此我们可以排除掉off-by-null来打堆缩的思路,转而想办法去辅助uaf。
我们知道,对于2.32之前的堆题,常见的单链表堆(fastbin和tcache)打法思路都是利用uaf去劫持链表中堆块指针,也就是说要取出来一个堆块的同时保证这个堆块在一个bin里面,这样我们就能把利用取堆块的操作往堆块里面写东西来破坏指针。
由于2.31的tcache全面防止了double free,之前低版本的成环double free技巧在没有edit的情况下无效了。但是我们可以选择在free掉一个堆块之后利用off-by-null修改其size再次释放的方式让一个chunk同时进入两个tcache链表。由于tcache所有操作都不会涉及到P位,这个操作不会在tcache处理中引发报错。因此我们就可以从一个链表中取出,然后通过低位爆破将另一个tcache链表引向tcache_struct,进而劫持count创造unsorted bin chunk获得libc基址了。
other…
当时同时开了两个题,这题难度是hard被我秒了,另一个难度为medium的题我没做出来(),而且一看解题数,确实是medium那题解的更少……
话说回来,off-by-one(null)打堆块缩放这些东西,确实有必要写篇文章总结了。