首先看一下程序保护
32位程序,got表可写,无pie。考虑写got表
main函数看一下,是经典的菜单题,值得注意的一点是本题目交互需要使用cjson格式。
add函数最多申请7个堆块其中参数a3解引用值作为地址存储scanf存储堆块size,heap和length全局数组分别用于存储堆块指针和size大小。
漏洞出现在此处,main中读入json的时候有栈溢出,可以覆盖v13,而v13后续作为参数传入add,则v13的值将会被当作地址,在add时通过scanf读入size,进而导致了任意地址写漏洞,结合程序没有pie保护,直接任意地址写修改heap指针即可实现任意地址读写。
delete函数正常清零,没UAF。
用于实现任意地址读。
edit函数只能编辑前8字节
本题目攻击思路为,首先任意地址写,在heap中写入free的got表地址,以便用show泄露libc,再次利用任意地址写,覆写free的got表内容为system地址,free内容为/bin/sh的堆块即可getshell。
值得注意的是,笔者在尝试写入system地址时,发现json处理不可见字符可能会有问题,经测试发现一次写入三字节是ok的,最后分两次写入system地址即可。
完整exp如下:
脚本执行结果
By Del0n1x
Keyboard