fastbin attack报错内存损坏

前言

在做off-by-one的Plaiddb的时候研究到最后一步,将one_gagedt写入__malloc_hook的时候包了内存损毁的错误,在星盟安全群里面,各位师傅给了我回答,觉得挺有用的,写下来做个笔记

报错

1
2
3
4
5
6
7
[DEBUG] Received 0x19 bytes:
'PROMPT: Enter data size:\n'
[DEBUG] Sent 0x3 bytes:
'97\n'
[DEBUG] Received 0x53 bytes:
"*** Error in `PlaidDB': malloc(): memory corruption (fast): 0x00007f3d42a5672d ***\n"
Traceback (most recent call last):

这个错误说的是从bins中申请堆块的时候 这个堆块的大小和这条链上的大小不一致

就会报错

1
2
3
4
5
6
7
if (__glibc_likely (victim != NULL))
{
size_t victim_idx = fastbin_index (chunksize (victim));
if (__builtin_expect (victim_idx != idx, 0))
malloc_printerr ("malloc(): memory corruption (fast)");
check_remalloced_chunk (av, victim, nb);

如果victim的大小(fastbin这条链上的第一个堆块)不等于当前fastbin这条链上的大小

就会报memoey corruption的错误,这也就是为什么直接打fastbin attack__malloc_hook申请失败的原因

这里victim是可以被伪造的,这里虽然只对索引进行了判断,但索引也是通过大小得出来的,说到底比较的还是大小

解决办法

当我们直接用fastbin attack的时候会报错,因为do_check_remalloced_chunk函数会检查chunk的NON_MAIN_ARENA,IS_MAPPED,PREV_INUSE位。该函数中的if会判断是否为main_arena管理等

在fastbin中主要检查malloc的chunk的PREV_INUSE位是否为1。因为glibc规定这些chunk的PREV_INUSE位永远为1。

所以我们选取的攻击目标地址的偏移size成员数值的NON_MAIN_ARENA、IS_MAPPED、PREV_INUSE位都要为1,比如当前fastbin所能管理的freechunk大小为0x70~0x80,而伪造的size成员处的数值为0x71、0x72这样的数值不能够符合要求的,但0x7f这样的地址就可以满足需要,因此构造完①之后,攻击目标地址的伪造size成员成员数值的NON_MAIN_ARENA、IS_MAPPED、PREV_INUSE位都要为1,0x7f就可以满足。

于是我们需要在攻击目标地址一定偏移位的数值为0x7f

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
do_check_remalloced_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T s)
{
INTERNAL_SIZE_T sz = chunksize_nomask (p) & ~(PREV_INUSE | NON_MAIN_ARENA);

if (!chunk_is_mmapped (p))
{
assert (av == arena_for_chunk (p));
if (chunk_main_arena (p))
assert (av == &main_arena);
else
assert (av != &main_arena);
}

do_check_inuse_chunk (av, p);

/* Legal size ... */
assert ((sz & MALLOC_ALIGN_MASK) == 0);
assert ((unsigned long) (sz) >= MINSIZE);
/* ... and alignment */
assert (aligned_OK (chunk2rawmem (p)));
/* chunk is less than MINSIZE more than request */
assert ((long) (sz) - (long) (s) >= 0);
assert ((long) (sz) - (long) (s + MINSIZE) < 0);
}

感谢董师傅给的讲解,非常详细。

(66条消息) 堆漏洞挖掘——fastbin attack漏洞_董哥的黑板报的博客-CSDN博客