博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CVE-2011-0104 Microsoft Office Excel缓冲区溢出漏洞 分析
阅读量:5272 次
发布时间:2019-06-14

本文共 5692 字,大约阅读时间需要 18 分钟。

    漏洞简述

     Microsoft Excel是Microsoft Office组件之一,是流行的电子表格处理软件。

        Microsoft Excel中存在缓冲区溢出漏洞,远程攻击者可利用此漏洞以当前用户权限执行任意代码,造成拒绝服务。Microsoft Office Excel处理特制Excel文件的方式中存在一个远程代码执行漏洞。成功利用此漏洞的攻击者便可完全控制受影响的系统。攻击者可随后安装程序;查看、更 改或删除数据;或者创建拥有完全用户权限的新帐户。

    同样是用泉哥的poc去调的,打开poc,EXCEL退出,说明漏洞正常触发。本来第一次是用那个exp去调的,结果应该是我的excel版本有问题,导致exp执行到一个很奇怪的地方,栈什么的通通被破坏了,感觉无从下手,除非抓出来文件中的shellcode代码,从shellcode入手才行,所以这里就改用poc来调了。用windbg挂载excel打开poc崩溃信息如下所示,可以看到是被9090给填满了。我们的目的是找到溢出栈的语句,即关键语句,那么首先我们得搞清楚栈是谁的栈?

(b50.900): Access violation - code c0000005 (first chance)First chance exceptions are reported before any exception handling.This exception may be expected and handled.eax=90909090 ebx=0013ca60 ecx=00000006 edx=01155000 esi=00000000 edi=00000400eip=300e9eda esp=0013aa1c ebp=0013aa88 iopl=0         nv up ei ng nz na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010286*** ERROR: Symbol file could not be found.  Defaulted to export symbols for Excel.EXE - Excel!Ordinal41+0xe9eda:300e9eda 8908            mov     dword ptr [eax],ecx  ds:0023:90909090=????????

执行dc esp;dc ebp ,结果如下。可以看这条语句所处的栈保护栈下的空间已经被90给完全覆盖了,这说明就是Excel!Ordinal41+0xe9eda这条语句所处的函数的栈发生了溢出。为什么一定要揪出是哪个函数的栈呢?因为只有知道是哪个函数的栈才可以像泉哥说的那样去对栈底下写入断点。

为了确认,我们可以看下栈回溯但是估计栈被搞成这样子估计是不行了。执行kp,结果如下,果然不行了。

0:000> kpChildEBP RetAddr  WARNING: Stack unwind information not available. Following frames may be wrong.0013aa88 90909090 Excel!Ordinal41+0xe9eda0013aa8c 90909090 0x909090900013aa90 90909090 0x909090900013aa94 90909090 0x909090900013aa98 90909090 0x909090900013aa9c 90909090 0x909090900013aaa0 90909090 0x909090900013aaa4 90909090 0x909090900013aaa8 90909090 0x909090900013aaac 90909090 0x909090900013aab0 90909090 0x909090900013aab4 90909090 0x909090900013aab8 90909090 0x909090900013aabc 90909090 0x909090900013aac0 90909090 0x909090900013aac4 90909090 0x909090900013aac8 90909090 0x909090900013aacc 90909090 0x909090900013aad0 90909090 0x909090900013aad4 90909090 0x90909090

我们用ida打开excel.exe,定位到Excel!Ordinal41+0xe9eda语句,然后发现是属于sub_300E9D90的,对300E9D90下断,重新执行程序,断到300E9D90时对栈底下断点,关于栈底有几个基本的知识,比如ebp+4是返回地址ebp+8是第一个参,这个是常识。我们对ebp+4下写入断点,继续执行发现可以断到类memcpy函数。如下所示,这里注意下,等栈帧建立好了再去对ebp+4下断。之前就是忘了这个,还在一脸懵逼的想怎么没断下来。

Breakpoint 0 hiteax=0013ae10 ebx=00000000 ecx=76ab6048 edx=00000000 esi=00000001 edi=0013ca60eip=300e9d90 esp=0013aa8c ebp=0013ad9c iopl=0         nv up ei pl zr na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246Excel!Ordinal41+0xe9d90:300e9d90 55              push    ebp0:000> peax=0013ae10 ebx=00000000 ecx=76ab6048 edx=00000000 esi=00000001 edi=0013ca60eip=300e9d91 esp=0013aa88 ebp=0013ad9c iopl=0         nv up ei pl zr na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246Excel!Ordinal41+0xe9d91:300e9d91 8bec            mov     ebp,esp0:000> peax=0013ae10 ebx=00000000 ecx=76ab6048 edx=00000000 esi=00000001 edi=0013ca60eip=300e9d93 esp=0013aa88 ebp=0013aa88 iopl=0         nv up ei pl zr na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246Excel!Ordinal41+0xe9d93:300e9d93 83ec60          sub     esp,60h0:000> ba w 1 ebp+40:000> gBreakpoint 1 hiteax=00000300 ebx=00000300 ecx=000000a0 edx=00000300 esi=3088fc20 edi=0013aaa7eip=300e9d60 esp=001379c8 ebp=0013aa27 iopl=0         nv up ei pl nz na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206Excel!Ordinal41+0xe9d60:300e9d60 f3a5            rep movs dword ptr es:[edi],dword ptr [esi] es:0023:0013aaa7=4a5f7800 ds:0023:3088fc20=90909090

可以看到300e9d60就是我们要的复制语句了,我们对300e9d60下断重新运行,发现ecx变了。说明这里是一个子函数,而且这个子函数被调用过多次。我们对这个语句下一个条件记录断点来看一下到底这个函数是怎么被调用的。使用语句bu Excel!Ordinal41+0xe9d5e "r ecx;gc"来记录复制语句到底是怎么被调用的。重新运行,结果如下。可以看到总共被调用了2次。第一次是1,第二次是0xc0,用屁股想一想也知道1肯定不会溢出。

0:000> gecx=00000001ecx=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=90909090 ebx=0013ca60 ecx=00000006 edx=01155000 esi=00000000 edi=00000400eip=300e9eda esp=0013aa1c ebp=0013aa88 iopl=0         nv up ei ng nz na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010286Excel!Ordinal41+0xe9eda:300e9eda 8908            mov     dword ptr [eax],ecx  ds:0023:90909090=????????

于是在第二次执行到这里时断下。kp一下看栈回溯,结果发现很有问题。。如下

0:000> kpChildEBP RetAddr  WARNING: Stack unwind information not available. Following frames may be wrong.0013aa27 13aa88b6 Excel!Ordinal41+0xe9d5e0013aa2b a7cfe000 0x13aa88b60013aa2f 13ca6006 0xa7cfe0000013aa33 00000000 0x13ca6006

 0x13aa88b6这个地址明显是有问题,我们对retn    0Ch下断,发现要返回时,返回地址变了=。=,如下所示。。。

0:000> gBreakpoint 1 hiteax=00000300 ebx=000000ff ecx=00000000 edx=00000320 esi=0013aa27 edi=0000303ceip=300e9d8d esp=001379d8 ebp=00139ac4 iopl=0         nv up ei pl nz na pe nccs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206Excel!Ordinal41+0xe9d8d:300e9d8d c20c00          ret     0Ch0:000> dd esp l1001379d8  3070e44e

我们对这个函数下记录断点,如下,0x300=4*0xc0。而0013aa27就是复制的目的地址。

0:000> bu Excel!Ordinal41+0xe9d18 "dc esp l3;gc"001379d8  3070e31a 001379e8 00000004           ..p0.y......001379d8  3070e44e 0013aa27 00000300           N.p0'.......

 由此我们来看一下程序的流程,如下图

call    sub_300E9CF1    ; 计算要复制的大小mov     edi, [ebp+0F3Ch+var_F08]imul    edi, [ebp+0F3Ch+var_ECC]mov     [ebp+0F3Ch+var_EC0], eaxmov     eax, [ebp+0F3Ch+var_ED0]lea     esi, [edi+eax+3]call    sub_300C5576push    0FFFFFFFDhpop     ecxsub     ecx, ediadd     eax, ecxpush    eaxpush    [ebp+0F3Ch+var_EC0]push    esicall    sub_300E9D18      ; 参1 目的地址                          ; 参2 复制的大小、                          ; 参3 复制的最大值

到这里漏洞分析就已经结束了,下面会来研究一下为什么会产生这个漏洞。

转载于:https://www.cnblogs.com/Ox9A82/p/5713482.html

你可能感兴趣的文章
负载均衡策略
查看>>
微信智能开放平台
查看>>
ArcGIS Engine 中的绘制与编辑
查看>>
Oracle--通配符、Escape转义字符、模糊查询语句
查看>>
c# 文件笔记
查看>>
第一页 - 工具的使用(webstorm)
查看>>
Linux 进程资源用量监控和按用户设置进程限制
查看>>
D3.js 之 d3-shap 简介(转)
查看>>
制作满天星空
查看>>
类和结构
查看>>
CSS3选择器(二)之属性选择器
查看>>
adidas crazylight 2018 performance analysis review
查看>>
typeset shell 用法
查看>>
python 之 循环语句
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
[转]ceph网络通信模块_以monitor模块为例
查看>>
HDOJ 1754 I Hate It(线段树基本操作)
查看>>
latex tree
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>