Fastbin
LIFO单链表结构:fd指针指向后一个堆块
chunk size<0x80
堆块释放时,后一个chunk 的 pre_inuse不会置零
可以leak heap base
前提
- 存在堆溢出、use-after-free 等能控制 chunk 内容的漏洞
- 能够申请并利用fastbin范围的chunk
原理
- 后一个chunk的pre_inuse不置零==>double free,可以控制已释放的chunk,与UAF等价
- 通过fd链接==>修改fd指针,直接申请到target addr
1 | /*example1*/ |
如上代码可以成功编译并执行,此时fastbin中结构为 fastbin=>chunk1=>chunk2=>chunk1
也就是说同一chunk可以在fastbin中多次出现,因此我们可以将先申请到chunk1,修改其data段
但chunk1此时还在fastbin中,我们修改data段实际上是修改了在链表中的fd指针,因此当我们将data修改为 fake_chunk 时,fastbin中结构为fastbin=>chunk2=>chunk1=>fake_chunk
1 | /*example2*/ |
gcc double_free.c -o double_free -g
1 | gdb-peda$ fastbin |
所以当我们继续申请,取出chunk2, chunk1之后,我们继续申请就会申请到fake_chunk,而当fake_chunk布局在敏感的地方(__malloc_hook或者其他可调用的函数指针)时就可以完成一次攻击。