适用libc版本:2.23、2.27
思路
利用溢出修改top chunk的size为-1,在malloc时-1转换为无符号数后输入负数也基本能通过,控制top chunk指针的向前向后移动实现任意地址写。
利用条件
- 存在堆溢出,可以修改top chunk的size
- 未对malloc的size做大小过滤
- 泄露堆地址(如果仅是top chunk地址的相对偏移地址写不需要)
例题

menu:

show:

add:read的第三个参数v2由有符号数转为无符号数,存在任意长度溢出

edit:edit没做new length检查,基本无条件的任意长度溢出

delete:

存在后门函数

因为goodbye_message函数在exit时会执行,同时又是初始化时malloc存储在v4[1]的地址,满足top chunk的相对偏移条件,不需要泄露堆地址。整体思路就是edit覆盖top chunk的size,控制top chunk地址到v4[1],然后create覆盖v4[1]内容为后门函数地址,最后exit触发。
Tips
如何计算控制top chunk移动的offset?

对于图中内存,0x1391a2c0是top chunk的地址,希望向前移动到0x1391a250。
由0x1391a2c0-0x1391a250=0x70,此时需要top chunk地址向前移动0x70,而malloc申请内存空间时会附带上chunk头以及进行内存对齐,所以需要malloc(-0x80)。
对于向后移动,假设target_addr=0x200,topchunk_addr=0x100,此时应malloc((0x200-0x100)-0x10),即malloc(0x90)。

Comments NOTHING