堆漏洞挖掘中的top chunk的向前合并

一、top chunk

  • 当我们分配一块堆内存时,top chunk是出于地址的最高处的,其前面就是我们所申请的chunk。

二、top chunk的合并操作

  • 如果top chunk前面的chunk不是fast chunk并且处于空闲,那么top chunk就会合并这个chunk。
  • 如果top chunk前面的chunk是fast chunk,不论是否空闲,top chunk都不会合并这个chunk。

三、演示案例(不合并fast chunk)

#include <unistd.h>
#include <malloc.h>

int main()
{
    int size=0x20;
    void *p1=malloc(size);
    void *p2=malloc(size);
    
    sleep(0); //只为了程序打断点,无其他作用
    free(p2);
    return 0;
}
  • 第一步:在sleep处打断点,并运行起来。

  • 第二步:查看当前的堆信息以及bins信息。

  • 第三步:释放p2,如果top chunk前面是fast chunk,那么top chunk不会合并前面的fast chunk,fast chunk被放在fastbins中。

四、演示案例(合并unsorted chunk)

#include <unistd.h>
#include <malloc.h>

int main()
{
    void *p1=malloc(0x20);
    void *p2=malloc(0x100);
    
    sleep(0); //只为了程序打断点,无其他作用
    free(p2);
    return 0;
}
  • 第一步:在sleep处打断点,并运行起来。

  • 第二步:查看当前的堆信息以及bins信息。

  • 第三步:释放p2(看到在释放p2之后,第2个chunk没有了,被top chunk合并了,top chunk的大小加上了第2个chunk的大小。135121=134849+272。并且bins链表中也没有该chunk)。

五、阻止top chunk合并chunk

  • 如果在一个free掉的chunk后面再申请一个chunk,那么新申请的chunk处于使用状态,top chunk就不会合并前面的chunk。
#include <unistd.h>
#include <malloc.h>

int main()
{
    void *p1=malloc(0x100);
    void *p2=malloc(0x100);
    
    sleep(0); //只为了程序打断点,无其他作用
    free(p1);
    return 0;
}
  • 第一步:在sleep处打断点,并运行起来。

  • 第二步:查看当前的堆信息以及bins信息。

  • 第三步:释放p1,可以看到第2个chunk的size从273变味了272,代表此chunk前面的chunk处于空闲状态。并且被释放的chunk被放入了unsortedbin中,而没有被top chunk合并。


  • 我是小董,V公众点击"笔记白嫖"解锁更多【堆漏洞挖掘】资料内容。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值