能力值:
( LV2,RANK:10 )
|
-
-
2 楼
果断留名 虽然还是没看懂..
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
不好意思,发完了我看了一下,可能字体选择的有问题,数字显示的都很难看,大小不一的。
另外,代码里面的tab转化的也不对,那些汇编码也是很难看,本来都是对其的。
|
能力值:
( LV5,RANK:69 )
|
-
-
4 楼
我看完了,楼主辛苦,精神可嘉
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
学习,加油!
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
仔细阅读学习了.
分析的过程以及思维的逻辑很精彩.
谢谢分享.
|
能力值:
( LV11,RANK:180 )
|
-
-
7 楼
写得很好啊~~
前两天用VMP的demo加了个程序~~之后载入OD就这结果~~
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
写得好,学习了!
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
非常的牛啊!顶了
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
精彩!
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
接着把今天对引起溢出的具体的数据的分析发出来,请大家指正。
先还是用老办法,利用system32下的老版本的dbghelp.dll,双OD调试程序,在OllyICE中对dbghelp.dll中的68D808BF下断,OllyDbg装载程序X,这时断在68D808BF,代码为
68D808BF 8A08 mov cl, byte ptr [eax]
我们直奔eax,二进制拷贝头部的96字节如下:
03 BC A7 7E BF C1 1F F1 32 E9 E2 D7 C4 B5 89 14 78 E6 1D 2C 43 B2 7C 16 B1 5E 64 52 26 EB 1E 49
53 FB 10 11 D6 26 AE 0F FC 5B 85 18 1F 11 5A FF 26 52 9B C9 19 F5 A1 D7 D0 86 7D D6 29 B5 46 3D
53 51 2F A3 16 18 D4 4A 30 F3 90 85 1F 64 B4 F7 FB 21 01 C9 35 52 CA 48 58 CD 83 91 32 47 B0 4B
下来,在OD的目录下拷贝进去海风大牛给的dbgHelp.dll,启动OD,直接装载程序X,这时就停在了系统入口处,打开内存窗口,二进制搜索上面的96字节,在0080791E处找到,且整个内存中只找到这一个,OK,肯定就是这个地方了。
这时要分析一下这个地址是做什么用的了,我们打开IDA,查看0080791E,没有直接的引用,由于是在装载时引起的dbghelp.dll溢出的,所以,估计这个地址应该是从PE头数据中引出的,也许应该查找RVA 0040791E,在OD中二进制搜索,在008074BA 处发现如下:
008074BA 1E 79 40 00 3B 85 40 00 5D 85 40 00 81 85 40 00 y@.;匑.]匑.亝@.
008074CA A6 85 40 00 CE 85 40 00 FA 85 40 00 19 86 40 00 @.螀@.鷧@.咢.
后面好像都是RVA值,在IDA中设置数据类型为RVA,显示如下:
.text2:008074BA ; Export Names Table for X.exe
.text2:008074BA ;
.text2:008074BA off_8074BA dd rva word_80791E, rva a@Xp26shdocvw_t, rva a@Xp28shdocvw_t
.text2:008074BA ; DATA XREF: .text2:00806E1Co
.text2:008074BA dd rva a@Xp29shdocvw_t, rva a@Xp32shdocvw_t, rva a@Xp36shdocvw_t ; "@$xp$26Shdocvw_tlb@TCppWebBrowser"
.text2:008074BA dd rva a@XpYnpqqrp14sy, rva a@XpYnpqqrp14_0, rva a@XpYnpqqrp14_1
.text2:008074BA dd rva a@XpYnpqqrp14_2, rva a@XpYnpqqrp14_3, rva a@XpYnpqqrp14_4
哈哈,IDA已经给分析过了,是输出表的Names Table,而且0080791E是该表的第一项,向上看名字对应的序号表如下:
.text2:00807288 ; Export Orfinals Table for X.exe
.text2:00807288 ;
.text2:00807288 word_807288 dw 118h, 0Ah, 6, 4, 8, 2, 0Fh, 1Ah, 14h, 15h, 1Fh, 18h
.text2:00807288 ; DATA XREF: .text2:00806E20o
.text2:00807288 dw 20h, 1Eh, 16h, 13h, 1Ch, 17h, 1Dh, 10h, 19h, 1Bh, 0Dh
再向上看到输出表如下:
.text2:00806DFC ; Export directory for X.exe
.text2:00806DFC ;
.text2:00806DFC dd 0 ; Characteristics
.text2:00806E00 dd 0 ; TimeDateStamp
.text2:00806E04 dw 0 ; MajorVersion
.text2:00806E06 dw 0 ; MinorVersion
.text2:00806E08 dd rva aXx_exe ; Name
.text2:00806E0C dd 1 ; Base
.text2:00806E10 dd 119h ; NumberOfFunctions
.text2:00806E14 dd 119h ; NumberOfNames
.text2:00806E18 dd rva off_806E24 ; AddressOfFunctions
.text2:00806E1C dd rva off_8074BA ; AddressOfNames
.text2:00806E20 dd rva word_807288 ; AddressOfNameOrdinals
就是一共有0x119个输出项,而造成溢出的输出项的序号是0x118,呵呵,是最后一个,这说明VMP给输出表增加了一项,其序号在最后,而其名字的序号在第一个,只要老版本的dbghelp.dll提取输出表的名字,立即就会溢出。
搞到这个时候,又去看了一下IDA目录下是否有dbghelp.dll,结果发现有,但修改日期是2009年7月13日,比海风大牛给的那个dll还要新一些。我的IDA的版本是5.5。
下来还有一个问题就是,为什么栈上只需要覆盖多于0x814几个字节就可以使返回地址无效,可为什么VMP要把那个名字的长度设定为0xC1C,查看了一下68D808BF所在的函数,函数头上没有SEH的代码,在OllyICE中直奔fs:[0],为0012B060,而 ebp-814+0C1C=0012B0B4,在栈上看一下,0xC1C个字节不但把当前SEH数据都覆盖掉了,还把下一个SEH链点的指针也覆盖掉了。不过这里还有的不太理解,其实只要覆盖第一个SEH数据,整个SEH链就已经不可用了,为什么还要把第二个SEH链点也覆盖掉。猜想也许是不同版本有漏洞的dbghelp.dll的栈空间不一样大吧,可能这个0xC1C是个满足所有可溢出覆盖掉SEH链头的dbghelp.dll的最小值吧。
最后得出结论:VMP利用了老版本dbghelp.dll在拷贝输出表名称时使用inline化的strcpy同时未限制源字符串的长度的漏洞,在加壳时给目标程序增加了一个输出项,该项在输出名字表中排在第一位,该名字长达0xC1C字节,对应的输出项为最后一个输出项。而当调试分析程序(如OD,IDA)调用dbghelp.dll分析加壳程序的输出表时,就会造成线程栈溢出,同时覆盖了当前SEH链表头,使得异常处理程序在无效的地址上,从而再次引发异常,进而形成异常循环,耗光了线程栈,引起程序终止,却没有任何提示。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
写的很好,楼主赞一个。给我这个菜菜鸟有很大的启发!
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
呵呵…回复留记号
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
分析的很好,很有韧劲,学习。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
很不错,精神和技术都可嘉
|
能力值:
( LV3,RANK:30 )
|
-
-
16 楼
把程序发上来吧
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
很不错,精神和技术都可嘉
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
谢谢!哈,,刚好用到,
|
能力值:
( LV3,RANK:20 )
|
-
-
19 楼
我用的那个程序有点大,而且还要安装。不太方便发上来。
不过,7楼的朋友都说过了,用VMP的demo版,随便加了个程序,就是这个情况。你可以试试。
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
楼主厉害。。反思自己遇到问题时想得就太少了
|
能力值:
( LV3,RANK:20 )
|
-
-
21 楼
惭愧啊,在看雪都注册了6年了,就这一次多想了想。
|
能力值:
( LV13,RANK:760 )
|
-
-
23 楼
不π_π错,进步了!
|