-
-
#30天写作挑战#PWN学习:堆利用-House Of Force
-
发表于:
2020-9-17 09:08
15959
-
#30天写作挑战#PWN学习:堆利用-House Of Force
翻译自 how2heap 的例子
https://github.com/shellphish/how2heap
首先申请了 0x100 大小的 chunk,现在的内存布局如下
修改 top chunk 的 size 为一个很大的数
当我们去申请的时候,新的 top chunk 的地址 new_top 应该是 old_top + size(size 是 malloc 的 chunk 的大小加上 chunk 头的大小),我们想要去控制 new_top 就只能通过控制这个 size
我们想要让 new_top 到 0x602060,0x602060-0x20 =old_top + size,所以这个 size 应该是 0x602040-old_top=0xffffef30 即 0xffffffffffffef30,也就是说只要申请 0xffffffffffffef30 大小的 chunk 就能把 top chunk 改到0x602060-0x10,然后再申请一个的时候就是 0x602060 了
为啥减去了0x20 呐?
我们想要申请到 0x602060 的时候要留出它的 chunk 头 0x10 这就是说 0x602060-0x10 = old_top+size,即 size = 0x602060-0x10 - old_top,但是还要注意,我们去申请 size 的时候实际上申请的是 size+0x10 大小的 chunk,还要把这个 0x10 留出来,即我们要少申请 0x10 大小的 size
所以 size = 0x602060-0x10 - old_top -0x10,减的一共是 0x20
这之后再去申请一个 chunk 就能控制前面定义的变量了
因为程序一开始会申请一个堆块,存放 hello 和 goodbye 的函数指针,所以思路是把内存申请的那里,然后修改 goodbye 指针为 magic
先申请一个,然后通过编辑一个更大的 size 把 top chunk 给改掉
想要修改那个指针就需要 malloc 申请到 topchunk - 0x60 也就是 0x603000 那里,另外还要减去 0x10 我们申请的那个 size 的 chunk 头的大小
改后:
可以读到 flag,wp 减的 0x8 跟 0xf 不懂为啥,按照上面原理那样去做是可以达到目的的 Orz...
完整 exp
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-9-17 09:11
被yichen115编辑
,原因: 上传附件