阅读 297

CVE-2010-3333 microsoft RTF栈溢出漏洞分析

实验环境 操作系统:Vmware Windows xp sp3Office 版本:Microsoft Office Word 2003 漏洞文件:MSO.DLL 11.0.5606.0 调试器:Windbg:6.12.0002.633 x86  漏洞描述Microsoft office xp sp3、office 2003 xp3、office 2007 sp2、office2010等多个版本在处理 RTF 文档的绘图 pFragments 属性时产生的一个栈溢出漏洞。攻击者可以构造恶意的 RTF 文件,当用 WORD 打开恶意构 造的 RTF 文件,WORD 会直接将 RTF 中的数据复制到局部空间而无需验证复制数据的大小, 导致典型的栈溢出。 样本       一、漏洞信息1. 漏洞简述(必有)
  • 漏洞名称:microsoft RTF栈溢出漏洞

  • 漏洞编号:CVE-2010-3333

  • 漏洞类型:栈溢出

  • 漏洞影响:Microsoft office xp sp3、office 2003 xp3、office 2007 sp2、office2010等多个版本在处理 RTF 文档的绘图 pFragments 属性时产生的一个栈溢出漏洞。

  • CVSS评分:

  • 利用难度:simple

  • 基础权限:不需要

二、漏洞复现 1. 环境搭建
  • 操作系统:Vmware Windows xp sp3Office 版本:Microsoft Office Word 2003 漏洞文件:MSO.DLL 11.0.5606.0 调试器:Windbg:6.12.0002.633 x86

2. 复现过程1、利用metasploit生成可触发漏洞的poc样本  2、获取样本后,在windows xp下运行windbg ,并附加运行winword.exe

3、在windbg下按g继续运行word,并用word打开样本文件msf.rtf,发现word报错,并且未响应。

(7f8.684): Access violation - code c0000005 (first chance)First chance exceptions are reported before any exception handling.This exception may be expected and handled.eax=0000c8ac ebx=05000000 ecx=0000019b edx=00000000 esi=1104c24c edi=00130000eip=30e9eb88 esp=00123d98 ebp=00123dd0 iopl=0         nv up ei pl nz na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files\Common Files\Microsoft Shared\office11\mso.dll - mso!Ordinal6426+0x64d:30e9eb88 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]




错误代码 c0000005 (first chance)出现了栈溢出
错误文件是mso.dll  MSO.DLL 被视为一种 Microsoft Office 2010 component 文件。 它最常用于由 Microsoft 开发的 Microsoft Office 2010。 它使用 DLL 文件扩展名, 并被视为 Win64 DLL (动态链接库) 文件。

30e9eb88 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]   循环从esi指向的内存区域复制数据到内存的栈区域,每次是一个4个字节
这就出现了问题,从esi指定的内存区复制到栈上,没有检测栈的大小,导致edi指向的内存被覆盖,最后造成访问违例,触发异常指令地址为30e9eb88。
4、寻找出现问题函数
重新打开windbg,附加winword.exe进程,并下断点
bp 30e9eb88
因各种问题出现错误问题指令地址不一定相同。然后重复上面的操作,直到windbg运行到  rep movs dword ptr es:[edi],dword ptr [esi]5、查看堆栈输入kb

发现出现7个函数,我们一一分析。

首先明确一点内存中程序是从低地址到高地址排序,而函数中是从低地址到高地址,然后从ret指令返回值到之前函数 如果最后调用的是问题函数,极有可能是倒数第二个函数调用问题函数,所以我们调试 mso!Ordinal753+0x306e函数

mso!Ordinal753+0x307e:
30f4cdcd 8365f800        and     dword ptr [ebp-8],0
30f4cdd1 ff7514          push    dword ptr [ebp+14h]
30f4cdd4 8bc6            mov     eax,esi
30f4cdd6 f7d8            neg     eax
30f4cdd8 1bc0            sbb     eax,eax
30f4cdda 8d4df8          lea     ecx,[ebp-8]
30f4cddd 23c1            and     eax,ecx
30f4cddf 50              push    eax
30f4cde0 8b4508          mov     eax,dword ptr [ebp+8]
30f4cde3 4b              dec     ebx
30f4cde4 53              push    ebx
30f4cde5 47              inc     edi
30f4cde6 57              push    edi
30f4cde7 ff750c          push    dword ptr [ebp+0Ch]
30f4cdea e86efeffff      call    mso!Ordinal753+0x2f0e (30f4cc5d)
30f4cdef 84c0            test    al,al
30f4cdf1 740c            je      mso!Ordinal753+0x30b0 (30f4cdff)




查看该函数之后,发现(30f4cc5d)该地址在在之前的问题函数上,所以单步调试mso!Ordinal753+0x2f0e函数



然后再次下断点 bp 30f4cc5d

然后单步跟踪运行

最后找到触发错误的指令。
30f4cc60 83ec14          sub     esp,14h     这里函数开辟了0x14字节大小的栈空间
30f4cc7a ff750c          push    dword ptr [ebp+0Ch]  ss:0023:00123ddc=00000000          这里开始执行错误函数,且exc寄存器中的值为0x0000c8ac,且操作为dword字节,所以除以4


用16进制打开msf.rtf,发现字段 ac c8实际被复制到寄存器exc中了,且寄存器esi中的数据皆为ac c8 的后续数据。

用txt文件打开查看数据文件,ac c8为复制内存大小,后面可以填充40个字符来覆盖栈,再用jum esp指令覆盖返回地址,最后填充shellcode。



三、缓解措施
http://www.microft.com/zh-cn/download/details.aspx?id=8121

官方补丁采用了检测rtf文件中pFragments属性值大小是否大于4字节,若大于这挑走并返回,不再复制

四、参考文献
CVE-2010-3333解析_哔哩哔哩_bilibili

cve-2010-3333 分析简笔 - m4sterx - 博客园 (cnblogs.com)

漏洞战争


文章分类
百科问答
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐