0x01 基础知识
fastbin所包含chunk的大小为16 Bytes, 24 Bytes, 32 Bytes, … , 80 Bytes。当分配一块较小的内存(mem<=64 Bytes)时,会首先检查对应大小的fastbin中是否包含未被使用的chunk,如果存在则直接将其从fastbin中移除并返回;否则通过其他方式(剪切top chunk)得到一块符合大小要求的chunk并返回。
fastbin为单链表,,fastbin为了快速分配回收这些较小size的chunk,并没对之前提到的bk进行操作,即仅仅通过fd组成了单链表而非双向链表,而且其遵循后进先出(LIFO)的原则。
0x02 利用方法
- 分配两个fastbin
- 利用堆溢出能够覆盖位于高地址的fd指针
- 构造伪chunk结构
- 进行分配达到任意地址写的目的123456#define fastbin_index(sz) \((((unsigned int) (sz)) >> (SIZE_SZ == 8 ? 4 : 3)) - 2)...if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0)){errstr = "malloc(): memory corruption (fast)";
因为检查中没有进行对齐处理。所以可以利用错位来构造一个伪size结构以实现fasbin attack
0x03 实例
0ctf2017 babyheap
利用
- 泄露libc库,该手法本文不多做介绍
- fastbin attack劫持程序流1234561.malloc fastbin12.malloc fastbin23.free fastbin24.通过堆溢出修改fastbin2的fd指针5.重新malloc fastbin2覆盖malloc_hook6.修改hook指向one_gadget
需要注意的是libc在fastbin size还有一个检测,这个检测是:如果分配出来的chunk的size不属于这个fastbin,那么会出现memory corruption(fast) 的错误。
我们此处就是利用错位构造了伪chunk实例fastbin attack
可以发现__memalign_hook的地址的第三个字节为0x7f,那么我们就可以利用错位来构造伪chunk,将fastbin2的fd指向malloc_hook-24-3-8
EXP
|
|