首先看一下程序保护
保护全开,要么打栈、要么打freehook和mallochook,或者就是打IO。
题目给的libc的2.33版本,该版本freehook和mallochook都可写。最优先选择hook打法,因为代码量最小。
看一下程序逻辑:(部分函数名已经过笔者逆向分析自行编写)
main让我们输一些东西然后进入vuln中分析。
首先定义一个24字节的数组,然后先解析我们的输入,解析后数据放在s中,然后再进入operation函数执行一些东西。
这个函数第一次见是需要逆向分析才能看出逻辑,该函数将我们输入当作http请求包进行解析,解析后数据放在s中用于后续程序执行。
输入数据的格式如下:
首先声明请求包类型,然后是一个请求路径,只要开头为/即可,这个路径没啥用,随便写什么都行,然后后面是http协议版本格式。
下面可选项为一些由:分割的键值对,可以没有。上面每行都需要以\r\n结尾。
最后一行写包内容,结尾不加\r\n。
请求包类型共有以下9种:
解析后的数据s格式如下:
只有前0x18有用,第一个指针存储请求路径,第二个指针为请求包内容content,第三个为表示请求方法的一个标志位,上述9种方法分别对应1~8。
该函数根据解析后的数据来选择执行不同程序逻辑。这里有一个类似http是否已连接的标志,只有连接标志有效,才可以进行其他逻辑,即这里最下面的,需要我们先用DEV请求方法进行连接,需要传入content为rotartsinimda,之后连接标志有效。
其余全部交互均使用POST请求方法,为一个堆的菜单题,有add edit free show四种方法可以用,通过所post的content来决定执行哪种。
content数据格式为使用&分割的多个数据,第一个表示执行哪种操作,后面根据不同的操作为所操作堆块idx、堆块大小、堆块内容等等。
其中delete函数存在UAF漏洞
程序分析结束,最大的洞是UAF。攻击思路如下:
1、首先add再free得到一个Unsorted bin,然后show泄露main_arena地址进而得到libc地址。
2、由于2.33版本libc的tcache指针存在加密,则需要泄露堆地址,UAF直接tcache show一下就行,需要手动编写一下堆指针加解密操作。其实就是一个错位异或。
3、tcache attack改写free hook为system
4、free一个内容为/bin/sh的堆块即可getshell
完整exp如下:
脚本执行结果:
成功getshell。
By Del0n1x
Keyboard