一、基础知识
fastbin attack的利用前提
- 存在堆溢出、UAF等能控制chunk
- 发生在fastbin中
细分为以下几种:
- fastbin double free
- House of Spirit
- Alloc to Stack
- Arbitary Alloc
1、2 主要侧重于利用free释放真的或伪造的chunk,然后再次申请chunk来进行攻击
3、4 主要侧重于故意修改fd指针利用malloc申请指定位置得chunk
注意点!
fastbin使用单向链表维护释放的堆块
fastbin管理的chunk不会清空下个chunk得inuse位
以 64 为系统为例,因此 fastbin 的范围为32字节到128字节(0x20-0x80),如下:
1 | Fastbins[idx=0,hold_size=00-0x18,size=0x20] |

main_arena指向了chunk3的prev_size
二、Fastbin Double Free
好好说话之Fastbin Attack(1):Fastbin Double Free_pwn 好好说话-CSDN博客
一个chunk被多次释放即被称为double free ,也可能不止两次
可以通过构造使得同样的堆块被取出两次,造成类似于类型混淆的效果
Fastbin Double Free能够成功利用主要有两部分的原因:
- fastbin的堆块被释放后next_chunk的prev_inuse位不会被清空
- fastbin在执行free的时候仅验证了main_arena直接指向的块,即链表指针头部的块。对于链表后面的块并没有进行验证
_int_free函数堆fastbin double free的检测
检测方法:fastbin在执行free的时候仅仅验证main_arean直接指向的块,即链表头部的块,如果释放main_arean直接指向的块,就会被检测,但是如果不是直接指向的块就可以绕过检测
三、House Of Spirit
House Of Spirit与fastbin double free有很大的区别:fastbin double free释放的chunk是程序自身malloc产生的,house of spirit是去释放指定地址的chunk,这个chunk是我们通过伪造的方式构建,可以是任意可写地址,但是伪造chunk,系统会对chunk进行一些检测,我们需要绕过这些检测
- fake chunk 的 ISMMAP 位不能为1,当free时,如果是mmap的chunk,会单独处理
- fake chunk 的地址需要对齐,对齐指的是地址上的对齐而不仅仅是内存对齐,比如32位程序的话fake_chunk的prev_size所在地址就应该位
0xXXXX0或0xXXXX4。64位的话地址就应该在0xXXXX0或0xXXXX8 - fake chunk的size大小需要满足 fastbin 的要求
不能大于0x80 - fake chunk的next chunk大小不能小于2 * SIZE_SZ (0x10)
- SIZE_SZ代表了用于存储 chunk 大小信息的字段的字节数。也就是chunk信息头的大小,64位的SIZE_SZ为8字节,32位为4字节
av->system_mem: 代表malloc当前管理的系统内存总量,next chunk的大小不能超过这个值,以避免超出合法堆范围。