跳转至

[CVE 2010 3333]MicrosoftOfficeRTF文件pFragments属性栈缓冲区溢出漏洞

[CVE-2010-3333]Microsoft Office RTF 文件 pFragments 属性栈缓冲区溢出漏洞

上一篇文档是通过字符串来定位漏洞,这次通过栈回溯来分析漏洞

search cve-2010-3333
use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof
set target 6
exploit

使用 msf 生成一个能够 crash 的文件,然后打开 office word,windbg 附加进程之后 g 运行起来

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

30e9eb88 f3a5       rep movs dword ptr es:[edi],dword ptr [esi]

1608727763192-c414fc0f-16cf-4189-8f66-8911a7613db2.png

这时候看一下 edi 中的地址:`!address edi```

1608731790878-2d6af5d1-7848-4a1b-b333-0b1e3963b36b.png

可以看到权限是 PAGE_READONLY,所以往这里写的时候出现了异常

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

1611048245178-18f52ee3-f75d-4af1-a34a-377684734009.png

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

1611049927709-aa0a7714-dd28-47ab-b1ae-3347cd445a04.png

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

1611062484460-e97b8bb8-8d39-48e2-9557-cbc2d1206d48.png

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

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

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

1611066182756-eca92830-7c14-4adf-817f-7bc933535d7e.png

1611067000387-f597d489-5b69-4a03-abfc-9448e99947ba.png

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

1611067456255-ab7dd774-a2cf-4058-b2b2-9527301a78ea.png

它的三个参数分别是:

1611067847542-89407f0e-6443-4b9b-aa16-318c27cf3675.png

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

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

1611110427782-919dc7d6-f8b6-4293-bcce-52403217c894.png

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

1611143519362-d014c745-8e79-4dff-9afc-286399332003.png

然后是 esi 的赋值:

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

1611143945185-cd1d625a-38ad-42ba-b801-d66be9b3766a.png

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

1611144177919-ff519fd5-bd34-4030-a793-5bd4216510bf.png

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

1611144326136-c5b937e1-eee4-48fc-938a-ccc99dd335ca.png

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

1611144640282-fee44ba2-5946-4bb5-bedb-62fa3a73dc78.png

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

1611146197543-c23cff66-d4ea-42fa-ac9b-e59975b53408.png

循环赋值图示:

1611193186218-604b94ab-ea54-4fe2-b19c-3457a43fdfb1.png

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

1611194934575-1a7ef0c9-954c-4b94-b1f5-4f1aca9d6f23.png

原文: https://www.yuque.com/hxfqg9/bin/hzyxvk