0%

FastbinAttack

Fastbin Attack

图文源好好说话之Fastbin Attack(1):Fastbin Double Free_pwn 好好说话-CSDN博客根据自己理解做了摘抄

​ 这一类漏洞利用的方法主要基于fastbin机制的缺陷,其实fastbin attack并不是指某一种利用方法,而是一些。这类利用的前提是:

存在堆溢出、use-after-free等能控制chunk内容的漏洞
漏洞发生于fastbin类型的chunk中

​ 如果细分的话,可以做如下的分类:

Fastbin Double Free
House of Spirit
Alloc to Stack
Arbitrary Alloc

​ 前两种主要漏洞侧重于利用free函数释放的真的 chunk或伪造的chunk,然后再次申请chunk进行攻击,后两种侧重于故意修改fd指针,直接利用malloc申请指定位置chunk进行攻击。主要讲解Fastbin Double Free。

原理
fastbin attack存在的原因在于fastbin时使用单向链表来维护释放的堆块的,并且由fastbin管理的chunk即使被释放,其next_chunk的prev_inuse位也不会被清空。

  • 在fastbin中后一个被释放的chunk的fd指向前一个被释放的chunk的prev_size,main_arena指向最后一个被释放的chunk的prev_size。
  • 看一下在释放阶段的chunk的prev_inuse标志位为1,回来在看释放后的内存情况,chunk的prev_inuse依然还是1不变。
  • fastbin在执行free的时候仅验证了main_arena直接指向的块,即链表指针头部的块。

Fastbin Double Free

fastbin中的chunk被释放两次及以上。后果是多次分配可从fastbin链表中取出同一个堆块,结合堆块的数据内容可以实现类似于**类型混淆(type confused)**的效果。

Fastbin Double Free成功利用主要原因:

fastbin的堆块被释放后next_chunk的prev_inuse位不会被清空。
fastbin在执行free的时候仅验证了main_arena直接指向的块,即链表指针头部的块。对于链表后面的块并没有进行验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 1 //gcc -g hollk4.c -o hollk4
2 #include<stdio.h>
3
4 typedef struct _chunk
5 {
6 long long pre_size;
7 long long size;
8 long long fd;
9 long long bk;
10 } CHUNK,*PCHUNK;
11
12 CHUNK bss_chunk;
13
14 int main(void)
15 {
16 void *chunk1,*chunk2,*chunk3;
17 void *chunk_a,*chunk_b;
18
19 bss_chunk.size=0x21;
20 chunk1=malloc(0x10);
21 chunk2=malloc(0x10);
22
23 free(chunk1);
24 free(chunk2);
25 free(chunk1);
26
27 chunk_a=malloc(0x10);
28 *(long long *)chunk_a=&bss_chunk;
29 malloc(0x10);
30 malloc(0x10);
31 chunk_b=malloc(0x10);
32 printf("%p",chunk_b);
33 return 0;
34 }

首先经过double free之后fastbin中的单向链表为chunk1_double –> chunk2 –> chunk1在经过一次malloc申请后main_arena指向的chunk1_double被重新启用,即chunk1倍重新启用,main_arena指向chunk2,并且将chunk1的fd从原来的指向chunk2修改为指向结构体指针chunk1 –> bss_chunk,也就是说在fastbin单向链表中bss_chunk已经作为chunk1前一个被释放的块的存在了

接下来第二次malloc申请后main_arena指向的chunk2被启用,main_arena重新指向chunk1

第三次malloc申请后chunk1再一次被启用,main_arena指向chunk的fd指向的bss_chunk

那么在第四次malloc申请的时候此时main_arena指向的bss_chunk就会被启用

虽然bss_chunk并不是在内存中正常申请的chunk,但是由于我们可以修改chunk1的fd,使他指向bss_chunk,那么即使bss_chunk位于bss段,也会被当作一个chunk来被启用

那么在程序第31行代码中chunk_b其实被赋予的就是bss_chunk的结构体指针,所以在第32行输出的时候实际输出的是bss_chunk的chunk地址