0-堆漏洞

这篇文章属于堆漏洞的归档总结。会在之后遇到新的漏洞进行补充。
也算是 https://shangu127.top/2021/11/09/1109/ 文章的补充。

1-Double_free

该漏洞是指将同一个chunk free两次,通常情况下free两个chunk会报错是无法编译的,监测机制也很简单,就仅仅是对free变量与前一个进行对比,所以可以中间夹一个其他的实现:

1
2
3
4
C
free(shangu1)
free(shangu2)
free(shangu1)

此时的 bins 中情况大概如下:0x20 —> shangu1 —> shangu2 —> shangu1
当再次申请堆时会出现 有两个指针指向同一个chunk

2-UAF(特殊的doublefree

3-堆溢出

堆溢出只能溢出到下一个 chunk,所以常见的利用方式是结合其他漏洞。
主要修改的地方有:

1、p位,就是inuse位,记录了上一个chunk是否被free
2、pre_size 和 size ,分别记录了当前一个chunkfree时前一个chunk的大小以及当前chunk包含chunk头的大小
3、FD 和 BK指针位,分别指向bins中后一个chunk和前一个chunk

4-unlink

unlink是指在双链表管理的bins中(除fastbin),当连着free两个chunk时,会对这两个chunk进行合并,然后返回第一个free的chunk的chunk指针。
其中也存在着监测机制,类似于双链表的删除操作,通过绕过检测我们可以在一个chunk中的mem区域构造一个fake_chunk。这样就相当于在要删除的chunk后加入了新的chunk。
这样在进行unlink时会返回一个可控的地址,即伪造chunk的头部,利用某些题目自带的 edit 功能可以利用溢出等 操作对chunk头进行修改使其指向 got 表,就可以达到劫持函数的目的。

所以利用前提就是:

1、可以溢出最少 1 字节。
2、在内存中存在一个全局数组存放指向 chunk的指针并且知道该数组地址。