前言
关于fastbin的一种利用手法 目前做题中没有做到需要这条链的
偶然看到vnctf2022的压轴题考到了这种方法 就索性来学习一下
原理
主要是通过global_max_fast来实现的 其规定了fastbin链表的最大范围 如果我们将其修改为一个很大的值 那么就会导致超出范围的chunk被释放到了fastbin
和tcachebin的mp+80利用类似 其会导致tcache的结构体的entry指针数组无法容纳下足够多的链表头指针
fastbin也有自己的用来管理链表头的数组 我们称之为fastbinY 其位于main_arena上
如果我们通过修改global_max_fast 从而把一个大chunk释放到了fastbin中 那么其指针就会超过fastbinY的范围 从而延申到高地址处 那么我们也就相当于可以往fastbinY高地址处任意写一个堆地址
利用
首先我们想办法将global_max_fast的值修改为一个极大值 这里我选择的办法是largebin attack
随后我们计算一下fastbinY和我们想要写入堆地址的偏移 如上图 这个时候和_IO_list_all偏移为0xa10
那么我们最后只需要申请一个 0x10+0xa10*2的chunk 并且将其释放 那么其指针就会被放入_IO_list_all
这一点可以延申出什么利用效果呢 如果题目存在UAF漏洞 那么我们就可以泄露fastbinY后的内存空间上的任意数据
比如此时我想要泄露main_arena+784处的内容
那么我就需要申请一个 2*(784-16)+0x10 也就是0x610的chunk
此时再次释放后 由于链表的并入机制 此时的chunk地址就会填入main_arena+784
而其原本的内容 就会被充当chunk的fd域
同理 如果我们修改已经被释放chunk的fd域 随后再次申请该chunk出来 此时的fd域就会被充当链表头 那么就相当于了一次任意写