适合读者:入侵爱好者、漏洞分析员
前置知识:SoftICE、Ollydbg基本使用方法、基本汇编语法
WTF:黑防11期推出了ISNO发现的Ccproxy远程溢出漏洞,受到了很多朋友的关注,EXP也广泛的流传着。很多菜鸟朋友们感受到了漏洞的乐趣,都争先恐后的想学习漏洞发现、编写技术,
适合读者:入侵爱好者、漏洞分析员
前置知识:SoftICE、Ollydbg基本使用方法、基本汇编语法
WTF:黑防11期推出了ISNO发现的Ccproxy远程溢出漏洞,受到了很多朋友的关注,EXP也广泛的流传着。很多菜鸟朋友们感受到了漏洞的乐趣,都争先恐后的想学习漏洞发现、编写技术,让自己也过过黑客瘾。本文就是利用我们原来刊登的《菜鸟版Exploit编写指南》系列文章中所讲到的技术,围绕如何发现并分析溢出漏洞而讲的,希望更多的新手能掌握这样的分析方法,全都成为分析漏洞的高手!
“菜鸟版Exploit编写指南”之八:
采众家之长分析及改进Cmail漏洞
文/图LoveMelody
看了ISNO大虾的《我是如何发现CCProxy漏洞的》,心里痒痒的,也想按照ISNO大虾介绍的方法,依葫芦画瓢的分析分析一个漏洞。分析什么漏洞呢?
F.Zh在《菜鸟版Exploit编写指南》的开山之作中,详细讲解了Cmail Server漏洞的利用过程,让我这样的菜鸟受益匪浅,以后屡用其法。但F.Zh在文章的最后,留下了一句话:“定位,如果是固定长度的话,确实可以通过两次溢出定位,但实际上这个是和安装的路径有关的,还有没有好一点的方法来定位呢?”
什么意思我不大明白,F.Zh也没有再说下去,那我们就尝试分析Cmail Server 吧,看看为什么覆盖那么长的字符串正好实现溢出;也看看能不能解决F.Zh说的不定长问题;当然,更重要的,是复习总结下ISNO和F.Zh介绍的方法,并改进改进,让它更适合我们菜鸟使用。字符串长度过长
分析
安装好一个CmailServer 4.00beta1,应该有漏洞吧,如图1所示。
图1
验证一下,进入DOS控制台,在窗口下输入Telnet 127.0.0.1 110,其中110是POP3协议所用端口,然后输入USER和一长串的a,接着回车。如图2所示。
图2
弹出出错对话框了。XP下的出错对话框和2000不同,没有直接给出报错点,
如图3所示。
图3
怎么办?我们不能看到执行的地址了吗?不,还是有办法的。点击对话框中蓝的字“请单击此处”,系统就会给出详细的出错报告数据了。Offset:61616161,表示执行0x61616161这个地址时出现了错误。0x61就是小写的a,就是我们输入的USER中的数据,因为0x61616161地址非法,所以出错,这下XP下的定位和2000一样方便了。如图4所示。
图4
好了,到了使用ISNO方法分析漏洞的时候了。重新启动Cmail,打开SoftICE,然后再发送超长的字符串。这下SoftICE捕获异常,弹了出来,停留在这句。
001B :61616161 FFFF INVALID
意思是61616161指向的指令非法。再看看上下左右相关的数据吧,输入Data 命令,会出现一个数据窗
口,然后输入d EIP,就会在数据窗口中显示出如下的值。”
001B : 61616161????????????
001B : 61616171????????????
上下左右的数据都是非法的,因为没有代码加载在这个部分,所以系统默认填充1,就是全F。原EIP和堆栈,都已经被我们过长的数据覆盖,现在无法从现今的堆栈中,到问题代码的位置。
小知识:SoftICE默认情况下,是开了异常捕获功能的,即有什么异常发生时,会自动激活SoftICE,我们可以使用指令Fault on和Fault off来打开或关闭异常捕获功能。
使用ISNO的方法,记下这个时候ESP的值,ESP =02AE841C,即某个函数在02AE841C附近保存了返回地址,而在函数执行的过程中,保存的返回地址被我们超长字符串覆盖,从而返回时去执行非法的0x61616161。现在的关键就是到这个在02AE841C附近保存地址的函数。
退出SoftICE,重新启动Cmail,CTRL+D呼出SoftICE,输入Addr CmailServer 进入Cmail程序的地址空间,然后下一个ISNO介绍的经典断点:bpmw 02AE841C w。意思就是当往地址02AE841C进行写操作的时候,中断下来。如果一个函数,在地址02AE841C中保存返回地址,也是一个写操作,也会被中断,我们就可以到是那个函数出现了字符串的覆盖。
回到程序空间,再运行攻击代码,果然有写操作时,SoftICE中断弹了出来。经过了几次中断,到达了下面这句指令。
00415A61:call 004049E0
此时ESP = 02AE841C,就是004049E0这个函数,把返回地址保存在
02AE841C-4=02AE8418中。如果按F8执行,马上就会弹到001B:61616161 FFFF INVALID中去,而ESP会恢复成02AE841C,我们到了被覆盖返回地址的函数004049E0!
ISNO大虾的方法就是好,按着方法一步步的做,就成功了,大家也试试吧。到了出问题函数后,再用Ollydbg来看004049E0处的函数。
重新启动挂掉的Cmail,用Ollydbg附加上Cmail进程,然后Ctrl+G输入地址004049E0,就可以看到如下的代码,如图5所示。
图5
直接看反汇编代码,头看裂了都看不出什么名堂来,还是动态执行,边走边看。在004049E0设一个断点,然后再运行我们的攻击程序。执行到004049E0 sub esp, 220h时,Ollydbg就会中断下来。按F8继续单步执行,在执行的时候注意查看每次调用的参数值。
00404A72 55 PUSH EBP
在内存窗口中CTRL+G然后输入EBP,发现EBP对应的是我们输入的aaaaaaaaaa……超长字符串!直觉感到马上水落石出了。下一句是:00404A73 PUSH CMailSer.004F9640
004F9640地址是什么呢?在内存窗口中查看004F9640,是“F:\Study\课堂讲义\投稿\heifang\CMail漏洞分析”,晕,是我机器上Cmail的安装路径,早知道选个漂亮点的安装位置,免得象现在这样丢脸。算了,还是继续吧:00404A7C PUSH CMailSer.00474498;
压入的00474498内容是“%s\mail\%s”,格式化串!看来就是作拷贝了。最后压入EAX,call一个字符串拷贝程序:
00404A81 50 PUSH EAX
00404A82 E8 18730200 CALL CMailSer.0042BD9F
明白了,调用这个函数,就大概相当于执行:
sprintf ( EAX,
"%s\mail\%s",
F:\Study\课堂讲义\投稿\heifang\CMail漏洞分析
aaa aaaaaaaaa……)
EAX中拷贝Cmail安装路径+\mail\+我们发送的USER名字,因为没有长度检查,所以导致了溢出!怪不说F.Zh说溢出点和安装路径有关,因为覆盖的字符串中,包含有Cmail的安装路径。
保存返回地址的ESP =0x02AE8418;存放字符串的起始地址EAX =
02AE81F8,那么从EAX到ESP需要的字符串长度为:0x02AE8418-0x02AE81F8
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论