CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析
[CNNVD]Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞(CNNVD-201201-110)
Microsoft Windows是微软发布的非常流行的操作系统。Windows Media Player是系统的多媒体播放组件。
WMP在处理畸形结构的MIDI数据时存在内存破坏漏洞。远程攻击者可利用该漏洞通过诱使用户访问恶意网页控制用户系统。
注意这个漏洞是ie进程在调用多媒体的dll时触发的,也就是要去挂载ie进程。加载poc后数秒内ie进程crash,异常信息如下:
(aa0.aa4): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=002261c4 ebx= ecx=0c0c0c0c edx=0000003d esi=00225dc8 edi=0039d910
eip=7e390581 esp=0012e198 ebp=0012e1a8 iopl= nv up ei pl nz na po nc
cs=001b ss= ds= es= fs=003b gs= efl=
mshtml!CAttrValue::GetIntoVariant+0x4d:
7e390581 ff5104 call dword ptr [ecx+] ds::0c0c0c10=????????
由于是ie的漏洞我们对这种call [ecx+4]的形式比较敏感(因为ie存在大量的对象虚表访问),来具体看一下,ub mshtml!CAttrValue::GetIntoVariant+0x4d,如下
:> ub mshtml!CAttrValue::GetIntoVariant+0x4d
mshtml!CAttrValue::GetIntoVariant+0x3a:
7e39056e e8f93ef0ff call mshtml!VariantCopy (7e29446c)
7e390573 8bd8 mov ebx,eax
7e390575 eb35 jmp mshtml!CAttrValue::GetIntoVariant+0x78 (7e3905ac)
7e390577 8b460c mov eax,dword ptr [esi+0Ch]
7e39057a 3bc3 cmp eax,ebx
7e39057c je mshtml!CAttrValue::GetIntoVariant+0x50 (7e390584)
7e39057e 8b08 mov ecx,dword ptr [eax]
7e390580 push eax
我们一看就知道这个就是虚表访问,这个套路在ie里真是见过太多了,eax是对象指针,ecx是虚表指针,那么call [ecx+4]就是调用虚函数了。我们继续看下这个对象中的内容
:> dc eax
002261c4 0c0c0c0c 0c0c0c0c 0c0c0c0c ................
002261d4 ................
002261e4 ................
002261f4 06f72ed0 002dc72b ........+.-.....
002265f4 002dc72c .e".....,.-.....
00226214 06f59bb0 00000902 002dc72d 00000000 ........-.-.....
00226224 09318a68 00000b02 002dc72e 00000000 h.1.......-.....
00226234 0000ffff 00000302 002dc72f 00000000 ......../.-.....
喜闻乐见的堆喷,看来作者的思路就是伪造一个对象的虚表为0c0c0c0c,然后堆喷到0c0c0c0c伪造虚函数布置shellcode,这也是很常规的做法,那为啥会crash呢?我们来看一下,
:> dd 0c0c0c0c
0c0c0c0c ???????? ???????? ???????? ????????
0c0c0c1c ???????? ???????? ???????? ????????
0c0c0c2c ???????? ???????? ???????? ????????
0c0c0c3c ???????? ???????? ???????? ????????
0c0c0c4c ???????? ???????? ???????? ????????
0c0c0c5c ???????? ???????? ???????? ????????
0c0c0c6c ???????? ???????? ???????? ????????
0c0c0c7c ???????? ???????? ???????? ????????
:> !address 0c0c0c0c
0ac0c000 : 0ac0c000 - 053f4000
Type
Protect PAGE_NOACCESS
State MEM_FREE
Usage RegionUsageFree
显示这块内存未分配,看来并没能喷到0c0c0c0c,估计作者是翻车了,或者是我的环境有问题。那么我们再去找找作者用哪里的漏洞搞的大新闻。
首先要开hpa了,因为我们已知是堆漏洞了。断在如下位置
(eec.b40): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax= ebx=0000007d ecx=007db29f edx= esi=126ef019 edi=126b6f60
eip=76b2d224 esp=12dffe80 ebp=12dffea0 iopl= nv up ei pl zr na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
WINMM!midiOutPlayNextPolyEvent+0x1ec:
76b2d224 8a06 mov al,byte ptr [esi] ds::126ef019=??
我们不知道esi是什么地址,但是我们可以猜一下,!heap -p -a esi ,结果如下果真是页堆的导致的异常。我们计算一下:126eec00+0x400=126EF000 ,而126ef019>126ef000。又我们可以知道堆只有分配的记录并没有释放的记录说明肯定不是UAF漏洞了,那么肯定是堆溢出或是基于堆的数组访问越界了。
v0:> !heap -p -a esi
address 126ef019 found in
_DPH_HEAP_ROOT @
in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize)
11fc4058: 126eec00 - 126ee000
7c938f01 ntdll!RtlAllocateHeap+0x00000e64
76b2b2b3 WINMM!winmmAlloc+0x00000016
76b2cdee WINMM!mseOpen+0x00000044
76b2d97e WINMM!mseMessage+0x00000029
76b2a17f WINMM!midiStreamOpen+0x00000207
77ba1f7c midimap!modOpen+0x000000f8
77ba29f3 midimap!modMessage+0x0000005e
76b2a15e WINMM!midiStreamOpen+0x000001e6
7d03567d quartz!CMidiOutDevice::DoOpen+0x00000026
7d035727 quartz!CMidiOutDevice::amsndOutOpen+0x00000059
7cfabc7a quartz!CWaveOutFilter::amsndOutOpen+0x0000002e
7cfabc05 quartz!CWaveOutFilter::DoOpenWaveDevice+0x0000007a
7cfabe12 quartz!CWaveOutFilter::OpenWaveDevice+0x00000019
7cfabcda quartz!CWaveOutFilter::Pause+0x00000049
7cf8cf61 quartz!CFilterGraph::Pause+0x00000107
重新运行程序,对WINMM!midiOutPlayNextPolyEvent+0x1ec下断,看下回溯
:> kp
ChildEBP RetAddr
1243fea0 76b2d2e5 WINMM!midiOutPlayNextPolyEvent+0x1ec
1243feb4 76b154e3 WINMM!midiOutTimerTick+0x4f
1243fedc 76b2adfe WINMM!DriverCallback+0x5c
1243ff18 76b2af02 WINMM!TimerCompletion+0xf4
1243ffb4 7c80b729 WINMM!timeThread+0x53
1243ffec kernel32!BaseThreadStart+0x37
看下在哪个模块中,如下,抓出来用IDA打开
:> lmm winmm v
start end module name
76b10000 76b3a000 WINMM (pdb symbols) C:\symbols\winmm.pdb\90FC96D5AD8440A2B14855895BD92ED62\winmm.pdb
Loaded symbol image file: C:\WINDOWS\system32\WINMM.dll
Image path: C:\WINDOWS\system32\WINMM.dll
Image name: WINMM.dll
Timestamp: Mon Apr :: (4802BDE1)
CheckSum: 0002C65D
ImageSize: 0002A000
File version: ...
Product version: ...
File flags: (Mask 3F)
File OS: NT Win32
File type: . Dll
File date: .
Translations: .04b0
CompanyName: Microsoft Corporation
ProductName: Microsoft(R) Windows(R) Operating System
InternalName: winmm.dll
OriginalFilename: WINMM.DLL
ProductVersion: ...
FileVersion: ... (xpsp.-)
FileDescription: MCI API DLL
LegalCopyright: (C) Microsoft Corporation. All rights reserved.
CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析的更多相关文章
- CVE-2012-0003:Microsoft Windows Media Player winmm.dll MIDI 文件堆溢出漏洞调试分析
0x01 蜘蛛漏洞攻击包 前言:2012 年 2月,地下黑产中流行着一款国产名为蜘蛛漏洞的攻击包 -- "Zhi-Zhu Exploit Pack",该工具包含 5 个漏洞,都是在 ...
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- Microsoft Exchange远程代码执行漏洞(CVE-2020-16875)
Microsoft Exchange远程代码执行漏洞(CVE-2020-16875) 漏洞信息: 由于对cmdlet参数的验证不正确,Microsoft Exchange服务器中存在一个远程执行代码漏 ...
- Windows漏洞:MS08-067远程代码执行漏洞复现及深度防御
摘要:详细讲解MS08-067远程代码执行漏洞(CVE-2008-4250)及防御过程 本文分享自华为云社区<Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御>,作者 ...
- Microsoft Windows CVE-2017-8464 LNK 远程代码执行漏洞(复现)
2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快捷方式时存在远程执行任意代码的高危漏洞,黑客可以通过U盘.网络共享等途径触发漏洞,完全控 ...
- Windows 2003 Server远程代码执行漏洞集合
目录 MS08-067 CVE-2017-7269 MS08-067 发布日期:2008/10/22 针对端口:139.445 漏洞等级:高危 漏洞影响:服务器服务中的漏洞可能允许远程执行代码 受影响 ...
- Microsoft Edge 浏览器远程代码执行漏洞POC及细节(CVE-2017-8641)
2017年8月8日,CVE官网公布了CVE-2017-8641,在其网上的描述为: 意思是说,黑客可以通过在网页中嵌入恶意构造的javascript代码,使得微软的浏览器(如Edege),在打开这个网 ...
- Microsoft Internet Explorer 远程代码执行漏洞(CVE-2013-3186)(MS13-059)
漏洞版本: Microsoft Internet Explorer 6 - 10 漏洞描述: BUGTRAQ ID: 61663 CVE(CAN) ID: CVE-2013-3186 Windows ...
- Windows Media Player axWindowsMediaPlayer1 分类: C# 2014-07-28 12:04 195人阅读 评论(0) 收藏
属性/方法名: 说明: [基本属性] URL:String; 指定媒体位置,本机或网络地址 uiMode:String; 播放器界面模式,可为Full, Mini, None, Invisible p ...
随机推荐
- 交互式shell脚本对话框----whiptail指令
当你在linux环境下setup软件的时候就会有相应的对话框让你输入.虽然我们已经习惯了这种交互的方法,但是如果有一种直观的界面来输入是不是会更加友好和方便呢,在shell脚本中你可以使用-whipt ...
- centos7.2 rabbitmq3.6.2源码部署
1.安装所有依赖包yum install -y gcc ncurses ncurses-base ncurses-devel ncurses-libs ncurses-static ncurses-t ...
- typdef用法总结
typdef是在计算机编程语言中用来为复杂的声明定义简单的别名用的 typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,在网上找了很多资料,结合自己遇到的各 ...
- node的“宏任务(macro-task)”和“微任务(micro-task)”机制
macrotask 和 microtask 表示异步任务的两种分类.在挂起任务时,JS 引擎会将所有任务按照类别分到这两个队列中,首先在 macrotask 的队列(这个队列也被叫做 task que ...
- 20155236 2016-2017-2 《Java程序设计》第四周学习总结
20155236 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 1.继承基本上就是避免多个类间重复定义共同行为. 继承的三个好处:减少代码冗余:维护变得简单 ...
- laravel 和 thinkphp 条件查询的区别
laravel:以二维数组形式where查询,可以为空,即,该条where不运行: thinkphp:以字符串形式查询,不能为空.
- thinkphp 原数据更新
调用TP的save方法更新数据时,如果新数据与数据库中得数据一致, 那么执行M('table')->save(data)方法时,该方法会返回false.现在的需求是,哪怕用户要更新的数据与原数据 ...
- datagrid时间插件
jquery easyui日期控件中,在页面里用JS拿到设立的日期值的方法 链接:http://blog.csdn.net/liweibin_/article/details/13509917 jqu ...
- 【Linux 命令】 rsync 目录覆盖软链接,保持软链接不变并同步目录内容
需求:有两个相同文件名的目录需要使用其中一个目录覆盖另外一个 问题: 被覆盖目录下存在软链接,但在源目录下软链接是一个目录 需要解决的方案: 要求将原目录里和被覆盖目录里冲突的目录文件复制到B的软链 ...
- 如何在Maven和Gradle中配置使用Groovy 2.4与Spock 1.0
如何在Maven和Gradle中配置使用Groovy 2.4与Spock 1.0 原文 https://dzone.com/articles/spock-10-groovy-24 翻译 hxfiref ...