fastbin_attack中的House of Spirit(基础)

简介

House of Spirit是一个组合型漏洞的利用,具体来说就是变量覆盖和堆管理机制的组合利用。

原理

House of Spirit的利用关键在于能够覆盖一个堆指针变量(也就是调用malloc之后堆块中malloc_data返回的地址),让其指向可以控制的区域。

利用思路

1、伪造堆块

2、覆盖堆指针指向上一步伪造的堆块

3、释放堆块,将伪造的堆块放入fastbin单链表中(需要绕过检测)

4、申请堆块,将刚才释放的堆块申请出来,最终可以使得向目标区域中写入数据,以达控制内存的目的。

在free时需要绕过的检测

libc-2.23.so的malloc.c源码glibc2.23/malloc/malloc.c at master · balexios/glibc2.23 (github.com)

检测一

fake chunk的ISMMAP位不能为1,因为free时,如果是mmap的chunk,会单独处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (chunk_is_mmapped (p))                       /* release mmapped memory. */
{
/* see if the dynamic brk/mmap threshold needs adjusting */
if (!mp_.no_dyn_threshold
&& p->size > mp_.mmap_threshold
&& p->size <= DEFAULT_MMAP_THRESHOLD_MAX)
{
mp_.mmap_threshold = chunksize (p);
mp_.trim_threshold = 2 * mp_.mmap_threshold;
LIBC_PROBE (memory_mallopt_free_dyn_thresholds, 2,
mp_.mmap_threshold, mp_.trim_threshold);
}
munmap_chunk (p);
return;
}

M标志位不能为1

检测二

fake chunk地址需要对齐,MALLOC_ALIGN_MASK

检测三

fake chunk的size大小需要满足对应的fastbin的需求,同时也得对齐。

1
2
if ((unsigned long)(size) <= (unsigned long)(get_max_fast ())
//chunk的size大小要小于fastbin的回收范围

检测四

fake chunk的next chunk的大小不能小于2*SIZE_SZ,同时也不能大于av–>system_mem。

1
2
3
4
5
6
7
8
9
10
11
if (have_lock
|| ({ assert (locked == 0);
mutex_lock(&av->mutex);
locked = 1;
chunk_at_offset (p, size)->size <= 2 * SIZE_SZ
|| chunksize (chunk_at_offset (p, size)) >= av->system_mem;
}))
{
errstr = "free(): invalid next size (fast)";
goto errout;
}

检测五

fake chunk对应的fastbin链表头部不能是该fake chunk,即不能构成double free的情况。

总结

house of spirit的主要意思是我们想要控制的区域控制不了,但是它前面和后面都可以控制,所以伪造好数据将它放入fastbin中,后面将该内存区域当作堆块申请出来,致使该区域被当作普通的内存使用,从而使目标区域变成可控的。