[原创]CVE-2017-11882找漏洞触发位置
概述
本文是本人在调试CVE-2017-11882的过程中遇到的一些问题的记录文章,主要是给和我这样的小白看的,大牛直接飘过~
实验环境
win7 32 +office 2007 sp3

POC:
从github上找了一个验证poc(https://github.com/embedi/CVE-2017-11882),在测试机器上,可以复现,弹出计算器
调试技巧
关闭随机基址
当开启了ASLR的模块,起始位置和堆栈都会变化,可以手动关闭随机基址,这样,模块起始地址和堆栈就不会变了,尤其是栈溢出漏洞,经常是需要观察栈中的数据,当栈的地址不变之后,就可以对关键位置(栈的地址)下写入断点,就能很快找到漏洞触发的位置。
附加调试
在调试CVE-2017-11882的时候,附加了word.exe,并对winexec下了断点,但是漏洞触发了,并没有断下来,然后就围绕着怎么能在EQNEDT32.EXE加载时,断下来下功夫,对LoadlibraryW下断,发现也断不下来,这个模块好像是通过com组件调用起来的(这里可能不准确),后来在朋友的提示下,通过设置默认的调试器,成功的拦截了EQNEDT32.EXE的加载,然后对这个模块下winexec就成功断下来了
设置方法:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\image file execution
在这个键下面新建键值,是我们要附加的EQNEDT32.EXE程序名
注意:调试器路径中不能有中文,之前设置的OD中有中文,就断不下来

漏洞分析:
根据网上大佬的分析,知道是公式编辑器模块的问题,直接设置英文版OD为附加调试器,打开POC文档,调试器被附加上了,对winexec下断点

根据之前找漏洞触发的思路,利用栈帧中未被覆盖最近的一层作为起始位置,往下自动步过

来到调用4115A7调用处,下断点

由于EQNEDT32模块默认是开启了ASLR的,我们手动关闭随机基址。
重新载入,利用OD的自动步过(CRTL+F8)功能

在调试的过程中,自动步过被一个死循环阻挡了(为啥会死循环,没有具体去研究),在调试CVE-2018-0802的时候,也是被这个死循环(其实也不是死循环,可能是循环的次数特别多,观察了一大会儿没有结果)挡住了,以至于始终没有找到定位漏洞触发位置的方法,就放弃了。
其实可以直接在循环下面下断点,直接F9跳过就行(当时脑袋也是笨啊。。。)
这样就可以继续用自动步过大法了。
通过"-"号回溯,发现就是这层返回到了winexec的调用。那直接对这个ret位置下断点,重新载入

断下时:

发现返回地址已经被修改成了winexec的地址
由于关闭了随机基址,可以对栈地址下内存写入硬件断点(不要在最开始就下,调用次数会很多,在到漏洞触发接近的位置再下),就可以定位漏洞触发的位置了

在溢出位置,下好断点,并删除硬件断点,再次载入观察覆盖细节
覆盖前:

此时的调用关系图:

覆盖后:

至此,找漏洞触发的位置就分析到这,至于是由什么原因导致这个漏洞的逻辑分析,网上的分析已经够多了,这里就不贴这块了。论坛上传图片都很模糊,可以看下附件文档,图片是清晰的。
