由于 Pwn 的堆方向感觉异常抽象,所以,我想着通过 how2heap 这个项目来入门 heap。但是,由于有的程序不知为何调试总是出问题,不过,我会慢慢来解决的,所以这个文章也是处于慢慢更新的状态。
glibc 版本:最新
源码:
1 |
|
编译一下: gcc -g first_fit.c
运行一下看看
1 | g01den@MSI:~/Temp$ ./heap |
开始调试:
首先,最开始,在第一次 malloc 分配内存之前,使用 vmmap 查看内存布局:
1 | vmmap |
明显,这里不存在 heap 段,进行 malloc 之后,发现多出来了个 heap 段:
1 | vmmap |
先查看下 chunk 有些啥?
1 | pwndbg> heap |
根据下面两个输出:
1 | 第一个 a = malloc(0x512) 在: 0x5555555592a0 |
可以看出来,上面那个 heap 结构中,第二个为 a 所在地址,第三个为 b 所在地址,为啥上下看到的地址不同,这个主要是和 malloc 函数返回指针的地址有关,这个这儿就不细说了。
在把 AAAAAAAA 这个字符串写入 a 中,我们看看 a 的内存布局:
1 | pwndbg> x/10gx 0x555555559290 |
可以看出来,已经成功写入了,先 free 掉 a,之后 malloc 一个比 a 小一点的,把这个地址赋给 c,可以看出,输出的时候发现 a 原本的地址和 c 的地址相等:
1 | #第一个 a = malloc(0x512) 在: 0x5555555592a0 |
之后将 CCCCCCCC 写入 c 的地址,之后通过 a 和 c 输出试试看:
1 | 第三次申请的 c 0x5555555592a0 指向 CCCCCCCC |
当释放了一块内存之后再去申请一个大小略小的空间,那么 glibc 倾向于将先前释放的空间重新分配,由于 a 的指针没有被置零,这就造成了可以直接通过 a 来访问已经 free 掉的 chunk 和重新分配好的略小的 chunk,由此,造成了 UAF 漏洞。