Horse of spirit



House of spirit 也是”The Malloc Maleficarum”的文章中提出的一种利用fastbin实施的一种heap利用手段,在笔者看来,更是一种内存漏洞利用技术的思想,即通过构造一个fake space使得内存allocator错误分配到我们可控的内存区域,进而达到write anything anywhere的效果。

Principle

House of spirit 的主要利用fastbin,其基本思路如下:

  1. 用户能够通过漏洞控制一个free的指针P
  2. 在可控位置(.bss,stack,heap)上构造一个fake fastbin chunk
  3. P修改为fake fastbin chunk 的chunk address,并且将其free到FastbinY[i]中去
  4. 下次malloc一个相应大小的fastbin时就能够返回fake fastbin chunk的位置,实现write anything anywhere

其中难度在于如何构造fake chunk使得free时绕过glibc的安全检查
_int_free的到fastbin的代码中涉及到的安全检查如下:

其中
fake chunk的size

how2heap中的描述:
This chunk.size of this region has to be 16 more than the region (to accomodate the chunk data) while still falling into the fastbin category (<= 128 on x64). The PREV_INUSE (lsb) bit is ignored by free for fastbin-sized chunks, however the IS_MMAPPED (second lsb) and NON_MAIN_ARENA (third lsb) bits cause problems…. note that this has to be the size of the next malloc request rounded to the internal size used by the malloc implementation. E.g. on x64, 0x30-0x38 will all be rounded to 0x40, so they would work for the malloc parameter at the end.

一般我们的fake chunk的size都会选择相应的FastbinY的大小,所以一般该chunk的size不会出问题,PREV_INUSE位无所谓是0或者1,IS_MMAPPED与NON_MAIN_ARENA确保为0

nextchunk的size:

需要保证nextchunk的size是合理的值即可

The chunk.size of the next fake region has to be sane. That is > 2*SIZE_SZ (> 16 on x64) && < av->system_mem (< 128kb by default for the main arena) to pass the nextsize integrity checks. No need for fastbin size.

下面是一个小例子:

上述程序即满足利用house-of-spirit的条件,存在一个可以溢出控制的指针p
通过printf打印出了栈地址,我们可以通过在stack地址中布置fake chunk
p修改为栈中的fake_chunk地址,从而再次malloc时将堆劫持到stack中。

How2Heap

下面分析ShellFish的How2Heap中提供的Horse of spirit的POC:
其中去除了部分注释

首先malloc(1)初始化了堆空间
之后通过unsigned long long fake_chunks[10] attribute ((aligned (16)));分配了伪造fake chunk的栈空间
其中利用__attribute__ 指定了0x10字节对齐的属性,满足malloc的对齐格式。
chunk的头部地址应该是0x…0的形式
在栈中布置fake chunk如下图:

之后通过漏洞使得free的指针为a = &fake_chunks[2];,注意free的地址为malloc_chunkmem指针地址
free后fake chunk进入FastbinY

最后malloc(0x30)时,根据LIFO,理所应当分配该fake chunk地址
运行结果:

Summary

House of spirit 是利用构造一个fake fastbin chunk 使得程序free掉fake chunk再次malloc时能够分配到fake chunk的区域,最简单的利用方式就是可以将heap劫持到栈中,覆盖返回地址,balabala……
它需要满足的条件有:

  1. 溢出或其他漏洞,用于覆盖free的变量P
  2. 用户能够控制该这个空闲块即fake chunk的大小,空闲块的大小rounded下一个次malloc的大小
  3. 用户还需要能够控制fake chunk的高端地址,从而保证next_size bypass检查
  4. 之后还存在malloc,最好能够控制malloc分配的大小

House of spirit 适合用户控制了低地址,高地址,需要通过House of spirit控制中间地址的情境,当然将只能够间接利用的堆溢出转换成栈溢出也是好的选择,可见典型的题目Pwnable.tw Spirited Away。

reference

浅析Linux堆溢出之fastbin
linux 堆溢出学习之house of spirit

发表评论