-
-
[原创]#30天写作挑战#PWN:House Of Einherjar学习
-
发表于: 2020-9-14 08:17 15415
-
用 how2heap 的例子看一下
参考:http://blog.topsec.com.cn/pwn的艺术浅谈(二):linux堆相关/
上面文字基本表达完了,但还是调试着看一下叭
首先申请了一个 chunk a,然后在栈上伪造了一个 chunk,为了绕过 unlink 的检查,先把 fd、bk、fd_nextsize、bk_nextsize 直接写成我们 fake_chunk 的地址
然后申请一个 chunk b,因为前面申请的 chunk 的大小是 0x38,所以 chunk a 共用了 chunk b 的 chunk 头的 0x8,也就是说我们写 chunk a 的最后 0x8 字节可以直接更改掉 chunk b 的 prev_size,这里为了让他能找到我们的 fake chunk,所以用 chunk b 的地址减去 fake chunk 的地址,0x603040-0x7fffffffdca0=0xffff8000006053a0
同时假设存在一个 off by null 的漏洞,可以更改掉 chunk b 的 prev_inuse 为 0
然后我们释放掉 b,这时候 b 因为与 top chunk 挨着,会跟 top chunk 合并,然后因为 prev_inuse 是 0,所以会根据 prev_size 去找前面的 free chunk,然而 prev_size 被我们改了,他去找的时候找到的是 fake chunk,然后两个合并,新的 top chunk 起点就成了 fake chunk,再次分配的时候就会分配到 fake chunk 那里了
ps.按照这个道理 d = malloc(0x200)
这行代码还没执行的时候,p main_arena
应该看到 top 被改成了 fake chunk 地址的,但是调试的时候显示的是 chunk b 的地址,然而 malloc 之后才显示 top 为 fake chunk 的地址,然而此时 d 的地址已经是在 fake chunk 那里了,不知道为啥
再深入理解为啥会跟 top chunk 合并之类这些问题大概要把 libc 的源码看一下才能理解,等以后吧 Orz
参考:https://xz.aliyun.com/t/6556
在 read 的时候有一个 off by null
程序在 0x602140 这里记录了申请的 chunk 的 size 与指针
首先需要泄漏 libc 的地址
先申请几个,然后释放掉两个,用来获取 unsorted bin 的地址和 heap 的地址(chunk3 的 fd 指针)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- 对某款智能手表的分析与攻击 6436
- [原创][车联网安全]使用STM32开发板实战汽车UDS诊断 15013
- [分享]binwalk路径穿越导致RCE(CVE-2022-4510) 9980
- [原创]Hack-A-Sat 2020预选赛 beckley 13583
- [原创]一个BLE智能手环的分析 31543