0x01 前言

  • CVE-2011-0104 是 Microsoft Office 中的 Excel(没有打补丁的情况下)表格程序在处理 TOOLBARDEF 中的 Record 字节时没有对 Len 字段和 Cbtn 字段做过滤导致可以将任意大小的数据复制到任意地址的空间去,从而导致栈溢出漏洞。若攻击者通过构造恶意的 XLB 文件,受害者在未知的情况下打开恶意文件,受害者主机可能会被完全控制。到目前为止 CVE-2011-0104 漏洞还未收录在 metasploit 中

0x02 分析环境

  • 虚拟机:Windows XP sp3 64 位操作系统,ASLR 处于关闭状态,便于调试(提取码:d3ho)
  • 漏洞程序:Microsoft Office Excel 2003,版本:11.0.8211(提取码:woi9)
  • 分析工具:ODIDA(提取码:v0pt),Windbg(Windbg32Windbg64),C32Asm(16进制分析文件工具,提取码:4sj8)
  • 样本(POC):能够触发异常的 .XLB 格式文件(提取码:0oic)

0x03 定位程序异常

  • 有了 POC 下面就可以开始定位异常,通用的做法是利用正宗的微软调试器 Windbg,先运行 EXECEL.EXE 文件吧

  • 附加一个进程,一般是以附加的方式调试,也可以运行一个源程序再调试

  • 找到刚刚运行的 EXECEL.EXE 程序的进程

  • 运行,g 是运行的意思

  • 这里使用打开文件的做法,如果使用的是拖入的方式加载文件,异常触发后会被 Windows 的异常处理给捕捉到,不利于调试,这里要注意

  • 这个样本就是 POC 选中之后打开它

  • Windbg 成功捕捉到异常,异常出现在 EXECEL.EXE 中,而不是通常的 .dll 文件中。这个异常表示在 0x30089ca1 这个地址,编译器读不出 0x51455047 这个地址,不知道这个地址代表什么。
  • 一个正常的文件加载是不会出现这个异常的,那么为什么会出现这个异常呢,原因就是堆栈中的数据被覆盖了,原来可以读的地址被改成了 POC 样本中的数据导致不可读,0x51455047 这个数据极有可能是 POC 中的数据

  • 最后看一下堆栈中的数据,都被覆盖了

0x04 OD调试

  • 记下刚才程序发生异常的地址,在 OD 中断下

  • 重新运行断在了异常处,暂且将这个异常函数称为 test_error 函数

  • 此时堆栈的情况

  • 下面需要跟踪堆栈,为什么需要跟踪堆栈呢,因为虽然知道异常点触发点,但并不知道堆栈中的数据何时被复制进堆栈的
  • 为了搞清楚这个问题,首先需要定位栈顶位置和 test_error 函数入口点在哪里,但是目前堆栈中的数据被溢出覆盖了,没有办法定位怎么办,这里可以加载一个正常的文件

  • 下图是加载了一个正常的文件并且定位到了异常点,注意此时 EBP 的位置

  • 查看一下堆栈,利用 EBP 找到函数返回地址

  • enter 一下返回值,断下这个函数,异常就出现在 EXECAL.30089b57 中也就是 test_error 这个函数

  • 之后重新载入有漏洞的文件

  • 运行到刚刚断下的函数后,F7 进入这个函数,运行到如下位置,此时函数已经开辟出 0x60 大小的栈空间

  • 堆栈窗口如下图所示

  • 在数据窗口查看堆栈信息,并且在栈底下内存写入断点

  • F9 运行两次终于找到了这个污点,就是它将 POC 中的数据复制到了堆栈当中(其实找到查询堆栈复制信息的时候,还可以利用函数调试法来追踪,这里不做过多阐述)
  • rep 是循环复制命令,计数器为 ecx,也就是 eax / 4 的值,此时 eax 为 0x300,可能是某个处理内存函数的参数
  • 下断点后重新运行,F8 单步之后,堆栈空间被 POC 数据覆盖

  • 和 POC 中的数据作对比,果然一模一样

0x05 结合 IDA 进行污点追踪,寻找出现问题的函数

  • 在追踪之前需要知道污点函数的入口点,重新运行,断在了如下位置

  • 利用堆栈进行查找函数,成功找到了污点函数的位置

  • 下面就是污点追踪所需要的数据
地址 函数地址
污点 0x3008942F 0x3070DEA5
异常出发点 0x30089CA1 0x3008A85C
  • 直接利用 IDA 定位污点函数的地址 0x3070DEA5,翻译成伪代码(F5)

  • 进函数看一下,发现了果然是 memcpy 这个函数处理内存的时候没有对数据大小进行过滤,0x300 就是这个函数的一个参数

  • 来看一下函数的原型,IDA 中 a1 就是复制的目标地址,v7 就是拷贝的大小为 0x300

  • 从 V7 入手(与 a1 分析原理相似,不做阐述),层层溯源,发现是这个函数传入的第三个参数

  • 第三个参数又是 sub_3008945F 中获取的

  • 进入这个函数看一下,发现这个函数是读取 POC 上的数据,下面来验证一下

  • OD 载入,找到 0x3008945F 这个函数,下断点,返回值为 eax,所以看看 eax 何时变为 0x300

  • 经过多次运行,找到了 0x300 这个数据

  • 结合堆栈进行分析,发现确实是样本中构造的数据

  • 逻辑图

0x06 总结

  • CVE-2011-0104 漏洞归根结底还是利用了不安全的函数 memcpy,而函数的两个参数一个是复制源数据的大小,一个是复制的地址都是从 POC 中读取的,竟然没有做任何的过滤,最后导致了栈溢出的发生,之后发布的补丁也是对这两个参数做了过滤处理
  • 参考资料:0day安全:软件漏洞分析技术 + 漏洞战争

CVE-2011-0104:Microsoft Office Excel 中的栈溢出漏洞调试分析的更多相关文章

  1. CVE-2012-0158:Microsoft Office MSCOMCTL.ocx 栈溢出漏洞调试分析

    0x01 Lotus Blossom 行动 在 2015 年 6 月,国外安全厂商 Palo Alto Networks 的威胁情报团队 Unit42 发现了一起针对东南亚政府的一次间谍行为,试图获取 ...

  2. CVE-2018-0798:Microsoft office 公式编辑器 Matrix record 字段栈溢出漏洞调试分析

    \x01 前言 2018 年 1 月 9 日,Office 公式编辑器再曝出新漏洞,编号为 CVE-2018-0798.提起公式编辑器大家都不陌生,之前的 CVE-2017-11882 和 CVE-2 ...

  3. CVE-2010-3333:Microsoft RTF 栈溢出漏洞调试分析

    0x01 前言 CVE-2010-3333 漏洞是一个栈溢出漏洞,该漏洞是由于 Microsoft文档在处理 RTF 数据的对数据解析处理错误,在进行内存操作时没有对操作的数据进行长度限制,导致存在内 ...

  4. ERP中通过EDI导入资料的时候出现【Microsoft Office Excel不能访问文件‘C:\Windows\TEMP\433....’

    问题描述: ERP中导入单据的时候报错,Microsoft Office Excel不能访问文件'C:\Windows\TEMP\433....可能的原因有:·文件名称或路径不存在,文件正被其他程序使 ...

  5. 命名空间“Microsoft.Office.Interop”中不存在类型或命名空间名称“Excel”。是否缺少程序集引用 的另一种解决方案

    一直以来都是使用tfs进行源代码管理,系统部署也是由我本机生成后发布到服务器上,某一日,进行发布操作时,报了 [命名空间“Microsoft.Office.Interop”中不存在类型或命名空间名称“ ...

  6. Microsoft Office Excel 不能访问文件及COM无法访问

    Microsoft Office Excel 不能访问文件及COM无法访问 Microsoft Office Excel 不能访问文件“*.xls”. 可能的原因有: 1 文件名称或路径不存在. 2  ...

  7. [Excel操作]Microsoft Office Excel 不能访问文件

    最近,客户服务器迁移,因操作系统环境变化而引起的的环境问题一堆,遇到的问题并解决方法在“[Excel]操作”类别会体现. Microsoft Office Excel 不能访问文件“C:\\LMSEx ...

  8. Microsoft Office Excel 不能访问文件

    问题描述: Microsoft Office Excel 不能访问文件“XX.xls”.可能的原因有: 1 文件名称或路径不存在.2 文件正被其他程序使用.3 您正要保存的工作簿与当前打开的工作簿同名 ...

  9. CVE-2011-0104 Microsoft Office Excel缓冲区溢出漏洞 分析

    漏洞简述   Microsoft Excel是Microsoft Office组件之一,是流行的电子表格处理软件.        Microsoft Excel中存在缓冲区溢出漏洞,远程攻击者可利用此 ...

随机推荐

  1. PHP题库1

    选择题11. php中,不等运算符是( B.C ) A ≠    B !=   C <>   D >< 2. 函数的参数传递包括:( A.B ) A 按值传递       B ...

  2. c++随机数问题研究

    1.问题背景 某项目中有个复杂的排序,先是各种规则依次排序,最后如果依然并列的话,那就随机位置,名次并列.测试中发现一个诡异现象,并列时随机排序但随机后2个case打印的顺序每次都一样,随机数没有起到 ...

  3. Fcitx5 上线 FreeBSD

    Fcitx5 上线 FreeBSD textproc/fcitx5textproc/fcitx5-qttextproc/fcitx5-gtktextproc/fcitx5-configtoolchin ...

  4. MySQL入门(6)——流程控制

    MySQL入门(6)--流程控制 IF语句 条件判断语句,逻辑与大多数编程语言相同,表示形式如下: IF condition THEN ... [ELSE condition THEN] ... [E ...

  5. CSS网页的布局

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  6. Android学习之异步消息处理机制

    •前言 我们在开发 APP 的过程中,经常需要更新 UI: 但是 Android 的 UI 线程是不安全的: 如果想更新 UI 线程,必须在进程的主线程中: 这里我们引用了异步消息处理机制来解决之一问 ...

  7. 微信小程序授权登录以及用户信息相关接口调整导致授权框不弹出

    前言:4月8号升级了小程序业务后提交了版本并上线.突然一个同事说体验版的点击"登录"按钮无效.当时觉得应该不会呀,这几天一直用手机调试,每天也在不停的登录授权,弹框一直有的呀.然后 ...

  8. [Fundamental of Power Electronics]-PART I-2.稳态变换器原理分析-2.1 引言

    2.1 引言 在上一章中,介绍了降压变换器作为降低直流电压的一种方法,其仅使用非耗散开关,电感器和电容器.开关状态变换产生一个矩形波形\(v_{s}(t)\),如图2.1所示.当开关位于位置1时,该电 ...

  9. 201871030135-姚辉 实验二 个人项目—《D{0-1} KP》项目报告

    项目 内容 课程班级博客链接 课程班级博客链接 这个作业要求链接 这个作业要求链接 我的课程学习目标 (1)掌握软件项目个人开发流程.(2)掌握Github发布软件项目的操作方法. 这个作业在哪些方面 ...

  10. html页面自定义文字水印效果案例

    在系统开发过程中,一些数据或页面比较敏感的地方,客户会要求实现水印效果,防止内部人员截图或拍照泄露信息. 自定义文字水印顾名思义就是利用js在完成页面渲染的同时,往页面的最底层动态生成多个带水印信息的 ...