CVE-2010-3333 Microsoft RTF栈溢出漏洞

Published: by Creative Commons Licence

学习《漏洞战争》中的CVE-2010-3333

  • 测试环境

      测试版本
    操作系统 windows XP SP3
    调试器 Immunity Debugger
    漏洞软件 Microsoft Office Word 2003
  • 漏洞函数

mso.dll中对pFragments属性值进行处理的函数。定位方法:msfconsole下搜索CVE-2010-3333,并设置target为6,引起crash,调试器加载并运行WINWORD.EXE,打开测试文件,会看到崩溃在下面地址处,由esi地址向edi地址复制数据,其中edi指向栈的高地址处

   cve-2010-2333-crash

打开堆栈窗口,可以看到调用函数位于0x30F0B5F8地址处,位于mso.dll库中,打开View->Executable Modules可以看到mso.dll文件的地址

cve-2010-3333-backtrace cve-2010-3333-mso

下面是漏洞函数的反编译代码:

   cve-2010-3333-vuln_func

  • 漏洞成因

在栈上开辟的缓冲区大小是0x10,而要复制的数据大小是从文件中获得,在复制是并没有检查数据大小,从而覆盖栈上高地址,产生栈溢出,这样就产生了漏洞

  • 调试过程

调试器打开WINWORD.EXE,F9运行,在0x30F0B5DA处下断点,单步调试,发现0x30F0B5DA处的函数返回一个地址(0x124150),接着mov esi,[eax+0x64],(esi=0x12D07AC),下面也主要用的是0x12D07AC地址,继续运行lea ecx,[ebp-0x10];push ecx,所以是在栈中开辟一个大小0x10的缓冲区

   cve-2010-3333-30f0b5da

继续单步运行,执行到call [eax+0x1c]跳到漏洞函数处,跟进去,发现取0x12D07BC处的值作为数据长度,0x12D07BC处的值作为复制数据来源。 和文件的16进制对比,发现复制长度是pFragments属性值的第3个字段,偏移8个字符后的4个字符就是数据大小,之后的数据就是待复制的数据。

   cve-2010-3333-crash
   cve-2010-3333-shuju
   cve-2010-3333-poc_shuju