-
-
[原创]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
每个例子开头都标着测试环境
ubuntu16.04 glibc 2.23
intptr_t *victim = malloc(100);
首先申请了一个在 fastbin 范围内的 victim chunk,然后再在栈上构造了一个假的 chunk
为了绕过检测,设置 stack_buffer_1 的 bk 指针指向 stack_buffer_2,设置 stack_buffer_2 的 fd 指针指向 stack_buffer_1
接下来先 malloc 一个防止 free 之后与 top chunk 合并,然后 free 掉 victim,这时候 victim 会被放到 fastbin 中
接下来再去 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
再次去 malloc 会 malloc 到 victim chunk,再一次 malloc 的话就 malloc 到了 0x00007fffffffdcc0
ubuntu16.04 glibc 2.23
一开始申请 3 个 chunk
free 掉 p2,这时候 p2 被放到了 unsorted bin 中
然后把 p2 的 size 改成 0x180,这时候就把 p3 给包含进去了
然后再去申请一块 0x180 大小的 p4,就能够编辑 p4 就可以修改 p3 的内容,编辑 p3 也可以修改 p4 的内容
ubuntu16.04 glibc 2.23
首先申请 5 个 chunk,分别是 p1,p2,p3,p4,p5
然后 free 掉 p4,此时 p2 的 size 是 0x3f0
更改掉 p2 的 size 为 0x7e0,直接把 p3 给包含进去
再次去 malloc 0x7e0 大小的 chunk p6 会把包含 p3 的 p2 给申请到,这样再去编辑 p6 的时候也可以编辑到 p3
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)
这样通过对新创建的堆块进行写操作就可以覆盖掉原本第二个那里
ubuntu16.04 glibc 2.23
一开始申请了两个 chunk
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- 对某款智能手表的分析与攻击 6429
- [原创][车联网安全]使用STM32开发板实战汽车UDS诊断 15012
- [分享]binwalk路径穿越导致RCE(CVE-2022-4510) 9980
- [原创]Hack-A-Sat 2020预选赛 beckley 13583
- [原创]一个BLE智能手环的分析 31542