overlapping_chunk.c 源代码
调试分析
首先malloc三块内存,前两块的大小一样,第三块小一点,个中缘由看后面调试就知道了
接下来初始化三个chunk的内容,分别为“全1”“全2”“全3”
接下来free掉chunk 2
chunk 2的指针被丢到unsortedbin里面,接下来一次malloc如果我们malloc一个跟chunk 2一样大小的chunk就会分配到chunk2
由于是在观察“overlapping”漏洞,这里我们就直接模拟一个溢出的操作,将chunk 2 的size位覆盖成另一个值
但是注意这里在设计要覆盖给chunk 2 的size位的时候要加一,即设置p位为1(表示前一个chunk被分配)
这是为了防止在下一次malloc的时候mallocor把chunk1也当做free chunk,调用consolidate把chunk1和2合并了,这就影响利用了
验证:
修改evil_chunk_size为0x180,编译调试
赋值前
赋值后
malloc后
可以发现改完evil_chunk_size后验证,并没有发生预想的“前一个chunk被consolidate合并”
分析consolidate源码,在检测到prev_inuse位为0的时候做的操作是
将size加上pre_size
将指针p指向负偏移pre_size的低地址,也即前一个chunk的chunk头
将指针p从bin中解链
以上操作总结起来就是堆块的前向合并
但是这里的pre_size是被覆盖为错误的值(0x3131313131313131),所以指针p被改成了错误的值,在unlink的时候就无法通过fd和bk指针位置的检查,无法unlink,也就无法完成合并,所以这里会发现没有发生堆块的前向合并
继续malloc的问题
现在只有p2在unsortedbin里面,下一次malloc合适的大小就能malloc到p2
为了观察overlapping的漏洞,在程序中直接改写p2的size来模拟通过溢出来改写p2 size的操作
而在改写size的时候,低3比特位需要注意设计,这里暂时只关注prev_inuse位,写为1,避免p1被当做空闲堆块
int evil_chunk_size = 0x181;
int evil_region_size = 0x180 - 8;
这里设置的两个变量
evil_chunk_size为要覆盖的p2 chunk的size
evil_region_size为要申请的大小,但为什么是0x180-8 而不是 0x180-0x10 呢,这一点要回头注意看开头malloc的时候malloc的大小
malloc的时候就都是减了8字节,所以这里为了恰好在结尾包含整个p3 chunk而设计的 0x100 + (0x80 - 8),还是理解不了可以看后面的内存图
覆盖size后
现在我们就可以通过申请evil_region_size大小的chunk来获得我们改写大小后的,正在unsortedbin的p2
malloc后得到0x180大小的chunk,返回到指针p4
这时候p4 chunk就包含了p3 chunk
我们改写p3 chunk或着p4 chunk,都可以互相覆盖,这就是overlap,两个chunk发生了重叠
现在的内存情况
为了更直观地看到内存被改写的变化,我们先将整个p4 chunk填充字符 ‘4’ 即 0x34
然后将p3 chunk的一部分覆盖为字符 ‘3’,即 0x33
注意这里覆盖的大小为十进制的 80,而不是p3 chunk的整个的大小 0x80
然后可以看到打印出来的 p4 和 p3 如下
p4 = 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444333333333333333333333333333333333333333333333333333333333333333333333333333333334444444444444444444444444444444444444444�
p3 = 333333333333333333333333333333333333333333333333333333333333333333333333333333334444444444444444444444444444444444444444�
这里就能看出来p3、p4先后被覆盖了
以上就是 overlapping_chunk 的原理