CVE-2017-11882漏洞的分析记录

漏洞介绍

漏洞分析

        漏洞分析环境与工具

            windows xp sp pro sp3,x32dbg,010editor,IDAPro

 漏洞分析过程

1.获取poc

https://github.com/embedi/CVE-2017-11882/tree/master/example

该poc弹出calc

2.漏洞复现

安装office 2003,执行poc

根据资料漏洞出现在EQNEDT32.EXE进程中,所以需要现在word中插入一个公式3.0的对象

3.漏洞分析

打开word 2003,插入一个公式3.0对象

打开x32dbg,附加EQNEDT32.EXE进程

定位漏洞触发点

该poc触发漏洞创建了calc.exe进程,可以对 CreateProcessA和CreateProcessW及WinExec下断点

bp CreateProcessA
bp CreateProcessW
bp WinExec

在word中打开poc文件

x32dbg在WinExec断下,查看参数,是calc进程的创建处

查看此时的堆栈调用,可以看出上次调用的函数的堆栈的ebp已经被破坏为0x41414141,应当是上层函数的内部的不当操作导致了上层栈的溢出,破坏了上层调用的返回地址,在上层函数ret时,栈顶esp的返回地址已经被构造为一个恶意地址进而开始执行。

定位溢出函数

对于缓冲区溢出类的溢出,当我们定位到溢出点后,一般都是向上层追溯栈,根据上面说的,我们的溢出一般都是最近一次的函数调用中数据处理不当造成的 ret 地址被破坏,所以优先在堆栈窗口中向上查看刚刚调用函数的栈帧,结合返回地址和EBP可以看出上层栈帧,如下图所示

可以看出,0x411837 处是溢出函数的内部调用,结合上面的ebp=0x12f24c 可以看出,这里就是最近一次的函数调用

上面的gdi32那个地址不是,因为0012F1F0处是ebp,该值并不合理,其应当是ebp=0x12f24c,所以不是

分析溢出函数 

通过Addr = 0x411837找到上层函数的开头处为0x41160F,在此处下断,重新附加运行,锁定堆栈,查看此时的栈顶即ret地址处

F8不断单步直至上面的返回地址被覆盖,则精确定位到溢出点处为0x411658处的拷贝指令未进行长度限制

使用IDA静态分析函数0x41160F

分析可以发现函数中使用了strcpy函数配合strlen直接将参数拷贝至栈中,所以导致了栈被破坏,该poc中将shellcode精心构造为命令加返回地址的方式,将原本的字体名称拷贝变为命令,同时在拷贝名称的同时将返回地址覆盖为EQNEDT32.EXE模块中对WinExec的调用,这就实现了calc的调用。

利用方式

该poc构造了一个比较巧妙的poc,在不存在DEP的情况下,一般的栈溢出都会将shellcode拷贝到栈中执行,利用jmp esp+滑板指令+shellcode的方式实现漏洞的利用,而该poc则在存在了DEP的情况下依然可以执行,因为使用的是模块中的代码进行WinExec执行cmd指令,这也可以当做一种绕过DEP的方式。

对于本漏洞可以利用jmp esp+滑板指令+shellcode的方式。

RTF文件格式如下图:

函数的调用如下

文件构造方式:

将ret处的地址替换为系统dll中的jmp esp指令(可以使用windbg+mona插件实现查找),然后后面留出3*4=12个字符的堆栈平衡空间,可以利用滑板指令90进行填充,用于平衡栈摆动

发布了6 篇原创文章 · 获赞 2 · 访问量 471

猜你喜欢

转载自blog.csdn.net/wojiukanxia/article/details/104408585