漏洞是一个栈溢出
其中的sub_40063D内部有个read(),读入了0xC80个字节的数据,V1是bp-40h明显栈溢出
然后就可以考虑构造rop,lib泄露,调用system
关于lib泄露:
在程序的FUNTION中找到一个系统函数,这道题就用了puts,记下它在.got.plt中的地址为之后的rop构造做准备。
此题的目标是替换bp后的return地址为指令pop_rdi_ret,在二进制文件中查找该指令,可以运用ROPgadget-master库
具体代码是:
在ROPgadget-master目录下,运行Python ROPgadget.py –binary filename
运行结果为:
找到其中pop redi;ret的地址为0x0000000000400762
pop redi;ret;的目的是将栈中下一个内容存放在rdi中,然后调用输出函数,把栈中下一个内容输出。
故下一步为将栈中下一个内容替换为puts函数的系统地址的存放地址,刚刚查找过的0x0000000000601018。
将再下一个地址替换为puts地址,即输出puts在目标系统中的地址。(这个地址是动态的,只有最后3位是不变的)
综上,可以写出以下的python脚本:
完成了lib泄露的步骤。
然后就是找shell code了。利用找到的后三位,使用库libc-database,可以找到该系统shell的地址。
具体代码如下:
找到了库名,然后:
找到了系统的函数地址。然后就好说了,再栈溢出一次就OK,所以接下来的代码是:
要注意的是函数的地址得加上偏移量。(由于写笔记时服务器已经关闭,所以函数地址有所出入)