How2heap--overlapping_chunk(by glibc2.23)

26 篇文章 1 订阅
26 篇文章 0 订阅

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 的原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值