今年国赛初赛的一道pwn,感觉其实今年国赛初赛比去年的难度要高不少,当时赛场上5道做了3道,今天先更新这个比较常规的堆题吧。
看题目名字其实就猜到跟house of orange 有点关系可能。
首先我们看一下保护吧
保护全开。附件给了libc,版本是2.23,算是堆题中版本比较低的了,没有tcache,保护全开的情况下有限考虑malloc hook而且没有tcache估计要配合fastbin attack了。
看下main
经典的菜单题目
menu里面增查删改编辑全都有,还挺全的,标准的orange应该是没有free的,有点奇怪,继续一个一个函数看:
add函数允许我们控制malloc分配的堆块大小,最大为0x1000,size和堆指针分别由global_size和ptr两个全局变量保存,因为不是数组用来存储各个堆块size和指针,所以相当于我们“手里”同时只有一个堆块可以被操作。后面的新的堆块add进来就会覆盖ptr指针我们就操作不了以前的堆块了。
show函数直接打印ptr中的内容,只给我们一次机会show,应该就是泄露地址用的了。没啥问题。
delete函数只给了一次机会free,用了之后就相当于没有free了,这里free之后没有清空ptr指针,存在UAF。那看来可能还是要走orange,相当于泄露libc可以走top chunk->unsorted bin 这一套,把这一次free留下来在别处用。
edit函数可以溢出8字节堆块上的数据。
分析到这我们理一下攻击思路:
1、由于堆块大小可控,我们可以走orange,溢出top chunk 的size来制造一个unsorted bin,然后用这一次show得到libc地址。
2、之后用这一次free的UAF来打fastbin attack,伪造malloc hook附近的fake fast chunk,因为malloc hook附近有很多0x7f的libc地址,所以通常我们都能找到size为0x70的fake fast chunk,之后申请到malloc hook的堆块直接修改其为one_gadget即可。
完整exp 如下:
脚本攻击结果:
算是比较常规的堆题了。
By Del0n1x
Keyboard
雪人计算机辅助翻译 2024-05-09
二次元的Datawhale 2024-04-25