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

    1. search cve-2010-3333
    2. use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof
    3. set target 6
    4. exploit

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

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

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

    image.png

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

    image.png

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

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

    image.png

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

    image.png

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

    image.png

    这条命令所在的函数是通过 0x30f4cc93 的 call dword ptr [eax+1Ch] 调用的 sub_30E9EB62,这点可以根据 windbg 中的 k 命令来看出来,在 30e9eb88 断下来之后:
    根据反汇编得到的函数地址可以推断出:30f4cd58 调用 30f4cc5d 调用 30E9EB62
    0012a24c 中显示的返回地址是红色箭头指向的那个 call 的返回地址

    image.png

    image.png

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

    image.png

    它的三个参数分别是:

    image.png

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

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

    image.png

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

    image.png

    然后是 esi 的赋值:
    先把第一个参数放在了 eax 中

    image.png

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

    image.png

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

    image.png

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

    image.png

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

    image.png

    循环赋值图示:

    image.png

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

    image.png