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. 漏洞简述(必有)
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: 查看该函数之后,发现(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) 漏洞战争 |