Day 0 - tcache

嘛,本来是暑假一开始就准备的企划orz,然后短学期之前的部分没记录23333。整个记录顺便防止自己整日荒废然后比赛暴毙orz。这个系列都是堆相关的漏洞利用,主要参考资料是ctf-wiki,以及询问大佬。。。哈吉马路哟

参考资料

ctf-wiki

TCACHE

tcache是glibc2.26以后新加入的机制。从名字来看是一个类似内存的cache那样的加速的东西。系统为每个线程增加bin缓存,默认情况下,每个线程有64个bins,大小从24(32位下12),以16(32位下8)递增至1032(32位下516)。每个bins默认最多容纳7个chunk。

tcache对chunk的检查很少,难怪wiki上有一句“tcache makes heap exploitation easy again”。

将chunk放入tcache

在放入chunk时,free函数检查对其和前后堆块释放情况,然后优先将chunk放入tcache中。

在malloc中,也有将内存块放入tcache的情况:

  • 如果申请的是fastbin大小的块并且在fastbin内找到可用的块时,会将该链上的其他内存块放入tcache中
  • 如果申请的是smallbin大小的块并且在smallbin在找到可用的块时,将该链上的其他内存块放入tcache中
  • 如果是处理unsorted bin,那么当找到一个大小合适的块时,会将其放入tcache中,然后继续寻找,而不是直接返回。

从tcache中取出chunk

在malloc时,如果tcache中有大小合适的chunk,从tcache中获取

遍历完unsorted bin之后,如果tcache中有大小合适的chunk,从tcache中获取

在循环处理unsorted bin内存块时,如果达到放入tcache的unsorted bin上限时,会直接返回。但是一般默认是0(没有上限)

利用方式

tcache poisoning

因为tcache检查很松,可以通过覆盖rcache的next,不需要构造任何chunk即可实现malloc到任何地址

tcache dup

类似fastbin dup,由于检查几乎没有,所以可以多次free同一个chunk。

tcache house of spirit

通过控制栈上的内容,在栈上布置fake chunk,然后free掉,这样可以通过malloc得到一块栈上的空间。

在smallbin中包含空闲块时,会同时将同大小的其他空闲块放入tcache中,此时会出现解链操作。但是相比于unlink宏,缺少链的完整性校验。原本的unlink操作在该条件下也能使用。

libc leak

需要先将tcache填满,再进行libc leak。

overlapping chunk

更改指定chunk的size,使之增大。那么在释放再分配时就能造成堆块交叉。

应用例子

待填orz

之前的堆块利用方式还没看完。。。学完再填