由于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漏洞。