目录
  1. 1. CVE-2017-11882
    1. 1.1. 疑问?
      1. 1.1.1. 8086汇编 rep 指令
CVE-2017-11882

CVE-2017-11882

CVE-2017-11882是微软公布的一个远程执行漏洞,office2017具有该漏洞。该漏洞的成因是EQNEDT32.EXE进程在读入包含MathType的ole数据时,在拷贝公式字体名称时没有对名称长度进行校验,从而造成栈缓冲区溢出,是一个非常经典的栈溢出漏洞。

  • 调试环境
    • windows7_sp1(有这个sp1才能安装vmtools)
    • office 2007 x86
    • olldbg
    • ida

先ida找到漏洞出现的地方

image-20201223104427198

通过od动态调试查看出拷贝的是一个字符串”TIMES NEW ROMAN “

  • 开始调试

找到文件

image-20201223105425501

修改注册表,动态调试

od动态调试(调试方法)

双击运行,ctrl+g 跳转到对应程序端 F2下断点。0x00411631

image-20201223105817047

image-20201223105914146

F9运行到断点

image-20201223110148348

F8单步执行

image-20201223110944295

运行到复制操作,可以发现esi字符串赋到edi,edi里放的址正是ebp+string

如果411658处拷贝时溢出的数据超过ox2c个字节,会导致ret_addr被覆盖,超过0x30,会导致第一个参数被覆盖

image-20201223111304312

image-20201223113355760

image-20201223113515223

image-20201223113128980

但是不知道为什么运行完指令之后,string的值并不是 TIME NEW ROMAN

运行前 (A98就是字符串的地址)

image-20201223115950240

运行rep movs dword ptr es: [edi] , dword ptr es: [esi] 后,

image-20201223120049851

但后面lea eax,[local-10](local-10就是string)后eax变为 TIME NEW ROMAN

image-20201223120507353

执行脚本

跳转到0x00411650

观察EBP+4 即 0x12fac4

image-20201223121334594

运行rep movs dword ptr es: [edi] , dword ptr es: [esi] 后,返回地址没变

image-20201223121512170

返回时

image-20201223122242014

接着调用winexec,弹出计算器

image-20201223122402440

image-20201223122452627

疑问?

再次运行,在复制后,edi的值并没有发现cmd指令。但确实有计算器弹出、

第二次执行到断点查看edi的值,在后面发现

image-20201223123323800

image-20201223141523975

image-20201223123408019

动态调试exe文件

https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/a329t4ed(v=vs.100)?redirectedfrom=MSDN

导航到

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\image

image-20201223094741355

1
2
3
4
5
6
7
8
9
10
11
12
右键单击新键,在快捷菜单上,单击重命名
将密钥名称编辑为应用程序的名称; EQNEDT32.exe,

右键单击EQNEDT32.exe,在快捷菜单上,单击"新字符串值"。
右键单击新字符串值,在快捷菜单上,单击"重命名"。
将名称更改为 debugger

右键单击新字符串值,在快捷菜单上,单击"修改"。
将显示"编辑字符串"对话框。
在"值"数据框中,键入 C:\Users\zzl\Desktop\Ollydbg\OllyDBG.exe

调试器必须在您的系统路径中,可以添加环境变量,如果是全路径就不用添加环境变量

8086汇编 rep 指令

REP(REPeat)指令就是“重复”的意思,术语叫做“重复前缀指令”

rep是字符串操作指令MOVS,CMPS等的前缀,在CX不等于0的情况下,对字符串执行重复操作.

1
指令每次执行前都会判断CX的值是否为0(为0结束重复,不为0,CX的值减1),以此来设定重复执行的次数。因此设置好CX的值之后就可以用REP MOVSB了。

REP MOVS **m16,m16** 将 (E)CX 个字从 DS:[(E)SI] 移到 ES:[(E)DI

MOVSB是每次一个字节,其次是一个字、接着一个双字。 我们从它的’B’,’W’,’D’就可以看出来。 B代表Byte,W代表WORD(2Byte), D代表DWORD(4Byte)。

rep指令常和串传送指令搭配使用
功能:根据cx的值,重复执行后面的指令

一、SCASB 指令
cmp byte ptr [edi],al//对标志位的影响相当于sub指令
//同时还会修改寄存器EDI的值:如果标志DF为0,则 inc EDI;如果DF为1,则 dec EDI。
二、REPNE 指令
REPNE SCAS BYTEPTR ES:[EDI]// 当ECX!=0并且ZF==0时 重复执行后边的指令 每执行一次ECX的值减1
REPNE 和REPNZ 是同一条指令的不同助记符

LEA指令 简 介 有效地址传送指令 LEA 格 式 LEA OPRD1,OPRD2 功能 将有效地址传送到指定的的寄存器

文章作者: zzl
文章链接: https://www.zzl14.xyz/2020/12/10/CVE-2017-11882/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 try
打赏
  • 微信
  • 支付宝

评论