heap general tricks

5 篇文章 0 订阅

1. malloc

1.1 malloc leaking

malloc分配一个chunk时,不对chunk中的内容进行清空操作,通过打印一个来自bin中的chunk,可能得到敏感信息。

例如,如果malloc分配的chunk来自unsortied bin,则该chunk中将保存unsorted bin头指针的地址,这个指针在libc中的偏移是固定的,通过这个指针可以泄露libc的加载地址。

unsorted bin头指针相对于malloc_hook的偏移为

  • 对于有tcache的libc:0x70
  • 对于没有tcache的libc:0x68

2.fastbin

2.1 fastbin double-free

当一个chunk将被free进入fastbin时,只会将待free的chunk和fastbin中第一个chunk进行对比,如果不相同,不管该chunk是否已经在fastbin中,都不会报double free错误。
假设现有a和b两个chunk,大小符合fastbin,首先将对a进行free,再对b进行free,然后再对a进行一次free,可以成功将a进行double free

2.2 fastbin overwrite fd: fastbin attack

若能够覆写一个存在于fastbin中的chunk的fd指针(一般通过double free),可以将该fd指针覆写为任意地址p,只要地址p中保存的值与chunk的大小相差小于16,就可以将地址p添加进fastbin中并通过malloc得到指向p+0x10的指针

2.3 free a fake fast chunk(house of spirit)

在任意地址p处伪造堆结构,向free()传入该地址p,可将p所指向的内存地址作为一个chunk加入fastbin链表,在下一次malloc()时得到指向该地址的指针。伪造的堆结构必须满足

  1. 地址p-8处为合法的fast chunk size。(fake chunk的size字段需正确设置)
  2. p所指向的chunk的下一个chunk具有合法的size,在x64系统中,要求这个size满足16<=size<=128Kb。(fake chunk的下一个chunk的size字段需要正确设置)

2.4 fastbin consolidate(fastbin double-free variant)

先将一个chunk放入fastbin中,再调用malloc()申请一个较大的chunk时,会将fastbin中的chunk放入small bin中。此时如果再对这个chunk进行一次free(),则会再次将这个chunk放入fastbin中,从而实现fastbin double-free

由于发生consolidate时,放入small bin中的chunk的下一个chunk的prev_inuse位会被置0,因此常会在chunk中构造一个fake chunk来进行unlink攻击

3. unsorted bin

3.1 unsorted bin overwrite bk: unsorted bin attack

如果能够覆写一个usorted bin中chunk的bk指针,使bk指针指向任意地址p,则通过malloc申请该chunk后,地址p+16处将被覆写为libc中unsorted bin的头指针地址

4. top chunk

4.1 overwrite top chunk size bigger: house of force

如果能够覆写top chunk中size字段,可以将该字段改写为极大值,从而任意大小的malloc申请都可以被接受,地址达到0xffffffff后发生整数溢出,又从0开始计算。已知当前top chunk所在地址,通过设置malloc申请的size,可以通过申请一个超大的chunk获得任意地址的指针

4.2 overwrite top chunk size smaller: house of orange

如果能够覆写top chunk中的size字段,将改字段写为较小的值,再进行一次malloc申请,当这次申请的地址大于当前top chunk size中的值时,libc会将这个size大小的chunk加入unsorted bin中,并再分配一块新的top chunk满足上述分配。

被加入unsorted bin的chunk可用于泄露libc地址,或完成unsorted bin attack。通常这种技术用于程序中不存在free操作时,相当于使用ptmalloc本身的机制完成一次free

5. unlink

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值