Microsoft Windows是微软发布的非常流行的操作系统。
        Microsoft Windows XP SP2和SP3,Windows Vista SP1和SP2,以及Windows
7中的Cinepak 编码解码器处理受支持格式文件的方式中存在一个远程执行代码漏洞。 如果用户打开特制的媒体文件,此漏洞可能允许执行代码。
如果用户使用管理用户权限登录,成功利用此漏洞的攻击者便可完全控制受影响的系统。
攻击者可随后安装程序;查看、更改或删除数据;或者创建拥有完全用户权限的新帐户。
那些帐户被配置为拥有较少系统用户权限的用户比具有管理用户权限的用户受到的影响要小。

     我们已知这是一个堆漏洞了,那么肯定少不了去加上hpa和ust调试支持以便于第一时间的获取崩溃信息。加载poc,崩溃信息如下:

(4a8.b8): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax= ebx=0e0defc0 ecx= edx=0e6afd38 esi=0e4c1000 edi=0e4c3000
eip=73b722cc esp=0e6afd04 ebp=0e6afd30 iopl= nv up ei pl zr na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
iccvid!CVDecompress+0x11e:
73b722cc f3a5 rep movs dword ptr es:[edi],dword ptr [esi] es::0e4c3000=???????? ds::0e4c1000=

目测是往堆里复制溢出了引发的异常。我们看下edi=0e4c3000到底是不是堆,!heap -p -a 0e4c3000 输出如下,看来真的是堆,符合我们的推测

:> ?edi
Evaluate expression: = 0e4c3000
:> !heap -p -a 0e4c3000
address 0e4c3000 found in
_DPH_HEAP_ROOT @ a1000
in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize)
e128c30: e4bd000 - e4bc000
7c938f01 ntdll!RtlAllocateHeap+0x00000e64
7c809a7f kernel32!LocalAlloc+0x00000058
73b724a8 iccvid!CVDecompressBegin+0x00000080
73b7c6a0 iccvid!DecompressBegin+0x00000214
73b766a1 iccvid!DriverProc+0x00000198
73b41938 MSVFW32!ICSendMessage+0x0000002b
7cf8df11 quartz!CAVIDec::StartStreaming+0x00000278
7cfbfa7a quartz!CVideoTransformFilter::Receive+0x000000cf
7cf90929 quartz!CTransformInputPin::Receive+0x00000033
7cf8e672 quartz!CBaseOutputPin::Deliver+0x00000022
7cf90c90 quartz!CBaseMSRWorker::TryDeliverSample+0x00000102
7cf90e0c quartz!CBaseMSRWorker::PushLoop+0x0000015e
7cf8ce28 quartz!CBaseMSRWorker::DoRunLoop+0x0000004a
7cf8dbde quartz!CBaseMSRWorker::ThreadProc+0x00000039
7c80b729 kernel32!BaseThreadStart+0x00000037

我们这里简单的算一个数学问题e4bd000+6000=E4C3000,而异常时正断在E4C3000这也是页堆的功劳,不了解页堆的可以看我前面写的博文或者《软件调试》。我们再来看看ecx的值

:> ? ecx
Evaluate expression: =

很明显这个ecx是小于堆的0x6000个字节的。我们对73b722cc下断,来看看到底谁造成的溢出。我们重新断下结果如下,可以看出ecx=800,而edi=0f488000,我们知道堆底在f486000+6000=F48C000明显没有溢出。我们推测是经过了多次复制才导致了溢出,对这个复制语句上方下条件记录断点,如图

'条件记录断点:'
edi=0e4cb000
ecx=
'条件记录断点:'
edi=0e4cd000
ecx=
'条件记录断点:'
edi=0e4cf000
ecx=

我们看最后的一次edi+ecx*4=0xe4cf00+0x800*4=E4EF00所以是大于,堆底的0xE4C3000+0x6000=E4CF000。就是说可以容纳0x6000个字节,但是从0x2000的位置向堆中写那么就会有0x2000个字节的溢出了。下三次条件断点,查看栈回溯即可得到如下的结果,可见这三次的栈回溯都是完全一致的,据此我们可以找到调用的位置。

:> bu iccvid!CVDecompress+0x118 ".echo 条件记录断点:;r edi;r ecx"
:> g
条件记录断点:
edi=0f157000
ecx=
eax= ebx=0f170fc0 ecx= edx=0f4cfd38 esi=0efd0b12 edi=0f157000
eip=73b722c6 esp=0f4cfd04 ebp=0f4cfd30 iopl= nv up ei pl zr na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
iccvid!CVDecompress+0x118:
73b722c6 8db700e0ffff lea esi,[edi-2000h]
:> kp
ChildEBP RetAddr
0f4cfd30 73b7cbf3 iccvid!CVDecompress+0x118
0f4cfd60 73b766c8 iccvid!Decompress+0x11d
0f4cfdac 73b41938 iccvid!DriverProc+0x1bf
0f4cfdd0 7cf8fa8e MSVFW32!ICSendMessage+0x2b
0f4cfe00 7cf8f9d9 quartz!CVFWDynLink::ICDecompress+0x3e
0f4cfec0 7cf90a45 quartz!CAVIDec::Transform+0x282
0f4cfeec 7cf90929 quartz!CVideoTransformFilter::Receive+0x110
0f4cff00 7cf8e672 quartz!CTransformInputPin::Receive+0x33
0f4cff10 7cf90c90 quartz!CBaseOutputPin::Deliver+0x22
0f4cff40 7cf90e0c quartz!CBaseMSRWorker::TryDeliverSample+0x102
0f4cff84 7cf8ce28 quartz!CBaseMSRWorker::PushLoop+0x15e
0f4cff9c 7cf8dbde quartz!CBaseMSRWorker::DoRunLoop+0x4a
0f4cffa4 7cf8a12f quartz!CBaseMSRWorker::ThreadProc+0x39
0f4cffb4 7c80b729 quartz!CAMThread::InitialThreadProc+0x15
0f4cffec kernel32!BaseThreadStart+0x37
:> g
条件记录断点:
edi=0f159000
ecx=
eax= ebx=0f170fc0 ecx= edx=0f4cfd38 esi=0efd0b22 edi=0f159000
eip=73b722c6 esp=0f4cfd04 ebp=0f4cfd30 iopl= nv up ei pl zr na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
iccvid!CVDecompress+0x118:
73b722c6 8db700e0ffff lea esi,[edi-2000h]
:> kp
ChildEBP RetAddr
0f4cfd30 73b7cbf3 iccvid!CVDecompress+0x118
0f4cfd60 73b766c8 iccvid!Decompress+0x11d
0f4cfdac 73b41938 iccvid!DriverProc+0x1bf
0f4cfdd0 7cf8fa8e MSVFW32!ICSendMessage+0x2b
0f4cfe00 7cf8f9d9 quartz!CVFWDynLink::ICDecompress+0x3e
0f4cfec0 7cf90a45 quartz!CAVIDec::Transform+0x282
0f4cfeec 7cf90929 quartz!CVideoTransformFilter::Receive+0x110
0f4cff00 7cf8e672 quartz!CTransformInputPin::Receive+0x33
0f4cff10 7cf90c90 quartz!CBaseOutputPin::Deliver+0x22
0f4cff40 7cf90e0c quartz!CBaseMSRWorker::TryDeliverSample+0x102
0f4cff84 7cf8ce28 quartz!CBaseMSRWorker::PushLoop+0x15e
0f4cff9c 7cf8dbde quartz!CBaseMSRWorker::DoRunLoop+0x4a
0f4cffa4 7cf8a12f quartz!CBaseMSRWorker::ThreadProc+0x39
0f4cffb4 7c80b729 quartz!CAMThread::InitialThreadProc+0x15
0f4cffec kernel32!BaseThreadStart+0x37
:> g
条件记录断点:
edi=0f15b000
ecx=
eax= ebx=0f170fc0 ecx= edx=0f4cfd38 esi=0efd0b32 edi=0f15b000
eip=73b722c6 esp=0f4cfd04 ebp=0f4cfd30 iopl= nv up ei pl zr na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
iccvid!CVDecompress+0x118:
73b722c6 8db700e0ffff lea esi,[edi-2000h]
:> kp
ChildEBP RetAddr
0f4cfd30 73b7cbf3 iccvid!CVDecompress+0x118
0f4cfd60 73b766c8 iccvid!Decompress+0x11d
0f4cfdac 73b41938 iccvid!DriverProc+0x1bf
0f4cfdd0 7cf8fa8e MSVFW32!ICSendMessage+0x2b
0f4cfe00 7cf8f9d9 quartz!CVFWDynLink::ICDecompress+0x3e
0f4cfec0 7cf90a45 quartz!CAVIDec::Transform+0x282
0f4cfeec 7cf90929 quartz!CVideoTransformFilter::Receive+0x110
0f4cff00 7cf8e672 quartz!CTransformInputPin::Receive+0x33
0f4cff10 7cf90c90 quartz!CBaseOutputPin::Deliver+0x22
0f4cff40 7cf90e0c quartz!CBaseMSRWorker::TryDeliverSample+0x102
0f4cff84 7cf8ce28 quartz!CBaseMSRWorker::PushLoop+0x15e
0f4cff9c 7cf8dbde quartz!CBaseMSRWorker::DoRunLoop+0x4a
0f4cffa4 7cf8a12f quartz!CBaseMSRWorker::ThreadProc+0x39
0f4cffb4 7c80b729 quartz!CAMThread::InitialThreadProc+0x15
0f4cffec kernel32!BaseThreadStart+0x37

我们对此调用及上层调用进行分析,如下所示:

.text:73B722BB                 mov     ecx, [ebx+1Ch]
.text:73B722BE lea edi, [ecx+eax]
.text:73B722C1 mov ecx, 800h
.text:73B722C6 lea esi, [edi-2000h]
.text:73B722CC rep movsd
.text:73B7CBD8                 push    dword ptr [esi+98h]
.text:73B7CBDE push edi
.text:73B7CBDF push [ebp+arg_20]
.text:73B7CBE2 push [ebp+arg_24]
.text:73B7CBE5 push [ebp+arg_28]
.text:73B7CBE8 push [ebp+arg_C]
.text:73B7CBEB push dword ptr [esi+5Ch]
.text:73B7CBEE call sub_73B721AE

CVE-2010-2553 Microsoft Windows Cinepak 编码解码器解压缩漏洞 分析的更多相关文章

  1. Microsoft Windows 远程权限提升漏洞(CVE-2013-3175)(MS13-062)

    漏洞版本: Microsoft Windows XP Microsoft Windows Vista Microsoft Windows Server 2008 Microsoft Windows R ...

  2. Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)

    0x00 漏洞描述 Windows系列服务器于2019年5月15号,被爆出高危漏洞,该漏洞影响范围较广如:windows2003.windows2008.windows2008 R2.windows ...

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

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

  4. [CVE-2017-8464]Microsoft Windows远程命令执行漏洞复现

    版权声明:本文为博主的原创文章,未经博主同意不得转载 前言 记录下自己的复现,保留意见 2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快 ...

  5. [EXP]Microsoft Windows MSHTML Engine - "Edit" Remote Code Execution

    # Exploit Title: Microsoft Windows (CVE-2019-0541) MSHTML Engine "Edit" Remote Code Execut ...

  6. Microsoft Windows CVE-2017-8464 LNK 远程代码执行漏洞(复现)

    2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快捷方式时存在远程执行任意代码的高危漏洞,黑客可以通过U盘.网络共享等途径触发漏洞,完全控 ...

  7. Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect

    原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...

  8. Oracle Fusion Applications (11.1.8) Media Pack and Oracle Application Development Framework 11g (11.1.1.7.2) for Microsoft Windows x64 (64-bit)

    Oracle Fusion Applications (11.1.8) Media Pack for Microsoft Windows x64 (64-bit) 重新搜索   常见问题    提示  ...

  9. Installing node-oracledb on Microsoft Windows

    版本 7 由 Laura Ramsey-Oracle 于 2015-10-19 下午11:46创建,最后由 cj 于 2015-10-22 下午7:44修改. Installing node-orac ...

随机推荐

  1. 数据中有NA存在,处理办法

    如果数据中有NA存在,表示这个位置数据遗失,不能进行值的类型描述.也不能用函数来计算,需要计算是可以加上na.rm=T表示忽略NA,但是这个位置并没有去除,使用length可以看到. > x&l ...

  2. Docker网络 Weave

    当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来.容器在不同主机之间都使用的是自己的私有IP地址,不同主机的容器之间进行通讯需要将主机的端口映射到容器的端口上,而且IP地址需要使用主 ...

  3. Python 不定参数函数

    1. 元组形式 def test1(*args): print('################test1################') print(type(args)) print(arg ...

  4. 利用Sentinel实现Redis主从切换

    利用Sentinel(哨兵)实现Redis集群的故障自主切换 首先部署redis主从集群,主要安装过程: cd redis make make install 主要看配置文件: master: bin ...

  5. graphviz 程序生成多种类型图表详解

    简介 一幅图抵得上千言万语,这在描述复杂的计算机系统时尤为正确.当系统环境变得更加复杂时,用图将它们表示出来并记入文档就显得更加重要.例如,虚拟化技术有很多优点,但它们通常会让环境变得更加复杂和更难理 ...

  6. go语言从零学起(二)--list循环删除元素(转载)

    本篇系转载 在使用go的container/list的package时,你可能会无意间踩一个小坑,那就是list的循环删除元素. list删除元素,直观写下来的代码如下: package main i ...

  7. Java6的新特性

    原文出处:xixicat 序 本文梳理了下java6的新特性,相对于java5而言,java6的特性显得少些,分量也不那么重,相当于java5是windows xp,java6有点像vista. 特性 ...

  8. Java基础-正则表达式(Regular Expression)语法规则简介

    Java基础-正则表达式(Regular Expression)语法规则简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正则表达式的概念 正则表达式(Regular Exp ...

  9. [洛谷P4491] [HAOI2018]染色

    洛谷题目链接:[HAOI2018]染色 题目背景 HAOI2018 Round2 第二题 题目描述 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度 ...

  10. UITableView--文档版

    CHENYILONG Blog UITableView Fullscreen   UITableView技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http: ...