-
-
2010-3333 rtf 简单调试
-
发表于: 2022-2-21 15:25 9610
-
一、漏洞环境
系统环境:windows xp sp3
漏洞软件:Microsoft Office Word(2003 sp3)
调试工具:Windbg
二、漏洞分析
该漏洞主要是在处理RTF中的“pFragments”属性时存在栈溢出,导致远程攻击者可以借助特制的RTF格式的数据执行任意代码。
运行WinDbg附加Word 2003,打开测试样本poc.rtf,WinDbg捕获到的异常如图所示,可以看到出现异常的位置是0x30ed442c,
使用IDA进行反汇编可以得到0x30ed442c位于函数sub_30ED4406
在0x30ed442c处设断点,重新执行并且进行跟踪分析查看此时的栈信息
依次查看调用的函数地址,可以发现漏洞函数(0x30ED4406)是被0x30f0b5c2函数所调用的,重新加载进程并且在0x30f0b5c2处设下断点,执行程序。
下面单步跟踪程序到调用漏洞函数(0x30ed4406)所在位置 :
进一步跟踪发现执行内存复制req movs时对应的ecx大小为0x0000c8ac,即复制数据的大小,由于是操作dword字节所以再进行了右移两位.
查看poc.rtf文件的内容可以看到c8ac正好是源于样本文件,它位于pFragments属性的第三个字段,偏移8个字符后的4个字符就是复制的数据大小。
进一步可以看到此时所复制的内容esi对应的正好是acc8之后的内容
复制的内存的目标地址edi刚好偏移栈底ebp0x10,而ebp本身大小为0x4,这样一来如果复制的内存大小超过0x14就会覆盖到该函数的返回地址。由于poc.rtf中复制的内存数据较大就导致了异常的产生
三、漏洞代码
使用IDA可以分别生成函数0x30f0b5c2和0x30ED4406的代码如下所示:
四、漏洞利用
该漏洞的利用可以通过将函数的返回地址覆盖为jmp esp指令地址覆盖,也就是偏移0x14个字节的值之后就可以覆盖到返回地址,然后将利用代码shellcode放在后面就可以进行利用。值得注意的是函数30F0B5C2在返回时会弹出0x14的栈空间,因此利用代码要放在偏移jmp esp指令0x14的位置处.