CVE-2010-2553 Microsoft Windows Cinepak 编码解码器解压缩漏洞 分析
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 编码解码器解压缩漏洞 分析的更多相关文章
- Microsoft Windows 远程权限提升漏洞(CVE-2013-3175)(MS13-062)
漏洞版本: Microsoft Windows XP Microsoft Windows Vista Microsoft Windows Server 2008 Microsoft Windows R ...
- Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)
0x00 漏洞描述 Windows系列服务器于2019年5月15号,被爆出高危漏洞,该漏洞影响范围较广如:windows2003.windows2008.windows2008 R2.windows ...
- CVE-2011-0104 Microsoft Office Excel缓冲区溢出漏洞 分析
漏洞简述 Microsoft Excel是Microsoft Office组件之一,是流行的电子表格处理软件. Microsoft Excel中存在缓冲区溢出漏洞,远程攻击者可利用此 ...
- [CVE-2017-8464]Microsoft Windows远程命令执行漏洞复现
版权声明:本文为博主的原创文章,未经博主同意不得转载 前言 记录下自己的复现,保留意见 2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快 ...
- [EXP]Microsoft Windows MSHTML Engine - "Edit" Remote Code Execution
# Exploit Title: Microsoft Windows (CVE-2019-0541) MSHTML Engine "Edit" Remote Code Execut ...
- Microsoft Windows CVE-2017-8464 LNK 远程代码执行漏洞(复现)
2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快捷方式时存在远程执行任意代码的高危漏洞,黑客可以通过U盘.网络共享等途径触发漏洞,完全控 ...
- Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect
原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...
- 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) 重新搜索 常见问题 提示 ...
- Installing node-oracledb on Microsoft Windows
版本 7 由 Laura Ramsey-Oracle 于 2015-10-19 下午11:46创建,最后由 cj 于 2015-10-22 下午7:44修改. Installing node-orac ...
随机推荐
- Java入门:注册模块的实现
1.主活动图 用户选择注册选项,进入注册界面,开始输入注册信息,到最后完成注册.具体的活动图如下: 以上活动图中,矩形框里的操作不是在一个类里面实现的,而是通过Form类和UserService类来实 ...
- P3924 康娜的线段树
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以 ...
- Java基础-Collection子接口之Set接口
Java基础-Collection子接口之Set接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学习Collection接口时,记得Collection中可以存放重复元素,也可 ...
- Matlab周期图法使用FFT实现
参考文章:http://www.cnblogs.com/adgk07/p/9314892.html 首先根据他这个代码和我之前手上已经拥有的那个代码,编写了一个适合自己的代码. 首先模仿他的代码,测试 ...
- 科学计算三维可视化---TraitsUI(Group对象组织界面)
使用Group对象组织界面 将一组相关的Item对象组织在一起 from traitsui.api import Group from traits.api import HasTraits,Int, ...
- mongo查询日期格式数据
/ali/mongodb/bin/mongo -u user -p '123456' 127.0.0.1:27017/KYElog ISODate方式 db.col_02.find({"Lo ...
- JS动态更新微信浏览器中的title
问题: 最近在做一个微信中分享的宣传页,分不同的场景,切换不同的场景时需要设置不同的title,实现的方案很简单,当用户切换场景的时候,修改document对象的title属性,可是在实际测试中,io ...
- 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍
简介 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应 ...
- Codeforces刷题计划
Codeforces刷题计划 已完成:-- / -- [Codeforces370E]370E - Summer Reading:构造:(给定某些数,在空白处填数,要求不下降,并且相邻差值<=1 ...
- BZOJ第一页刷题计划
BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...