zoukankan      html  css  js  c++  java
  • 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 总结

    • 开始以为防御的目的是限制过多数据复制到栈中,之后才知道是可以复制数据到栈中,但是绝对不会超过开辟的栈大小,进而防止了溢出
    • 参考资料:0day安全:软件漏洞分析技术 + 漏洞战争
  • 相关阅读:
    Linux日常测试命令记录
    Python的加密方式:RSA加密
    Python踩坑系列之报错无“winrandom”模块:ModuleNotFoundError: No module named 'winrandom'
    Python踩坑系列之读取文件报错:OSError: [Errno 22] Invalid argument: 'u202aC:/Users/pc/Desktop/jspt.cer'
    Python的加密方式:MD5加密
    Python学习笔记:方法重写的理解
    7月底HTML/CSS学习笔记大纲
    css命名规范及项目文件目录
    css引入方式之外链式和导入式的异同点(面试题)
    CSS4种引入方式:行内,内联式,外部式,导入式
  • 原文地址:https://www.cnblogs.com/csnd/p/11800537.html
Copyright © 2011-2022 走看看