(68条消息) [pwn]堆:fastbin attack 详解_breezeO_o 的博客-CSDN 博客
(68条消息) [BUUCTF]PWN——babyheap_0ctf_2017_Angel~Yan 的博客-CSDN 博客
(主要是对上面两个 writeup 的补充和思路的整理)
这道题主要分为两个步骤
- 泄露 libc 地址
- 修改 malloc_hook 为 onegadget
为什么我们需要泄露 libc 地址呢,因为我们需要知道 malloc_hook 的地址。而 malloc_hook 是一个 libc 上的函数指针,调用 malloc 时如果该指针不为空则执行它指向的函数,可以通过将 mall_hook 指向一个 onegadget 来 getshell。
泄露 libc
首先我们申请四个 chunk,编号 0、1、2、3。(实际大小应该还加上 presize 的 8 个字节)
alloc(0x18) #0
alloc(0x68) #1
alloc(0x68) #2
alloc(0x18) #3
然后,我们通过溢出 0 号 chunk 来修改 1 号 chunk 的大小(因为 1 号 chunk 的指针指不到自己的 size 的位置),将其修改为 chunk 1+chunk2 的大小。
然后 free (1),因为此时 1 号 chunk 的大小是 0xe0,所以会放到 unsortbin 链表。
我们为啥要让 1 和 2 chunk 作为一个 chunk 释放呢。因为 unsortbin 有一个特性,就是如果 usortbin 只有一个 bin ,它的 fd 和 bk 指针会指向同一个地址 (unsorted bin 链表的头部),这个地址为 main_arena + 0 x 58 ,而且 main_arena 又相对 libc 固定偏移 0 x 3 c 4 b 20 ,所以得到这个 fd 的值,然后减去 0 x 58 再减去 main_arena 相对于 libc 的固定偏移,即得到 libc 的基地址。
所以我们要想方设法得到这个 fd 的值,但是我们对 chunk 释放后,指针也就失效了,读不到此时挂在 unsortbin 链表上 chunk 的内容。
所以我们让 chunk 1 和 2 堆叠释放,此时 unsortbin 链表上挂了一个大小为 0xe0 的 chunk,然后我们 alloc (0x68),此时系统会将0xe0 的 chunk 分割,将0x68 分配,而剩下的0x68 大小的 chunk 就是我们之前 alloc 的 chunk 2,此时我们将 chunk 2 打印便可以得到 fd,也就得到 libc 的基址。
修改 malloc_hook 为 onegadget
大体思路是我们修改挂在 fastbin 链上的空闲 chunk 的 fb,让它指向 malloc_hook 所在的地址区域,让它以为自己后面还挂着一个空闲 chunk。我们将这个伪造的 fake chunk 申请到,我们就可以对其进行编辑了,也就是说可以对 malloc_hook 所在的地址区域进行编辑,那么就把 malloc_hook 的地方写入 onegadget。大功告成。
这里有个小细节,我们伪造的 fake chunk 的大小要符合 fastbin 链表的大小要求,所以在 malloc_hook 所在的地址区域要找一个值满足 fastbin 大小的地址才可以。
文章详细介绍了如何利用FastbinAttack来泄露libc地址,并进一步修改malloc_hook为onegadget,以实现代码执行。首先,通过特定的内存分配和释放策略泄露libc基地址,然后通过伪造chunk来修改malloc_hook,最终达到getshell的目的。

被折叠的 条评论
为什么被折叠?



