CVE-2011-0104 Microsoft Office Excel缓冲区溢出漏洞 分析
漏洞简述
Microsoft Excel是Microsoft Office组件之一,是流行的电子表格处理软件。
Microsoft
Excel中存在缓冲区溢出漏洞,远程攻击者可利用此漏洞以当前用户权限执行任意代码,造成拒绝服务。Microsoft Office
Excel处理特制Excel文件的方式中存在一个远程代码执行漏洞。成功利用此漏洞的攻击者便可完全控制受影响的系统。攻击者可随后安装程序;查看、更
改或删除数据;或者创建拥有完全用户权限的新帐户。
同样是用泉哥的poc去调的,打开poc,EXCEL退出,说明漏洞正常触发。本来第一次是用那个exp去调的,结果应该是我的excel版本有问题,导致exp执行到一个很奇怪的地方,栈什么的通通被破坏了,感觉无从下手,除非抓出来文件中的shellcode代码,从shellcode入手才行,所以这里就改用poc来调了。用windbg挂载excel打开poc崩溃信息如下所示,可以看到是被9090给填满了。我们的目的是找到溢出栈的语句,即关键语句,那么首先我们得搞清楚栈是谁的栈?
(b50.): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax= ebx=0013ca60 ecx= edx= esi= edi=
eip=300e9eda esp=0013aa1c ebp=0013aa88 iopl= nv up ei ng nz na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
*** ERROR: Symbol file could not be found. Defaulted to export symbols for Excel.EXE -
Excel!Ordinal41+0xe9eda:00e9eda mov dword ptr [eax],ecx ds::=????????
执行dc esp;dc ebp ,结果如下。可以看这条语句所处的栈保护栈下的空间已经被90给完全覆盖了,这说明就是Excel!Ordinal41+0xe9eda这条语句所处的函数的栈发生了溢出。为什么一定要揪出是哪个函数的栈呢?因为只有知道是哪个函数的栈才可以像泉哥说的那样去对栈底下写入断点。
为了确认,我们可以看下栈回溯但是估计栈被搞成这样子估计是不行了。执行kp,结果如下,果然不行了。
:> kp
ChildEBP RetAddr
WARNING: Stack unwind information not available. Following frames may be wrong.
0013aa88 Excel!Ordinal41+0xe9eda
0013aa8c 0x90909090
0013aa90 0x90909090
0013aa94 0x90909090
0013aa98 0x90909090
0013aa9c 0x90909090
0013aaa0 0x90909090
0013aaa4 0x90909090
0013aaa8 0x90909090
0013aaac 0x90909090
0013aab0 0x90909090
0013aab4 0x90909090
0013aab8 0x90909090
0013aabc 0x90909090
0013aac0 0x90909090
0013aac4 0x90909090
0013aac8 0x90909090
0013aacc 0x90909090
0013aad0 0x90909090
0013aad4 0x90909090
我们用ida打开excel.exe,定位到Excel!Ordinal41+0xe9eda语句,然后发现是属于sub_300E9D90的,对300E9D90下断,重新执行程序,断到300E9D90时对栈底下断点,关于栈底有几个基本的知识,比如ebp+4是返回地址ebp+8是第一个参,这个是常识。我们对ebp+4下写入断点,继续执行发现可以断到类memcpy函数。如下所示,这里注意下,等栈帧建立好了再去对ebp+4下断。之前就是忘了这个,还在一脸懵逼的想怎么没断下来。
Breakpoint hit
eax=0013ae10 ebx= ecx=76ab6048 edx= esi= edi=0013ca60
eip=300e9d90 esp=0013aa8c ebp=0013ad9c iopl= nv up ei pl zr na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
Excel!Ordinal41+0xe9d90:00e9d90 push ebp
:> p
eax=0013ae10 ebx= ecx=76ab6048 edx= esi= edi=0013ca60
eip=300e9d91 esp=0013aa88 ebp=0013ad9c iopl= nv up ei pl zr na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
Excel!Ordinal41+0xe9d91:00e9d91 8bec mov ebp,esp
:> p
eax=0013ae10 ebx= ecx=76ab6048 edx= esi= edi=0013ca60
eip=300e9d93 esp=0013aa88 ebp=0013aa88 iopl= nv up ei pl zr na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
Excel!Ordinal41+0xe9d93:00e9d93 83ec60 sub esp,60h
:> ba w ebp+
:> g
Breakpoint hit
eax= ebx= ecx=000000a0 edx= esi=3088fc20 edi=0013aaa7
eip=300e9d60 esp=001379c8 ebp=0013aa27 iopl= nv up ei pl nz na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
Excel!Ordinal41+0xe9d60:00e9d60 f3a5 rep movs dword ptr es:[edi],dword ptr [esi] es::0013aaa7=4a5f7800 ds::3088fc20=
可以看到300e9d60就是我们要的复制语句了,我们对300e9d60下断重新运行,发现ecx变了。说明这里是一个子函数,而且这个子函数被调用过多次。我们对这个语句下一个条件记录断点来看一下到底这个函数是怎么被调用的。使用语句bu Excel!Ordinal41+0xe9d5e "r ecx;gc"来记录复制语句到底是怎么被调用的。重新运行,结果如下。可以看到总共被调用了2次。第一次是1,第二次是0xc0,用屁股想一想也知道1肯定不会溢出。
:> g
ecx=
ecx=000000c0
(9e4.ae0): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax= ebx=0013ca60 ecx= edx= esi= edi=
eip=300e9eda esp=0013aa1c ebp=0013aa88 iopl= nv up ei ng nz na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
Excel!Ordinal41+0xe9eda:00e9eda mov dword ptr [eax],ecx ds::=????????
于是在第二次执行到这里时断下。kp一下看栈回溯,结果发现很有问题。。如下
:> kp
ChildEBP RetAddr
WARNING: Stack unwind information not available. Following frames may be wrong.
0013aa27 13aa88b6 Excel!Ordinal41+0xe9d5e
0013aa2b a7cfe000 0x13aa88b6
0013aa2f 13ca6006 0xa7cfe000
0013aa33 0x13ca6006
0x13aa88b6这个地址明显是有问题,我们对retn 0Ch下断,发现要返回时,返回地址变了=。=,如下所示。。。
:> g
Breakpoint hit
eax= ebx=000000ff ecx= edx= esi=0013aa27 edi=0000303c
eip=300e9d8d esp=001379d8 ebp=00139ac4 iopl= nv up ei pl nz na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
Excel!Ordinal41+0xe9d8d:00e9d8d c20c00 ret 0Ch
:> dd esp l1
001379d8 3070e44e
我们对这个函数下记录断点,如下,0x300=4*0xc0。而0013aa27就是复制的目的地址。
:> bu Excel!Ordinal41+0xe9d18 "dc esp l3;gc"
001379d8 3070e31a 001379e8 ..p0.y......
001379d8 3070e44e 0013aa27 N.p0'.......
由此我们来看一下程序的流程,如下图
call sub_300E9CF1 ; 计算要复制的大小
mov edi, [ebp+0F3Ch+var_F08]
imul edi, [ebp+0F3Ch+var_ECC]
mov [ebp+0F3Ch+var_EC0], eax
mov eax, [ebp+0F3Ch+var_ED0]
lea esi, [edi+eax+]
call sub_300C5576
push 0FFFFFFFDh
pop ecx
sub ecx, edi
add eax, ecx
push eax
push [ebp+0F3Ch+var_EC0]
push esi
call sub_300E9D18 ; 参1 目的地址
; 参2 复制的大小、
; 参3 复制的最大值
到这里漏洞分析就已经结束了,下面会来研究一下为什么会产生这个漏洞。
CVE-2011-0104 Microsoft Office Excel缓冲区溢出漏洞 分析的更多相关文章
- cve-2010-3333 Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 分析
用的是泉哥的POC来调的这个漏洞 0x0 漏洞调试 Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 Microsoft Office 是微软发布的非常流行的办公 ...
- CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
Adobe Acrobat和Reader都是美国Adobe公司开发的非常流行的PDF文件阅读器. 基于Window和Mac OS X的Adobe Reader和Acrobat 9.4之前的9.x ...
- TP-Link TL-WR841N v14 CVE-2019-17147 缓冲区溢出漏洞分析笔记v2018.12.31
0x00 背景 Httpd服务中的缓冲区溢出漏洞 复现参考文章https://www.4hou.com/posts/gQG9 Binwalk -Me 解压缩 File ./bin/busybox文件类 ...
- CVE-2009-0927-Adobe Reader缓冲区溢出漏洞分析
0x00概述: 此漏洞的成因是由于Adobe Reader在处理PDF文档中所包含的JavaScript脚本时的Collab对象的getlcon()方式不正确处理输入的参数,而产生的缓冲区溢出,成功利 ...
- CVE-2010-2883-CoolType.dll缓冲区溢出漏洞分析
前言 此漏洞是根据泉哥的<漏洞战争>来学习分析的,网上已有大量分析文章在此只是做一个独立的分析记录. 复现环境 操作系统 -> Windows XP Sp3 软件版本 -> A ...
- CVE-2011-0104:Microsoft Office Excel 中的栈溢出漏洞调试分析
0x01 前言 CVE-2011-0104 是 Microsoft Office 中的 Excel(没有打补丁的情况下)表格程序在处理 TOOLBARDEF 中的 Record 字节时没有对 Len ...
- Microsoft Office Excel 不能访问文件及COM无法访问
Microsoft Office Excel 不能访问文件及COM无法访问 Microsoft Office Excel 不能访问文件“*.xls”. 可能的原因有: 1 文件名称或路径不存在. 2 ...
- Microsoft Office Excel 不能访问文件 的解决办法
Microsoft Office Excel 不能访问文件"a.xls". 可能的原因有: ? 文件名称或路径不存在. ? 文件正被其他程序使用. ? 您正要保存的工作簿与当前 ...
- [Excel操作]Microsoft Office Excel 不能访问文件
最近,客户服务器迁移,因操作系统环境变化而引起的的环境问题一堆,遇到的问题并解决方法在“[Excel]操作”类别会体现. Microsoft Office Excel 不能访问文件“C:\\LMSEx ...
随机推荐
- fcntl文件锁操作
文件锁经常应用于两个方面:1.一是锁定文件中的临界数据,比如并发投票时文件记录的投票数2.二是利用具有互斥性质的写锁,实现进程的并发控制. /*使用文件锁*/<F5>#include &l ...
- NAT ------ 内网的主机如何通过路由器与外网的主机通信
内网主机A,路由器B,外网主机C 使用了两个协议: 路由:位于网络层,为数据包提供一个寻径的算法,不改变数据包的源IP和目的IP,但是会修改源MAC和目的MAC,只在同个网段的进行数据的转发 NAT: ...
- 【Asp.net入门5-02】创建数据模型和存储库
- python3.5无法安装pip,报错ImportError: cannot import name 'HTTPSHandler'
本人系统为:centos6 解决方法: 1 安装openssl yum install openssl 2 安装openssl-devel yum install openssl-devel 3 ...
- python基础之赋值/深copy/浅copy
首先,不管是赋值还是深浅copy,都是针对那些可能会产生变化的值进行区分的,也就是对于数字,字符串来说,区分赋值,深浅copy是毫无意义的. 那么,让我们来对那些可变的像list set dict t ...
- 模块型css样式
<div id="dowork"> <div id="dowork_on">۞作业进行中</div> <div id= ...
- NOI2006 最大获利(最大权闭合子图)
codevs 1789 最大获利 2006年NOI全国竞赛 时间限制: 2 s 空间限制: 128000 KB 题目描述 Description 新的技术正冲击着手机通讯市场,对于各大运营商来 ...
- 浅谈splay的双旋
昨晚终于明白了splay双旋中的一些细节,今日整理如下 注:题目用的2002HNOI营业额统计,测试结果均来及codevs 网站的评测结果 http://codevs.cn/problem/1296/ ...
- 2016/2/13 《计算机系统要素》(The Elements of Computing Systems)读书笔记(1)
过年期间一直在啃一本书,学习计算机组成原理. 这是一本很棒的书,是一个基于项目的学习过程.可以让人理解的很深刻. coursera上有这本书前半部分的教程,是由书的作者团队们开的课,个人认为很棒,可惜 ...
- (一)在Lingo中使用集合
1. 在Lingo中使用集合 4.1 集合的基本用法和lingo模型的基本要素 Lingo虽然使用方便,但是如果要解决几万个,几十万个变量的优化问题时,我们总不能一个一个地列出x1,x2,…,x ...