​[CVE-2010-3333]Office RTF文件pFragments属性栈溢出漏洞

2021-02-15 12:49:28 浏览数 (1)

通过栈回溯来分析漏洞,使用 msf 生成一个能够 crash 的文件,然后打开 office word,windbg 附加进程之后 g 运行起来

代码语言:javascript复制
search cve-2010-3333
use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof
set target 6
exploit

然后把 msf 生成的文件拖进去打开,这时候 windbg 会断下来

代码语言:javascript复制
30e9eb88 f3a5  rep movs dword ptr es:[edi],dword ptr [esi]

关掉,然后重新附加一下,下个断点:bp 30e9eb88 再运行起来,把文件拖进去打开,会断下来,此时看一下 30e9eb88 附近的反汇编,可以看到,两个 pop 之后是 ret

可以推断出 ret 时的返回地址其实是 0x30f4cc96

那 IDA 里面找一下这个地址,他是在函数 sub_30F4CC5D 中的

这条命令所在的函数是通过 0x30f4cc93 的 call dword ptr [eax 1Ch] 调用的 sub_30E9EB62,这点可以根据 windbg 中的 k 命令来看出来,在 30e9eb88 断下来之后:

根据反汇编得到的函数地址可以推断出:30f4cd58 调用 30f4cc5d 调用 30E9EB62

0012a24c 中显示的返回地址是红色箭头指向的那个 call 的返回地址

重新运行附加一下在 30f4cc5d 下个断点,然后跑起来,当程序断下来的时候 g 30f4cc93 可以看到要调用的是 30e9eb62

它的三个参数分别是:

其中 ecx 是前面 lea ecx,[ebp-0x10h] 得来的

在调用 30e9eb62 之前栈上的空间是这样的,011e1678 是第一个参数,0012a20c 是第二个参数,后面的 00000000 是第三个参数

进入 30e9eb62 函数之后把第二个参数放在了 edi 中

然后是 esi 的赋值:

先把第一个参数放在了 eax 中

然后把它的 8 处的值放在了 ecx

然后 ecx 与 0xffff 进行了与运算,只保留了 c8ac,这个 c8ac 是:

然后乘上了一个在栈中的数,变成了 0

接下来要做的就是把 esi 指向的地址中的内容循环赋给 edi 那个地址,然而循环次数是 ecx 决定的,edi 的值是 ebp-0x10,所以很容易溢出了

循环赋值图示:

这里对应的就是 msf 生成的样本中的 acc8 后面那块内容

0 人点赞