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)打堆块缩放这些东西,确实有必要写篇文章总结了。


tcache七星剑法IV:见影
http://example.com/2023/10/07/Blog/Pwn/pwn note/glibc-heap/tcache七星剑法IV:见影——uaf与off-by-null的巧妙联动/
作者
Jmp.Cliff
发布于
2023年10月7日
许可协议