提问人:MyUsername112358 提问时间:7/4/2017 最后编辑:trincotMyUsername112358 更新时间:8/15/2021 访问量:847
堆漏洞利用失败:内存损坏
Heap exploit fails: Memory corruption
问:
目前正在学习堆开发,但有一些奇怪的我不明白:
这是通过调用 malloc(0x80) 分配的下一个块:
0x602090: 0x0000000000000000 0x0000000000000091
0x6020a0: 0x00007ffff7dd1b78 0x0000000000601120
...
在此之后调用另一个 malloc(0x80),我的目标是回到0x601130。这可行,但前提是 0x601128 == 0x90:
0x601120: 0x0000000000602010 0x0000000000000090
0x601130: 0x0000000000602130 0x00000000006021c0
如果我将 90 更改为任何其他值,我会得到内存损坏:
*** Error in `censored': malloc(): memory corruption: 0x00000000006021d0 **
...
#0 0x00007ffff7a42428 in __GI_raise (sig=sig@entry=0x6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1 0x00007ffff7a4402a in __GI_abort () at abort.c:89
#2 0x00007ffff7a847ea in __libc_message (do_abort=0x2, fmt=fmt@entry=0x7ffff7b9de98 "*** Error in `%s': %s: 0x%s ***\n")
at ../sysdeps/posix/libc_fatal.c:175
#3 0x00007ffff7a8f13e in malloc_printerr (ar_ptr=0x7ffff7dd1b20 <main_arena>, ptr=0x6021d0,
str=0x7ffff7b9acff "malloc(): memory corruption", action=<optimized out>) at malloc.c:5006
#4 _int_malloc (av=av@entry=0x7ffff7dd1b20 <main_arena>, bytes=bytes@entry=0x80) at malloc.c:3474
以下是 GLIBC_2.2.5 中位于 malloc:3474 的代码:
bck = victim->bk;
if (__builtin_expect (chunksize_nomask (victim) <= 2 * SIZE_SZ, 0)
|| __builtin_expect (chunksize_nomask (victim)
> av->system_mem, 0))
malloc_printerr (check_action, "malloc(): memory corruption",
chunk2mem (victim), av);
size = chunksize (victim);
现在,根据我所读到的内容和我对这段代码的理解,受害者的块大小应该大于 2 * SIZE_SZ(因此大于 16 位的 64 字节)并且小于 av->system_mem。这里 av->system_mem 等于:
gdb-peda$ p av->system_mem
$1 = 0x21000
因此,我希望 0x10 和 0x21000 之间的任何值都能通过该检查。为什么不呢?
答: 暂无答案
评论
0x00000000006021d0
mchunkptr
0x602090
mchunkptr
0x602090
0x00000000006020a0