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()时得到指向该地址的指针。伪造的堆结构必须满足
- 地址p-8处为合法的fast chunk size。(fake chunk的size字段需正确设置)
- 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