CVE-2011-0104:Microsoft Office Excel 栈溢出漏洞修复分析

0x01 前言

  • 上一篇讲到了 CVE-2011-0104 漏洞的成因和分析的方法,并没有对修复后的程序做分析。之后在一次偶然的情况下,想看一看是怎么修复的,结果却发现了一些问题
  • 环境:修复后的 EXCEL.EXE 程序(提取码:t251)

0x02 伪代码分析

  • 起初一开始参照资料上说对 memcpy 复制的值进行了过滤,来看一下伪代码;图中划红线的地方就是漏洞触发的函数,memcpy 的第三个参数(复制数据的大小)就是 a2 传进来的,当 a2 > a3 时就不会执行下面的 memcpy 漏洞函数(经过反复调试的结果)
    在这里插入图片描述
  • 来看一下这个值,这个变量是 0x2020 并且在调用 sub_300e7083 这个函数时并不会发生变化,也就是当复制数据的大小(v6)不大于 0x2020 时还是会跳到漏洞函数的;并且在之前也没有做过滤,所以当时的第一反映就是会不会在修复后还存在栈溢出
    在这里插入图片描述

0x03 OD 调试分析

  • 还是动手调试一下,没准又是一个新漏洞,这时的 EAX 为 300,300 就是 POC 样本中的数据,也是复制数据大小的参数
    在这里插入图片描述
  • 把他改成2000,只要不大于 0x2020 就行了
    在这里插入图片描述
  • 执行到漏洞函数中,这个 cmp 就是比较是否大于 0x2020
    在这里插入图片描述
  • EAX 为 2020,EBX 为 2000
    在这里插入图片描述
  • 执行完漏洞函数,看一下此时的堆栈
    在这里插入图片描述
  • 哈哈哈,堆栈被覆盖了
    在这里插入图片描述
  • 下面只要 F9 让他运行触发异常就行了,但是并没有,那么到底哪里出错了,经过反复调试和验证终于知道问题出在哪里了,原来是在开辟栈空间时大小为 0xFEC,而复制数据的大小控制在小于 0x2020,当复制数据的大小定为最大时,也就是 0x2020时,rep 指令的 ecx 计数就为
    在这里插入图片描述
  • 12AA08 最近的一次函数返回值
    在这里插入图片描述
  • 而 127104 就是复制时的地址
    在这里插入图片描述
  • 两个相减一下发现为 0x3004,所以再怎么复制数据也不会溢出栈空间,进而做到了防御栈溢出的效果
    在这里插入图片描述

0x03 总结

  • 开始以为防御的目的是限制过多数据复制到栈中,之后才知道是可以复制数据到栈中,但是绝对不会超过开辟的栈大小,进而防止了溢出

猜你喜欢

转载自blog.csdn.net/qq_38924942/article/details/87445352