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. 用java输出"Hello,World!"

    Hello,World! 一般步骤 随便新建一个文件夹,存放代码 新建一个java文件 新建.txt文档 文件后缀名改为.java Hello.java [注意]系统可能没有显示后缀名,我们需要手动打 ...

  2. MarkFormat,一个在Word中使用Mark进行格式化的插件

    MarkFormat(标记格式化),是一款在Word中基于标记进行格式化的工具. 让我们看下具体效果. 首先是有标记的文本 点击格式化之后 点击去除标记之后(去除标记也会进行格式化) 如果想要恢复标记 ...

  3. 使用SQLSERVER 2008 R2 配置邮件客户端发送DB数据流程要领

    设置邮件 QQ邮箱貌似不太行,建议用企业邮箱或者其他邮箱作为发件箱 新建一个邮件发件箱账号,具体邮件服务器按照各自邮件配置,是否使用ssl,自便 下一步,下一步,配置成功 use msdb Go DE ...

  4. Springboot 轻量替代框架 Solon 1.3.10 发布

    Solon 是一个微型的Java开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC.REST ...

  5. python类属性

    类属性 类属性分为共有属性和私有属性. 私有属性的定义方法eg:__age(若无次定义则默认为公有属性) 类属性举例: class people: name = "china" _ ...

  6. menuStrip鼠标滑过自动弹出

    public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void 退出系统T ...

  7. Salesforce LWC学习(三十二)实现上传 Excel解析其内容

    本篇参考:salesforce lightning零基础学习(十七) 实现上传 Excel解析其内容 上一篇我们写了aura方式上传excel解析其内容.lwc作为salesforce的新宠儿,逐渐的 ...

  8. js_笔记_8月7日记录_活动对象_作用域链_按值传递

    活动对象:简单说就是这个函数的参数和显示声明的变量或函数. 函数内接受的参数实际是创建了一个局部变量:[形参名] = [传进来的值],js的函数传参只传值. 作用域链:执行流进入一个函数,会先创建出作 ...

  9. java连接sql server--关于登录验证及对数据库增删改查应用

    一:步骤## 1.sql server建立数据库和相关表 2.建立数据源  (1).打开控制面板找到管理,打开ODBC选项或直接搜索数据源  (2).打开数据源配置后点击添加,选择sql server ...

  10. Android Studio 之 BaseAdapter 学习笔记

    •前行必备--ListView的显示与缓存机制 我们知道 ListView.GridView 等控件可以展示大量的数据信息. 假如下图中的 ListView 可以展示 100 条信息,但是屏幕的尺寸是 ...