首页
社区
课程
招聘
[原创]how2heap调试学习(二)
发表于: 2020-12-6 12:16 9326

[原创]how2heap调试学习(二)

2020-12-6 12:16
9326

字数限制,分开发了

代码:https://github.com/yichen115/how2heap_zh

代码翻译自 how2heap:https://github.com/shellphish/how2heap

本文语雀文档地址:https://www.yuque.com/hxfqg9/bin/ape5up

每个例子开头都标着测试环境


how2heap调试学习(一)


ubuntu16.04 glibc 2.23

intptr_t *victim = malloc(100);

首先申请了一个在 fastbin 范围内的 victim chunk,然后再在栈上构造了一个假的 chunk

image.png

为了绕过检测,设置 stack_buffer_1 的 bk 指针指向 stack_buffer_2,设置 stack_buffer_2 的 fd 指针指向 stack_buffer_1

image.png

接下来先 malloc 一个防止 free 之后与 top chunk 合并,然后 free 掉 victim,这时候 victim 会被放到 fastbin 中

image.png

接下来再去 malloc 一个 large chunk,会触发 fastbin 的合并,然后放到 unsorted bin 中,这样我们的 victim chunk 就放到了 unsorted bin 中,然后最终被 unsorted bin 分配到 small bin 中

参考:

http://blog.topsec.com.cn/pwn的艺术浅谈(二):linux堆相关/

https://bbs.pediy.com/thread-257742.htm


再把 victim 的 bk 指针改为 stack_buffer_1

image.png

再次去 malloc 会 malloc 到 victim chunk,再一次 malloc 的话就 malloc 到了 0x00007fffffffdcc0

image.png

ubuntu16.04 glibc 2.23

一开始申请 3 个 chunk

image.png

free 掉 p2,这时候 p2 被放到了 unsorted bin 中

image.png

然后把 p2 的 size 改成 0x180,这时候就把 p3 给包含进去了

image.png

然后再去申请一块 0x180 大小的 p4,就能够编辑 p4 就可以修改 p3 的内容,编辑 p3 也可以修改 p4 的内容

image.png

ubuntu16.04 glibc 2.23

首先申请 5 个 chunk,分别是 p1,p2,p3,p4,p5

image.png

然后 free 掉 p4,此时 p2 的 size 是 0x3f0

image.png

更改掉 p2 的 size 为 0x7e0,直接把 p3 给包含进去

image.png

再次去 malloc 0x7e0 大小的 chunk p6 会把包含 p3 的 p2 给申请到,这样再去编辑 p6 的时候也可以编辑到 p3

image.png

ubuntu16.04 glibc 2.23

当我们调用一个相当大的块的时候会用 mmap 来代替 malloc 获取一块单独的内存来替代普通的堆,释放的时候会用 munmap


一开始申请了 3 个 0x100000 大小的

此时的布局大概是这样的

然后把第三个的 size 改成 0x202002,free 掉第三个,然后再去 malloc(0x300000)


新的在 0x7ffff770c010

第三个 0x7ffff780b010 大小 0x202002

第二个 0x7ffff790c010


现在在第三个上是 0x202000 大小的,接下来去申请 0x300000 大小的,因为前面已经有了 0x201000,所以多申请0xFF000 就够了 (0x7ffff780b010-0x7ffff770c010)

image.png

image.png

这样通过对新创建的堆块进行写操作就可以覆盖掉原本第二个那里

image.png

ubuntu16.04 glibc 2.23

一开始申请了两个 chunk

image.png


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//