CVE-2010-3333漏洞调试、分析(——适合新手入门)

2013-12-23 17:30:10 68 5551 3


这是第二次在tools发帖,为了响应管理猿的号召,也为了爱好应用程序安全新手的需要。在此,我初步研究了一下微软3333漏洞的成因,并试着定位到了样本中的shellcode,现在就对这个入门级的漏洞做个简单的分析:
  首先,我们还是用OD加载word.exe程序,按F9运行。如图:
  

  

图(一)


  接下来,我们要具体分析3333漏洞出现的成因(具体的可以百度)。经过查询,我们知道导致3333漏洞的原因,是因为漏洞产生在MSO.DLL文件中,下文以Microsoft Office2003的MSO.DLL(版本号为:11.0.5606.0)为例。我们将样本拖入运行的word中,如图:
  

  

图(二)


  
  此时,先别急着打开!我们回到OD中,按下ALT+E,看看此时word加载了哪些模块。
  

  

图(三)


  
  我们看到,mso.dll(也就是导致3333漏洞的文件)已经被OD加载进来。我们双击mso.dll,并同时按下ctrl+A,让OD对mso.dll进行分析。等OD分析完成后,如图:
  

  

图(四)


  根据我们百度的结果(链接:http://wenku.baidu.com/link?url= ... MWivTpjMpcY1kS9rI87)可知,函数在处理pFragments属性的值时,未严格检查属性值所占用的空间大小,导致memcpy函数在复制属性值时溢出堆栈。
     在此,我们选用“mov  bx , 5000000”这句指令,来定位处理pFragments属性值的函数(当然这种定位方式,是在已知漏洞位置的情况下。在调试0day时,因为我们不知道具体的漏洞点,此种方法便显得无能为力。在这种情况下我们可以通过定位WINEXEC函数的来定位shellcode,从而调试、定位出具体漏洞点.........其实分析0day是个很复杂过程,这个话题我们以后在讨论)。如图:
  

  

图(五)


  我们在“mov bx , 5000000”下好断点后,就可以点击刚才word弹出的是否打开对话框(图二中对话框),选择“打开”。如图:
  

  

图(六)


  此时我们看到EIP寄存器断在了“mov bx , 5000000”指令处。通过之前百度到资料,我们知道导致栈溢出的函数位于:30F4CC93处的 call dword ptr ds:[eax+0xlc] 函数,我们单步F7跟进来,如图:
  

  

图(七)


  我们通过对百度结果的分析,可知:当执行完“rep movs dword ptr es:[edi],dword ptr ds:[esi]”栈中的数据就会产生溢出(此时,我还未执行这句指令),现在我们看看未溢出时栈空间的情况:
  

  

图(八)


  接下来,我们执行一下“rep movs dword ptr es:[edi],dword ptr ds:[esi]”这句指令,看看栈中的变化,如图:
  

  

图(九)


  注意:请读者自行比较图(八)与图(九)的区别。
  接下来就是执行shellcode了,至此我们将这个3333漏洞用OD分析完了。如果要想从全局了解3333漏洞的成因,全面的掌握3333漏洞的情况,还得借助IDA分析工具(可谓是反汇编的利器),至于对shellcode的分析和编写在此就不叙述了。
  最后,想跟大家分享一句心得:我们研究漏洞的目的不是为了去搞破坏,而是更好完善网络安全,更好的服务他人。

关于作者

评论68次

要评论?请先  登录  或  注册
  • TOP1
    2013-12-24 14:22

    @007007先鼓励下再接着说:1、分析一个漏洞的成因,不是只是再现。我觉得真正的成因其实你没有找到,应该是在处理什么功能的时候,调用了哪个函数,然后又调用了哪个函数,再调用哪个函数……最后在哪里产生溢出,这个溢出是否特殊,如何可以触发,触发的条件是什么,shellcode有没有特殊要求。2、一般找溢出点我自己以前是这样弄的:触发溢出,在处理seh的那个handler的api函数上下断点,中断后根据seh链逐级往上走,最终走如代码空间就找到了。当然有时也会对堆栈的一个地址下写中断,中断后直接就找到点了。3、其实找触发,在现触发这些都不难。难的是处理各种特殊环境的情况,如何让你的shellcode避开这些特殊环境,如何避开操作系统的各类安全机制。

  • 68楼
    7 天前 18:41

    二进制菜鸟学习到了

  • 67楼
    2018-5-31 09:40
    loversorry

    @007007先鼓励下再接着说:1、分析一个漏洞的成因,不是只是再现。我觉得真正的成因其实你没有找到,应该是在处理什么功能的时候,调用了哪个函数,然后又调用了哪个函数,再调用哪个函数……最后在哪里产生溢出,这个溢出是否特殊,如何可以触发,触发的条件是什么,shellcode有没有特殊要求。2、一般找溢出点我自己以前是这样弄的:触发溢出,在处理seh的那个handler的api函数上下断点,中断后根据seh链逐级往上走,最终走如代码空间就找到了。当然有时也会对堆栈的一个地址下写中断,中断后直接就找到点了。3、其实找触发,在现触发这些都不难。难的是处理各种特殊环境的情况,如何让你的shellcode避开这些特殊环境,如何避开操作系统的各类安全机制。

    1

    按照这个思路写文章会比较容易理解详细。!套路很赞。

  • 66楼
    2017-11-20 13:13

    谢谢楼主分享,本人小菜鸟儿,过来学习,支持

  • 65楼
    2017-10-17 21:35

    可以很厉害很厉害1

  • 64楼
    2017-6-26 15:11

    贊66666666666666

  • 63楼
    2017-6-18 16:24

    多来点二进制漏洞教程吧

  • 62楼
    2017-3-2 09:12
    007007

    挖0day是个比较复杂的过程,不过有一种比较有效的方法就是FUZZ

    1

    露珠能不能那个啥,辛苦弄个fuzz的入门教程阿

  • 61楼
    2017-2-25 08:06

    写的详细,学习了,谢谢。

  • 60楼
    2016-11-28 21:35

    OD过程很详细,楼上赞,有过其他作品不

  • 59楼
    2016-9-25 20:06

    刚开始学习逆向,很受用

  • 58楼
    2016-9-25 18:29

    挖0day是个体力活啊,没准一个0day要挖一周甚至更久。

  • 57楼
    2016-9-25 18:03

    写的不错二进制大牛啊 逆向不错 看雪 吾爱 你都在吧

  • 56楼
    2016-9-25 17:10

    整个利用过程的分析。很好了。

  • 55楼
    2016-9-12 01:46

    牛逼,学习了,我对这方面还是一窍不通

  • 54楼
    2016-6-11 10:02

    最近刚开始学逆向,受教了!多谢楼主

  • 53楼
    2016-6-7 09:59

    谢谢分享!!!

  • 52楼
    2016-5-22 23:41

    good writeup, thanks for the share.

  • 51楼
    2016-5-12 19:37

    之前也尝试用OD破解加密的视频了,也是很费劲了。本人自己感觉还是面向对象的语言学起来或者看起比较容易一些。

  • 50楼
    2014-12-24 15:02

    OD 都看不懂,其它一片乌云

  • 49楼
    2014-12-24 14:33

    很经典 学习了