fastbin_dup_into_stack log
Posted wangziqiang123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fastbin_dup_into_stack log相关的知识,希望对你有一定的参考价值。
how2heap大礼包,逐个拆解分析。按字母序,第二个拆fastbin_dup_into_stack。
如果对fastbin不熟悉,请先阅读fastbin_dup.log篇。
Code
1 | int () |
Environment
Ubuntu x64 glibc-2.23
gdb调试,b printf
Trace
C代码中的非格式化的printf会被编译器优化成puts。所以第一次断在程序中的第二个printf处。finish返回:
stack_var想要作为伪造chunk的curSize(3 flag bits),64位环境长度为8字节,所以精心构造malloc返回的地方应该是(char*)stack_var+8的地方。stack_var根据chunk的尺寸,伪造成21(其实对于fastbin来说,20也行,但21是字面意义上最正确的)。
经过3次malloc,此时的chunk:
经过3次free:
此时fastbin->0x603410(chunk a)->0x603430(chunk b)->0x603410(chunk a)->…
第一次malloc,指针d指向的就是chunk a的Alloc域,也就是0x603420:
第二次malloc分配原本的chunk b,不关心。
第三次malloc分配之前,我们要先改掉d指向的区域,也就是下一次要分配到的原本的chunk a的fd指针,改成指向栈空间的(char*)stack_var-16的地址,这里16是preSize+curSize的大小。
执行第三次malloc之前:
可以看到此时我们已在待分配的chunk上设置了fd指针指向0x7fffffffde28:
第三次malloc分配的依然是chunk a,但此时由于改动了chunk a的fd指针,导致原本的fastbin循环链被破坏,分配之后,fastbin不再指向chunk b,而指向了伪造的chunk,即0x7fffffffde28。
第四次malloc,分配的就是伪造的chunk:
常见的还有将chunk伪造在.bss段上,利用思路是一样的,关键在于对fastbin chunk的理解。
原文:大专栏 fastbin_dup_into_stack log
以上是关于fastbin_dup_into_stack log的主要内容,如果未能解决你的问题,请参考以下文章