overlapping chunk 2/fake topchunk/malloc_hook/presize共用

关键词:overlapping chunk 2 / fake topchunk / malloc_hook / presize共用 / fastbin attack。

2018 0ctf 的babyheap

思路:

1.update()的时候会有一个故意的off-by-one,似乎只能溢出覆盖下一个chunk的presize的最低位,但这里又涉及到一个姿势,或者说堆管理的机制:

由于堆是16字节对齐(x86是八字节),但如果malloc(0x28)这种情况,则会把下一个堆块的presize位也包括进来,共用presize的八字节。而申请到的堆块的大小为0x20

2.所以实际上如果申请0x18长度的堆块,则下一个堆块的presize的八字节也会包括在这0x18之内。再加上off-by-one即可以覆盖下一个堆块的size位,实现overlapping chunk2的利用方法。

overlapping chunk 2/fake topchunk/malloc_hook/presize共用_第1张图片
malloc(0x18)的结果

overlapping chunk2:假设已有chunk1、chunk2,通过覆盖chunk1的size位,使之足够大(size=size_of_chunk1+sizeof_chunk2)而包含了之后的chunk2(必须把整个堆块包含进来不然会报错),free(chunk1),再申请一块大小为size的堆块,就会把chunk1和chunk2一起申请出来,从而可以对整个hunk2进行修改。

3.借助overlapping chunk2的方法就可以修改堆块的fd指针,完成fastbin attack。

4.同样借助pverlapping chunk2的方法把两个堆块拼接成 > fast_max的堆块,然后free掉,借助unsorted bin来泄露libc基址。(chunk1和chunk2合并,chunk2和chunk3合并,free(chunk2+chunk3),通过chunk1把chunk2的fd、bk即指向main_arena中的指针打印出来,实现libc基址的泄露。

5.由于无法泄露程序基址(PIE),所以只能考虑在libc中做文章,一种方法是:

在libc中__malloc_hook__free_hook的地方填入one_gadget的地址。

overlapping chunk 2/fake topchunk/malloc_hook/presize共用_第2张图片

6.一种方法是直接在__malloc_hook前面不远处伪造堆块头部,然后利用fastbin attack申请得到该区域的内存,从而对其中的__malloc_hook进行修改。

可以通过错位来伪造堆块的size位:

fastbin attack之后malloc(0x60)就可以申请到目标地址

这正是2017 0CTF babyheap的解法,但是今年题目中有了申请堆块<0x58的限制,这种方法不再能用。

7.另一种方法是:

修改top chunk,接着申请内存会从top chunk中切割,从而申请到目标地址。

伪造的top chunk需要满足size位不为0,这里可以借助_malloc_hook之前的_memalign_hook的数据来作为presize和size

以及一些关于main_arena的知识

1.main_arena紧跟在__malloc_hook之后,fastbin、unsorted bin、small bins、large bins都存在其中。

overlapping chunk 2/fake topchunk/malloc_hook/presize共用_第3张图片

main_arena+8: fastbin 0x20

main_arena+16: fastbin 0x30

main_arena+24: fastbin 0x40

main_arena+32: fastbin 0x50

main_arena+40: fastbin 0x60

main_arena+48: fastbin 0x70

main_arena+56: fastbin 0x80

main_arena+88: top chunk

main_arena+96: last remainder

main_arena+104: unsorted bin

main_arena+232: small bin(0x90)   

main_arena+1112:large bin(0x400)

事实上small bins和large bin都包含许多存放不同长度堆块的项,这里只选取某一长度进行测试。

8.fastbin attack 修改top chunk

可以通过fastbin attack向fastbin中填入伪造堆块的size(例如0x61),然后分配一次后即将0x61填入fastbin,由上可知0x61在topchunk前面,利用fastbin attack申请一块该地址,top chunk显然包含其中,可以通过修改该堆块来修改top chunk

9.top chunk的要求:

伪造top chunk要求目标地址 offset+8即对应size位不能为0,观察一下可以使用_malloc_hook之前的_memalign_hook的数据来作为presize和size。将该地址作为top chunk地址后,再次申请堆块即可对__malloc_chunk进行修改。(这道题不能这样用而必须在fastbin中放伪造的size,是由于题目对分配的堆大小作了限制,_memalign_hook距离topchunk地址超过了题目限制的大小)

你可能感兴趣的:(overlapping chunk 2/fake topchunk/malloc_hook/presize共用)