0x01 Lotus Blossom 行动

  • 在 2015 年 6 月,国外安全厂商 Palo Alto Networks 的威胁情报团队 Unit42 发现了一起针对东南亚政府的一次间谍行为,试图获取该国家的内部运作信息,此次攻击行动代号为 Lotus Blossom
  • 通过恶意构造 Office 文档使目标上钩,从而在对方的计算机中植入木马,诱骗的内容包括电影邀请、明星照片、陆军机密文件、IT 升级计划等等
  • 其中就利用了著名的 CVE-2012-0158 Word 栈溢出漏洞(用烂了的),CVE-2012-0158 的成因是 MSCOMCTL 模块中对文档数据读取过滤不严导致堆栈溢出

0x02 构建漏洞分析环境

0x03 根据异常定位漏洞函数

  • 这一次并没有用到 Windbg,因为异常点并没有想要的信息;利用 Immunity Debugger 附加 Word 进程打开漏洞文档(也可以加载源文件,但是附加进程可以跳过文档启动过程,更方便)

  • 这个就是当前的运行程序,选择 WINWORD.EXE 程序

  • 让它运行起来

  • 打开 POC 文档触发异常

  • 此时汇编窗口是黑色的,凭经验判断是返回值错误导致的,离堆栈异常点最近的地方可以看出有一个叫 MSCOMCTL 的模块,地址是 0x275c8a0a

  • 载入 OD 运行

  • 由堆栈可知,在该函数返回的时候会被覆盖 0x41414141,故在函数开辟堆栈前先断下,重新运行,发现此时函数返回值还未被覆盖

  • 经过反复调试,发现执行完这个函数后返回值才被覆盖,所以进入这个函数

  • 终于在 0x275c87cb 中看到了可疑的复制指令,经过多次调试发现确实是这一个指令出了问题,指令执行之后,堆栈会被覆盖(edi 和 esi 满足条件后,这里要多执行几次)

  • 将有漏洞的模块载入到 IDA 当中,该模块是在 System32 中,并且基址和 0x275c87cb 相对应

  • 找到汇编指令漏洞触发点

  • 翻译成伪 C 代码,成功定位 memcpy 污点函数

0x04 追根溯源查找样本对应数据

  • 从 memcpy 的第三个参数入手,追根溯源;图中 ecx 就是复制的大小,也就是第三个参数,那么就追踪 ecx

  • 发现 ebx 传入 eax,而 ebx 的值又是 [ebp + 10h] 的地址,也就是 0x275c876d 函数的参数

  • 在 OD 中可以看到这个 0x8282 这个参数

  • 之后经过反复调试后,发现第一次调用该函数是获取样本中的 0x8282 这个数据,第二次调用该函数会将 0x8282 大小的数据复制到堆栈上造成溢出,再往下追根溯源就没有意义了

  • 这个就是样本中的数据,和覆盖返回值的 0x41414141 都在其中

0x05 利用 Offvis 工具定位样本中的格式字段

  • 本实验的 POC 是 RTF 格式,要想被 Offvis 认识,必须提取其中的 Word 格式,也就是图中的 D0CF…之后 ASCII 字符转换成 16 进制即可

  • 这里可以编写 python 脚本来实现转换(每两个字符变为一个 16 进制储存即可),这里为了方便利用 oletools 这个工具来转换

  • 这个就是转换好的 POC(提取码:8pb5) 文件,以 16 进制 DOCF 开头

  • 之后在 Offvis 中打开就可以了



  • 这里可以很清楚的看出,在 DirctoryEntries[4] 中的 OLESSDirctoryEntry[3] 中的 data 字段中出的问题

0x06 总结

  • 在污点函数方面,也就是出问题的函数 memcpy 并没有出乎我的意料,因为发生栈溢出无非是 memcpy,strcpy 等等函数
  • 在分析和对比样本中的数据和调试数据时,用到的方法也基本一致:定位异常触发点、跟踪堆栈找到问题函数、下内存断点进行污点跟踪和参数跟踪、使用工具对样本字段分析等等
  • 分析时从攻击者角度出发,理解是如何构造样本数据来挖掘漏洞的
  • 分析难点在于逆向理解函数,要清楚 C++ 、汇编和伪 C 代码之间的关系,尤其需要清楚 C++ 的指针和结构体在汇编中的调用,这需要扎实的逆向工程基础
  • 参考资料:0day安全:软件漏洞分析技术 + 漏洞战争

本次对于 CVE-2012-0158 堆溢出漏洞的分析到此结束,如有错误,欢迎指证

CVE-2012-0158:Microsoft Office MSCOMCTL.ocx 栈溢出漏洞调试分析的更多相关文章

  1. CVE-2011-0104:Microsoft Office Excel 中的栈溢出漏洞调试分析

    0x01 前言 CVE-2011-0104 是 Microsoft Office 中的 Excel(没有打补丁的情况下)表格程序在处理 TOOLBARDEF 中的 Record 字节时没有对 Len ...

  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. CVE-2017-11882:Microsoft office 公式编辑器 font name 字段栈溢出通杀漏洞调试分析

    \x01 漏洞简介 在 2017 年 11 月微软的例行系统补丁发布中,修复了一个 Office 远程代码执行漏洞(缓冲区溢出),编号为 CVE-2017-11882,又称为 "噩梦公式&q ...

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

    0x01 前言 上一篇讲到了 CVE-2011-0104 漏洞的成因和分析的方法,并没有对修复后的程序做分析.之后在一次偶然的情况下,想看一看是怎么修复的,结果却发现了一些问题 环境:修复后的 EXC ...

  6. CVE-2018-0802:Microsoft office 公式编辑器 font name 字段二次溢出漏洞调试分析

    \x01 前言 CVE-2018-0802 是继 CVE-2017-11882 发现的又一个关于 font name 字段的溢出漏洞,又称之为 "第二代噩梦公式",巧合的是两个漏洞 ...

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

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

  8. CVE-2012-0003:Microsoft Windows Media Player winmm.dll MIDI 文件堆溢出漏洞调试分析

    0x01 蜘蛛漏洞攻击包 前言:2012 年 2月,地下黑产中流行着一款国产名为蜘蛛漏洞的攻击包 -- "Zhi-Zhu Exploit Pack",该工具包含 5 个漏洞,都是在 ...

  9. CVE-2010-2553:Microsoft Cinepak Codec CVDecompress 函数堆溢出漏洞调试分析

    0x01 前言 微软提供一个叫 Cinepak 的视频解码器,通过调用 iccvid.dll 这个动态链接库文件可以使用这个解码器:微软自带的 Windows Media Player(视频音频软件) ...

随机推荐

  1. 手把手教你集成华为机器学习服务(ML Kit)人脸检测功能

    当给自己拍一张美美的自拍照时,却发现照片中自己的脸不够瘦.眼睛不够大.表情不够丰富可爱-如果此时能够一键美颜瘦脸并且添加可爱的贴纸的话,是不是很棒? 当家里的小孩观看iPad屏幕时间过长或者眼睛离屏幕 ...

  2. xss靶场大通关(持续更新ing)

      xss秘籍第一式(常弹) (1)进入自己搭建的靶场,发现有get请求,参数为name,可进行输入,并会将输入的内容显示于网页页面 (2)使用xss的payload进行通关: http://127. ...

  3. C语言入门-mingw64安装+配置

    OK,大家好,结合上期所说,本期让我们来配置编译器吧! 首先先下载mingw64离线包,官网下载慢,可以去群里下载,*.7z格式(有些同学可能没有解压软件,为了照顾这部分同学,笔者提供*.exe格式的 ...

  4. jQuery学习笔记(1) 初识jQuery

    目录 目录 引用 注意 HelloWorldHelloWorld! jQueryjQuery对象和DOMDOM对象的相互转换 冲突的解决 引用 本地文件引用: <script src=" ...

  5. Java中遍历集合的常用方法

    一.List 1.普通for循环 for (int i = 0; i < list.size(); i++)){ String temp = (String)list.get(i); Syste ...

  6. P1162_填涂颜色(JAVA语言)(速看!全洛谷最暴力解法!QAQ)

    思路:看了看数据n<=30,于是我们可以暴力求解(主要是BFS学的不咋地~2333).枚举每个0的位置,看上下左右四个方向上是否都有1.都有1的话说明被1包围,即在闭合圈的内部,开个数组标记一下 ...

  7. Shell 正则表达式详解

    Shell 正则表达式 什么是正则表达式? 正则表达式在每种语言中都会有,功能就是匹配符合你预期要求的字符串. 为什么要学正则表达式? 在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量 ...

  8. Clang Static Analyzer-使用手册-编写Checker框架

    Clang Static Analyzer-使用手册-编写Checker Checker是这个工具的灵魂 有了checker才可以检查你的代码 相当于就是CSA通过checker定义的检查方法去检查代 ...

  9. [树形DP]加分二叉树

    加 分 二 叉 树 加分二叉树 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第j ...

  10. Qt信号槽源码剖析(一)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的? 大部分人仍然不知道:也就是说大家只知道怎么使用,却不知道基于什么原 ...