能力值:
( LV2,RANK:85 )
|
-
-
2 楼
思路清晰,学习一下
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
非常好~
|
能力值:
( LV6,RANK:90 )
|
-
-
4 楼
赞啊,写的特别好!忍不住要跟着调试一下了,感谢楼主!
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
继续努力吧~!
|
能力值:
( LV5,RANK:60 )
|
-
-
6 楼
楼主你好,请问poc是在哪找的,还是自己写的?
|
能力值:
( LV6,RANK:90 )
|
-
-
7 楼
忍不住跟着楼主调试了一下,发现一些位置其实可以简化调试的,分享一些我的调试细节欢迎大家互相交流~:
首先是回溯部分,在漏洞触发层函数JavascriptThreadService::EnumerateTrackingClient中通过观察可以发现出现问题的是该函数第三个参数,这里IDA因为只加载了jscript一个dll,所以第三个参数是一个IUnknown型的结构体,但这不重要,在这个函数调用前,可以发现push了一个esi,这个IU结构体就是esi传入的,在外层函数MSHTML!CAttribute::EnumerateTrackedObjects下断点,进入时可以发现esi就是CAttribute类的虚表,而其中偏移30h位置的值被改成了41424344,其实只需要跟踪这个值在什么时候改变的就可以了。
利用!heap -p -a跟踪虚表起始地址,可以发现在之前一个位置调用了639968e3 MSHTML!CDocument::createAttribute+0x00000016,在这个函数入口下断点,通过gu直接执行到返回,可以看到edx寄存器保存的就是这个CAttribute类的虚表指针,通过dps查看可以发现偏移30位置还是正常的值,那么实际上这个时候,利用ba w1在偏移30位置下写入断点,跟踪它第一次被覆盖的是什么就行了,通过g执行会命中断点,这时候利用!heap -p -a [vftable+30h addr] 可以发现这个地方覆盖的值是MSHTML!CImgElement::`vftable',而之前MSHTML!CImgElement::CreateElement就是创建的部分,接下来跟踪什么时候被41424344覆盖就很清晰了(可以再次利用内存写入断点),这样省去了一些通过x来猜类成员函数作用的过程,另外楼主最后红字总结的部分写的很好,其实应该加上一个6,善用硬件断点可以一定程度上简化调试过程,希望多交流学习~
|
能力值:
( LV11,RANK:190 )
|
-
-
8 楼
兄弟你说的很对, 其实俺在反复调试过程中也使用了ba,但是为了更好的面向我这种刚刚接触漏洞的新手,还是采用比较麻烦的方法,从头一步一步说,看着就非常冗余了, 兄弟你绝对是认真看了我写的东西的。
以后还是多学习
|
能力值:
( LV6,RANK:90 )
|
-
-
9 楼
互相学习 ~我刚开始的时候也是不断的回溯,但是对于一些结构不是很复杂的应用来说比较好用,但是CVE上回溯就很麻烦了,这时候楼主利用对函数猜测功能下断点跟踪,和利用alert区分函数执行过程真的是一个非常好的方法,另外我比较喜欢用javascript中的math方法tan(0),sin(0),cos(0)这种方法,在POC正常语句中加上math.tan(0),这样的话,通过windbg下jscript!tan,jscript!sin,jscript!cos,也可以正常命中,再通过kb回溯可以看到之前执行的PoC语句调用的函数
|
能力值:
( LV11,RANK:190 )
|
-
-
10 楼
|
能力值:
( LV12,RANK:280 )
|
-
-
11 楼
调试过程很详细,学习了。创建函数都是CreateElement是因为继承自CElement
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
http://blog.skylined.nl/20160617001.html 这里有一篇外文的相关文章
|
能力值:
( LV4,RANK:40 )
|
-
-
13 楼
学习了。
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
mark.
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
楼主,请教一下,我的Ie崩溃后没有调试程序那个选项。。。 ,怎该怎样调试呢。。我每次attach上ie,但程序崩溃后windbg不中断呀
|
|
|