这是一个简单的缓冲区溢出的漏洞,今天没事,来分析一下看看他溢出的原因,最后通过平衡堆栈的方式,让目标程序执行shellcode使程序不crash。只是用来研究和学习。
FTPShell Client 5.24
下载地址:
https://pan.baidu.com/s/1IHOfx0IQQOpuTs55f-T-aQ
密码:qvo4
IDA 6.8
winxp sp3 32位虚拟机
1、起一个ftp服务器,打开21端口。
2、等待客户端连接后,向客户方发送PWD的数据
3、ftp客户端收到服务器发送的PWD数据后,会crash
这个call的主要功能键就是读取服务器发送来的数据到buffer
进入read_server_string_to_buffer这个call,我们看看分配栈的大小为0x408
没有做长度限制,这个地方只要大于0x408个字符,就会把堆栈覆盖
eax = 0,读取成功
eax = 1,读取失败
这里我们需要保持读取成功的状态才可以
我在这里用的是user32.dll,地址为:0x77d4e56b 你可以根据自己的系统自己选择kernel32.dll或者其他
由于这是在没有开启dep保护的情况下进行的测试攻击,所以自己写的代码是可以直接在堆栈运行的。
如果在dep保护模式下进行攻击的话,shellcode的代码就需要通过rop链来进行维护,然后运行。
这里我使用msfvenom -p windows/shell_bind_tcp LPORT=8848 -f c 生成shellcode,等待连接端口
运行server,然后用ftp连接,是客户端程序crash了。
然后使用nmap 扫描目标机器,发现目标机器8848端口已经打开,
用nc连接进入了一个consle窗口
做事要有始有终,虽然程序crash了,但是我们不需要让程序crash,要不然就被用户知道了,就会更新版本,或者重装软件,所以我们的宗旨是让用户快乐的用这带后门的程序。
因为栈的数据被覆盖程序crash
由于返回地址被覆盖,所以我们需要修复堆栈,让程序可以找到自己的返回位置,那么程序就不会crash了,在shellcode代码运行完成后,我们加入以下平衡堆栈的代码,就不会crash了
再次测试,运行完自己的shellcode,后门已经开了,程序依然还在运行,收工 :)
*本文作者:yearnwang,转载请注明来自FreeBuf.COM