1 CVE-2018-0798概述

CVE-2018-0798和CVE-2017-11882都是典型的栈溢出漏洞。发生在office软件的EQNEDT32.EXE上。这是一个公式解析程序,在解析Matrix record并未检查长度,从而造成栈缓冲区溢出。

具体发生在sub_443F6C函数,没有对输入做限制,导致覆盖了sub_443E34返回地址,从而导致栈溢出漏洞。

2 CVE-2018-0798样本分析

首先在sub_443E34上打好int3断点,然后程序异常调用调试器跳转到sub_443E34上,具体参考CVE-2017-11882这篇文章。

下面以逆向角度看栈与栈溢出以及CVE-2018-0798漏洞。

在第二次调用sub_443F6C函数中,拷贝0x40(64)个字节。还没覆盖时,此时sub_443E34的返回地址是0043A851,sub_443F6C函数的返回地址是00443EC0

把64字节精心构造的数据拷贝后,sub_443E34的返回地址就被修改为044C0B8

0044C0B8是pop ret,返回到44CED2

44CED2是pop ret,返回到00443F6C

将上文ebp(00464000)和edi(0045A3E0)入栈,此时栈顶是0045A3E0,栈底是00464000,都是构造的

在00443F6C内再拷贝0x513字节

shellcode拷贝到00464000

然后ret返回到4013B2,4013B2是leave ret

4013B2返回到0045204A,0045204A是pop eis ,ret

0045204A返回到0044D195,0044D195是call esi,正好把00464018返回给esi,这样就跳转到shellcode