Fastbin Attack

一、基础知识

fastbin attack的利用前提

  1. 存在堆溢出、UAF等能控制chunk
  2. 发生在fastbin中

细分为以下几种:

  1. fastbin double free
  2. House of Spirit
  3. Alloc to Stack
  4. Arbitary Alloc

1、2 主要侧重于利用free释放真的或伪造的chunk,然后再次申请chunk来进行攻击
3、4 主要侧重于故意修改fd指针利用malloc申请指定位置得chunk

注意点!

fastbin使用单向链表维护释放的堆块
fastbin管理的chunk不会清空下个chunk得inuse位

以 64 为系统为例,因此 fastbin 的范围为32字节到128字节(0x20-0x80),如下:

1
2
3
4
5
6
7
Fastbins[idx=0,hold_size=00-0x18,size=0x20] 
Fastbins[idx=1,hold_size=0x19-0x28,size=0x30]
Fastbins[idx=2,hold_size=0x29-0x38,size=0x40]
Fastbins[idx=3,hold_size=0x39-0x48,size=0x50]
Fastbins[idx=4,hold_size=0x49-0x58,size=0x60]
Fastbins[idx=5,hold_size=0x59-0x68,size=0x70]
Fastbins[idx=6,hold_size=0x69-0x78,size=0x80]

image.png

main_arena指向了chunk3的prev_size

二、Fastbin Double Free

好好说话之Fastbin Attack(1):Fastbin Double Free_pwn 好好说话-CSDN博客

一个chunk被多次释放即被称为double free ,也可能不止两次
可以通过构造使得同样的堆块被取出两次,造成类似于类型混淆的效果

Fastbin Double Free能够成功利用主要有两部分的原因:

  1. fastbin的堆块被释放后next_chunk的prev_inuse位不会被清空
  2. 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进行一些检测,我们需要绕过这些检测

  1. fake chunk 的 ISMMAP 位不能为1,当free时,如果是mmap的chunk,会单独处理
  2. fake chunk 的地址需要对齐,对齐指的是地址上的对齐而不仅仅是内存对齐,比如32位程序的话fake_chunk的prev_size所在地址就应该位0xXXXX00xXXXX4。64位的话地址就应该在0xXXXX00xXXXX8
  3. fake chunk的size大小需要满足 fastbin 的要求
    不能大于0x80
  4. fake chunk的next chunk大小不能小于2 * SIZE_SZ (0x10)
    1. SIZE_SZ代表了用于存储 chunk 大小信息的字段的字节数。也就是chunk信息头的大小,64位的SIZE_SZ为8字节,32位为4字节
    2. av->system_mem 代表 malloc 当前管理的系统内存总量,next chunk 的大小不能超过这个值,以避免超出合法堆范围。