看上去是一个经典的菜单题,根据题目名称可以推测是UAF漏洞,于是开始分析程序。
1 | int __cdecl __noreturn main(int argc, const char **argv, const char **envp) |
浏览一遍4个操作,第一直觉认为重点在于show函数存在自定义的函数指针可以利用,并且delete函数中为将堆指针置为NULL:
1 | unsigned int show() |
由于edit不允许修改page[0]的chunk。那么,最开始的想法是修改page[1…]对应的chunk指针,使malloc分配出page。然后便可以修改page中伪造函数指针和sh
参数,实现get shell,见exp的exp2函数。
在本地上确实打通了:

但是在远程服务器出现了malloc corrupt错误。由于无法调试,需要我们尝试换一下思路。
依然还是依靠UAF漏洞。由于delete函数允许对page[0]处的chunk进行free,我们将其释放后,在page[1…]处将其申请出来,那么就可以依靠edit修改page[0]的内容了。
下面是exp的代码,exp1为远程可利用的方法,exp2为本地可利用的方法。虽没有成功,仅当参考。
1 | from pwn import * |