Day3 - Fastbin Attack

今天第四天啦,继续加油orz。这几天先把几种基本的堆的利用方式学学吧。

参考资料

CTF Wiki

Fastbin Attack是基于fastbin的一类漏洞利用的方法,这些利用有一些前提:

  • 有堆溢出,uaf等漏洞,可以控制chunk内容
  • 漏洞发生在fastbin类型的chunk之中

漏洞主要原理在于Fastbin是通过单链表管理的,并且释放fastbin的chunk的时候不会清空next chunk的pre_in_use位。

Fastbin Double Free

Fastbin Double Free是指fastbin的chunk可以被多次释放,导致同一个chunk可以在fastbin链表中多次存在。这样分配的时候就可以实现多个指针指向同一个堆块,这样,根据不同指针对于堆块内容的用处不用,就能实现类型混淆的效果

这个方法可以成功有两个原因:

  • 堆块被释放后没用清空next chunk的pre_in_use位
  • fastbin在进行free的时候只检查main_arena直接指向的块,对于之后的块并没有检查。
1
2
3
4
5
6
7
8
9
10
11
int main(void)
{
void *chunk1, *chunk2;
chunk1 = malloc(0x10);
chunk2 = malloc(0x10);

free(chunk1);
free(chunk2);
free(chunk1);
return 0;
}

free(chunk1)

1
2
3
+--------------+      +----------+
| main_arena | ---> | chunk1 |
+--------------+ +----------+

free(chunk2)

1
2
3
+--------------+      +----------+      +----------+
| main_arena | ---> | chunk2 | ---> | chunk1 |
+--------------+ +----------+ +----------+

free(chunk3)

1
2
3
4
+--------------+      +----------+      +----------+      +----------+
| main_arena | ---> | chunk1 | ---> | chunk2 | ---> | chunk1 |----
+--------------+ +----------+ +----------+ +----------+ |
^--------------------------------|

这样free在第三次释放后fd的值不为0而是指向chunk2

如果在这时,我们能够控制chunk1的内容,就可以改写fd从而在我们想要的的地址分配fastbin块(要注意大小必须和该fastbin链表的大小一致)。从而实现任意地址写。

House Of Spirit

这个就是通过控制目标区域前后的内容,伪造一个假的chunk,然后将这块内存释放掉,再分配回来,就能控制目标区域的内容了。

要注意一些检测

  • fake chunk的ISMMAP位不能位1,因为会被特殊处理
  • fake chunk的地址要对齐,MALLOC_ALIGN_MASK
  • fake chunk的大小要满足对应fastbin的需求
  • fake chunk的next chunk大小不能小于2*SIZE_SZ,同时也不能大于av->system_mem
  • fake chunk对用的fastbin链表头部不能使该fake chunk(不能double free)

具体利用之前写过了,下次复习orz

Alloc to Stack

这个比较好理解

通过在栈上伪造fake chunk,然后通过修改在fastbin链表中的chunk的fd指针指向fake chunk,就能把栈上的fake chunk分配出来,然后控制一些关键数据。注意栈上的fakechunk需要又满足条件的size值。

Arbitrary Alloc

这个跟上一个一样,只是不局限在栈上,任何满足条件的size域,都可以成为被分配的块。

可以使用字节错位来寻找满足条件的size,然后在fastbin构造一个相同组的chunk,通过修改该chunk的fd,就能分配到该目标块了。

栗子

Search Engine

首先康康保护

1
2
3
4
5
6
7
8
$ checksec search 
[*] '/home/critiz/Desktop/search'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE
FORTIFY: Enabled