cve-2010-3333 Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 分析
用的是泉哥的POC来调的这个漏洞
0x0 漏洞调试
Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞
Microsoft Office 是微软发布的非常流行的办公软件套件。
基于Mac平台的Microsoft Office XP SP3,Office 2003 SP3,Office 2007
SP2,Office 2010,Office 2004以及2008版本,基于Mac 2011平台的Office,以及基于MAC平台的Open
XML文件格式转换器中存在基于栈的缓冲区溢出漏洞。远程攻击者可以借助特制的RTF数据执行任意代码。该漏洞又名"RTF栈缓冲区溢出漏洞"。
加载POC后,程序中断在如下所示位置
(8a0.b70): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0000c8ac ebx= ecx=0000019b edx= esi=1051c24c edi=
eip=30edf864 esp=00123d98 ebp=00123dd0 iopl= nv up ei pl nz na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
mso!Ordinal1488+0x29fd:
30edf864 f3a5 rep movs dword ptr es:[edi],dword ptr [esi] es::= ds::1051c24c=4c36744c
此时若是查看栈回溯会发现得不到正确的结果,判断应该是栈被覆盖导致栈回溯被破坏得不到正确的结果,于是对mso!Ordinal1488+0x29fd:位置下断。重新执行程序发现可以正常的得到回溯结果了。栈回溯结果如下
:> kp
ChildEBP RetAddr
WARNING: Stack unwind information not available. Following frames may be wrong.
00123dd0 30f0f3cb mso!Ordinal1488+0x29fd
00123e00 30f0f359 mso!Ordinal901+0x2a3c
0012404c 30d4d762 mso!Ordinal901+0x29ca
30d4d70b mso!Ordinal4925+0x53
30d4d47d mso!Ordinal5148+0x36
0012407c 06270b10 mso!Ordinal4783+0x12f
06270b48 0x6270b10
062709f8 0x6270b48
30dd112c 0x62709f8
0012408c mso!Ordinal2940+0x1588c
可以看到本段函数是由mso!Ordinal901+0x2a3c(30f0f3cb)调用而来,对30f0f3cb函数进行查看发现并不是调用到本函数的,而是调用了 sub_30F0F422。如下所示
:> ub 30f0f3cb
mso!Ordinal901+0x2a28:
30f0f3b7 23c1 and eax,ecx
30f0f3b9 push eax
30f0f3ba 8d47ff lea eax,[edi-]
30f0f3bd push eax
30f0f3be 8b4508 mov eax,dword ptr [ebp+]
30f0f3c1 6a00 push
30f0f3c3 ff750c push dword ptr [ebp+0Ch]
30f0f3c6 e857000000 call mso!Ordinal901+0x2a93 (30f0f422)
跟进sub_30F0F422里面也没有发现有直接调用30edf864所在函数的语句。用ida加载MSO.dll文件,发现30edf864所在的函数被IDA识别为数据,自行创建函数之后求交叉引用发现此地址被置于如下所示的数据表中,推测是某一个对象的虚表?
.text:30DA6114 dd offset sub_30EDF83E
总之发现了30f0f422对30edf864所在函数的调用关系。
分析30edf864所在的sub_30EDF83E函数可以看到,所执行的rep movsd指令的edi(复制的目的地址)为2号参数。复制的次数为 (*(参数1+8)&65535)/4 。复制的源地址为 *(参数1+8)&65535*参数3+*(参数1+16) 。看起来很奇怪是不是我也觉得很奇怪,但是觉得可能是某个对象的this指针。我们先对mso!Ordinal1488+0x29fd(30edf864)下断,重新运行程序断在这里,这时可以看到ecx的值为0x322b如下所示。我们知道这个大小意味着相当的大(0x322b=13099,13099x4=52396),共52396个字节。
:> r
eax=0000c8ac ebx= ecx=0000322b edx= esi=1051000c edi=00123dc0
eip=30edf864 esp=00123d98 ebp=00123dd0 iopl= nv up ei pl nz na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
mso!Ordinal1488+0x29fd:
30edf864 f3a5 rep movs dword ptr es:[edi],dword ptr [esi] es::00123dc0=ffff0000 ds::1051000c=
无论如何栈也是承受不了这样的大小的。那么到底能承受多少呢?我们来看下。
.text:30F0F422 var_10 = dword ptr -10h .text:30F0F44B lea ecx, [ebp+var_10]
.text:30F0F44E push ecx
.text:30F0F44F mov ebx, 5000000h
.text:30F0F454 push esi
.text:30F0F455 mov [ebp+var_C], ebx
.text:30F0F458 call dword ptr [eax+1Ch] //调用sub_30EDF83E
由上面可以知道,复制的目的地址就是var_10,一个sub_30F0F422中的4字节的局部变量。试图往4个字节中拷贝个字节,这样肯定是会溢出的了。我们进一步看一下栈的情况
:> dc edi
00123dc0 ffff00ff 00e4ffff ................
00123dd0 00123e00 30f0f3cb 00123f3c .>.....<?......
00123de0 ffffffff 01280b28 ........(.(. D..
00123df0 0012408c 00124e38 001240b0 .@..8N...@......
00123e00 00123fe4 30f0f359 00123f88 00123f3c .?..Y...?..<?..
00123e10 01280b28 0012408c ....(.(..@.. D..
00123e20 ffffffff ffffffff ffffffff ................
00123e30 ....... ........
:> kp
ChildEBP RetAddr
WARNING: Stack unwind information not available. Following frames may be wrong.
00123dd0 30f0f3cb mso!Ordinal1488+0x29fd
00123e00 30f0f359 mso!Ordinal901+0x2a3c
0012404c 30d4d762 mso!Ordinal901+0x29ca
30d4d70b mso!Ordinal4925+0x53
30d4d47d mso!Ordinal5148+0x36
0012407c 01280b10 mso!Ordinal4783+0x12f
01280b48 0x1280b10
012809f8 0x1280b48
30dd112c 0x12809f8
0012408c mso!Ordinal2940+0x1588c
可见最多达到16byte时会覆盖ebp,然后是返回地址。
0x1 漏洞分析
我们在前面看了一下漏洞触发的原理,但是漏洞为什么会存在还并没有搞清楚。我们回过头来看一下漏洞描述可以知道这是对rtf文件的解析不正确所导致漏洞。那么我们来看下拷贝的东西是什么
:> db esi
1109000c ba 1e 1d d9 c7 d9- f4 5e c9 b1 ........t$.^)..
1109001c ee fc 0e - 6a f0 c3 e3 fb ...1V..H.j.....p
1109002c e1 de- b2 dd ..r.%.....a...'&
1109003c 2e ef 1e d6 - af d6 2a da b1 aa ...I...d...*...
1109004c 0f fb d3 e1-ad 8c 6e 1f b6 b9 ....BS.....n...
1109005c 9c b7 6d 9c cf fd- 7a 2d c1 f1 5c d5 ..m9....iz.-..\.
1109006c 5d 7d e4 be bd af-cb 2e 1a ba i]}...A..v1..G..
1109007c ae 6f c1 - 6b 2d fa b...oT...#9k-..
在poc文件中搜索一下,如下图
咦,acc8这个数有点熟悉啊
:> g
ModLoad: 05da0000 05f41000 C:\Program Files\Microsoft Office\OFFICE11\GdiPlus.DLL
Breakpoint hit
eax=0000c8ac ebx= ecx=0000c8ac edx= esi=1051000c edi=00123dc0
eip=30edf861 esp=00123d98 ebp=00123dd0 iopl= nv up ei pl nz na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
mso!Ordinal1488+0x29fa:
30edf861 c1e902 shr ecx,
注意看ecx,明显是信任了rtf文件的给出的大小而没有进行自己的验证,而那些.doc的样本其实就是rtf文件改了一下后缀名,其实还是按照rtf进行解析的。搞定!
ps:win7通用的jmp esp 7ffa4512
cve-2010-3333 Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 分析的更多相关文章
- CVE-2011-0104 Microsoft Office Excel缓冲区溢出漏洞 分析
漏洞简述 Microsoft Excel是Microsoft Office组件之一,是流行的电子表格处理软件. Microsoft Excel中存在缓冲区溢出漏洞,远程攻击者可利用此 ...
- How to open MS word document from the SharePoint 2010 using Microsoft.Office.Interop.dll
or this you must change the identity of word component inC:\windows\System32\comexp.mscto be interac ...
- Microsoft office word关闭英文输入首字母大写设置
1.概述: 在使用office word的时,经常出现输入一段不需首字母大写的英文时,通常敲击完回车时word会自动将首字母大写,需要重新将首字母修改成小写,这样操作很不方便.于是需要对这个功能进行一 ...
- 如何安装 Microsoft Office 兼容包,以便您可以在早期版本的 Microsoft Office 中打开和保存 Office Open XML 格式
https://support.microsoft.com/zh-cn/kb/923505 针对 Office 2003 的支持已终止 Microsoft 已于 2014 年 4 月 8 日终止了针对 ...
- 安装InfoPath 2013后 SharePoint 2010 出现 “找不到 Microsoft.Office.InfoPath, Version=14.0.0....” 的错误的解决方案
1. 症状 您的SharePoint 2010的服务器是不是最近一直出现这个错误呢? Could not load file or assembly 'Microsoft.Office.InfoPat ...
- 激活Microsoft Office professional plus 2010
1. 下载工具 http://pan.baidu.com/s/1dDDFhEL 2. 启动工具 双击Office 2010 Toolkit.exe 在Activation选项栏中选择AutoKMS C ...
- Microsoft Office 2010/2013安装组件预设
日常维护中,多台电脑需要安装Office,可是Office包含的组件又很多(Excel/Word/PPT/OUTLOOK/ACCESS等),有些是不需要的,默认情况下Office都默认安装,一个一个调 ...
- Embedding Documents in Word 2007 by Using the Open XML SDK 2.0 for Microsoft Office
Download the sample code This visual how-to article presents a solution that creates a Word 2007 doc ...
- Microsoft Office 2010 Pro VOL简体中文正式版
网友们期待的Microsoft Office Professional Plus 2010 VOL简体中文正式版.所谓的“VOL”,即是Volume Licensing for Organizatio ...
随机推荐
- Netlink 介绍(译)
原文地址:http://people.redhat.com/nhorman/papers/netlink.pdf 译文: 1 介绍 在Linux和Unix的众多发行版中的网络配置功能, 都是编程者事后 ...
- Kubernetes Deloyment实现滚动更新
目录 滚动更新简介 使用kubectl rolling-update更新RC Deployment的rolling-update 滚动更新简介 当kubernetes集群中的某个服务需要升级时,传统的 ...
- ubunto 16.04 lts 源
http://601502546.blog.163.com/blog/static/2596107620171502517889 国内有很多ubuntu的源,包括:网易源(这个之前用过,速度很快的), ...
- asp.net获取当前页面的url地址
设当前页完整地址是:http://www.jb51.net/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 "www.jb5 ...
- element ui 上传文件,读取内容乱码解决
element ui 上传文件,读取内容乱码解决: 加第二个参数 reader.readAsText(file.raw,'gb2312'); <el-upload class="upl ...
- CSS3实战之box-shadow篇
box-shadow属性包含6个参数值:阴影类型.X轴位移.Y轴位移.阴影大小.阴影扩展和阴影颜色.这6个参数值可以有选择地省略. 现在我们用一个img元素来举栗子 我们先来写最简单的box-shad ...
- GitHub更新已经fork的项目
clone 自己的 fork 分支到本地 可以直接使用 GitHub 客户端,clone 到本地,如果使用命令行,命令为: $ git clone git@github.com:morethink/g ...
- 精心整理的十个必须要知道CSS+DIV技巧
1.css font的简写规则 当我们写字体样式的时候,我们也许会这样子写 font-size: 1em; line-height: 1.5em; font-weight: bold; font-s ...
- 【转】线程间操作无效: 从不是创建控件“textBox2” 的线程访问它。
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- Python概念-__del__的悲伤
__del__了不得了,这个是在回收实例化对象时触发执行的方法 每当del 实例化对象时会触发 或者是程序结束时,会触发,总之就是实例化对象失效时都会执行__del__方法 代码示例: class F ...