首页
社区
课程
招聘
CVE-2012-1876 Exploit利用分析
发表于: 2015-7-4 14:53 9130

CVE-2012-1876 Exploit利用分析

2015-7-4 14:53
9130

本次分析的CVE-2012-1876是Pwn2Own 2012 黑客大赛上被利用的IE漏洞,是由于在MSHTML_CTableLayout_CalculateMinMax函数中处理不当从而导致了堆溢出,这可以用来覆盖虚表指针。本文主要包括以下内容:
1.控制堆的布局
2.泄露MSHTML基址
3.控制EIP

详细见附件。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (16)
雪    币: 27
活跃值: (622)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
学习了 ,感谢分享。
2016-3-8 18:04
0
雪    币: 799
活跃值: (457)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
4
通过泄露虚表地址来计算mshtml.dll的基址。我想问下虚表的偏移是不是在编译时就已经固定了?对象是动态分配的也不会影响地址?
2016-8-9 09:53
0
雪    币: 90
活跃值: (173)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5

虚表地址在.rdata,只要不重新编译代码,虚表地址的位置就不会发生变化(如果源代码没有修改,就算重新编译,一般也不会发生变化),对象是否是动态分配的跟虚表没有直接或间接的关系。
2016-8-9 11:06
0
雪    币: 799
活跃值: (457)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=fneig;1440397]
虚表地址在.rdata,只要不重新编译代码,虚表地址的位置就不会发生变化(如果源代码没有修改,就算重新编译,一般也不会发生变化),对象是否是动态分配的跟虚表没有直接或间接的关系。[/QUOTE]

学习了,感谢
2016-8-20 10:03
0
雪    币: 228
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大家好,我有一个问题没有搞懂呀,能不能求解释一下:

evil_col.width = "1312272"; // 0x07D25E40

到最后call dword ptr [eax+8],此时eax = 0x07D25E40,应该是我们覆盖的heapspray的内容,然而此时这个堆空间是可执行的吗?如果不可执行,不是应该先call到另一个代码段地址才对吗?

(因为这里ROP中调用了VirtualProtect,说明堆空间是开启了DEP了。)
2016-10-14 17:58
0
雪    币: 438
活跃值: (228)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=dwfault;1448268]大家好,我有一个问题没有搞懂呀,能不能求解释一下:

evil_col.width = "1312272"; // 0x07D25E40

到最后call dword ptr [eax+8],此时eax = 0x07D25E40,应该是我们覆盖的heapspray的内容,然而此时这个堆空间是可执行的...[/QUOTE]

绕过DEP的手段包括堆喷。
2016-10-14 21:34
0
雪    币: 228
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
但是这个堆喷后的内存区块本身难道不是不可执行的么?
2016-10-15 20:48
0
雪    币: 799
活跃值: (457)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
10
这届pwn2own上作者是通过在堆喷内存上构造jmp链实现的利用,我恰好翻译过作者写的自述。
通常用的堆栈翻转也可以实现利用,堆当然是不可以执行的了
2016-11-2 00:38
0
雪    币: 228
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
啊我明白了!非常感谢!
2016-11-2 14:55
0
雪    币: 226
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼主您好,感谢分享~~  在实践的过程中遇到了问题,还想向您请教一下。
我遇到的问题出现在布局堆的阶段。在执行以下代码之后,
fr[i]  =  free.substring(0,  (0x100-6)/2);
al[i]  =  string1.substring(0,  (0x100-6)/2);
bl[i]  =  string2.substring(0,  (0x100-6)/2);
通过  s  命令在内存中寻找存在  E.E.E.E  ...  和  A.A.A.A...  和  B.B.B.B...  这样字符串的位置。
但是从查找到的地址来看,并没有出现它们相连在一起的情况。不知道我布局不成功是什么原因造成的,还请指教~~
环境:
win7  32  位虚拟机
ie  8.0.7600.16385
2017-9-28 09:41
0
雪    币: 699
活跃值: (444)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
13
想问一下,这个虚表指针与mshtml基址的偏移能够怎么得到,为什么知道它就是这个数?
2018-3-11 15:38
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
14
sakura零 想问一下,这个虚表指针与mshtml基址的偏移能够怎么得到,为什么知道它就是这个数?
楼主说了呀,因为虚表不是动态分配的而是在.rdata里面的,所以他相对模块基址的偏移是一定的。至于怎么得到,可以把mshtml拖进IDA,看一下模块的基址(最前面有),再看一下虚表的地址,两个减一下,就是偏移了
2018-3-12 01:06
0
雪    币: 699
活跃值: (444)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
15
holing 楼主说了呀,因为虚表不是动态分配的而是在.rdata里面的,所以他相对模块基址的偏移是一定的。至于怎么得到,可以把mshtml拖进IDA,看一下模块的基址(最前面有),再看一下虚表的地址,两个减一下, ...
谢谢师傅,不过我符号文件好像有问题,找不到那个虚表很难受
2018-3-14 11:13
0
雪    币: 699
活跃值: (444)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
16
holing 楼主说了呀,因为虚表不是动态分配的而是在.rdata里面的,所以他相对模块基址的偏移是一定的。至于怎么得到,可以把mshtml拖进IDA,看一下模块的基址(最前面有),再看一下虚表的地址,两个减一下, ...
在左边函数搜索CButtonLayout,搜不到构造函数,不知道怎么找到虚表,不知道是不是我符号文件的问题。。
其实我都没搜到.rdata。。我再找找原因
2018-3-14 11:18
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我想知道那个VirtualProtect()函数是怎么实现调用的?“shellcode+=  unescape("%u"+vp1+"%u"+vp2);  //  VirtualProtect()”和“var  rop  =  cbuttonlayout  +  4936;  //  VirtualProtect()”,这个是怎么调的?参数是怎么输进去的?
2018-4-20 23:42
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我看了很多个分析这个漏洞的,但是都是最后一步这里没了。所以一直不明白为什么把VirtualProtect函数这样安排在这个位置?
2018-4-20 23:46
0
游客
登录 | 注册 方可回帖
返回
//