ActiveX控件ImageMan.dll栈溢出分析
2018.11.02
V1NKe
 热度
℃
前言:
在搞一个栈溢出的cve分析就搞堆去了,开始这个阿里旺旺的研究了半天,搞了半天才发现是控件的锅,而且还是浏览器触发执行的,有点骚。
正文:
栈溢出的研究也就无非那些摸清楚的套路了,栈回溯啊ub啊什么的。所以按套路出牌,运行崩溃样本Poc,attach上IE进程,发现崩溃在此处:
而且ecx的值都是A,此处就是溢出点了,该处dll就为ImageMan.dll。在此处下断点,重新attach上去。
因为此处的ImageMan.dll是动态加载的,所以不能直接对这个地址下断点,这里就采用硬件断点来下断:
查看栈回溯:
发现调用函数为0x2734027
,在0x271c31f
处下断点attach:
看到该函数的三个参数中的第二个就是所构造的溢出内容。继续往下走:
往上面对比一下,可以发现edi就是第一个参数,edx就是第三个参数,可以大致猜测到这个函数的功能就是复制字符串操作,复制个数限制在第三个参数。
一直回溯,断在此处:
再往IDA里面一起结合分析,不过这地方IDA处的地址与windbg上的地址不同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| .text:1001AB7F var_31C = dword ptr -31Ch .text:1001AB7F var_318 = dword ptr -318h .text:1001AB7F var_314 = byte ptr -314h .text:1001AB7F String = byte ptr -310h .text:1001AB7F var_30F = byte ptr -30Fh .text:1001AB7F var_20C = dword ptr -20Ch .text:1001AB7F MultiByteStr = byte ptr -208h .text:1001AB7F var_207 = byte ptr -207h .text:1001AB7F var_104 = byte ptr -104h .text:1001AB7F var_103 = byte ptr -103h .text:1001AB7F arg_0 = dword ptr 8 .text:1001AB7F lpWideCharStr = dword ptr 0Ch .text:1001AB7F arg_8 = dword ptr 10h .text:1001AB7F .text:1001AB7F push ebp .text:1001AB80 mov ebp, esp .text:1001AB82 sub esp, 31Ch .text:1001AB88 push edi .text:1001AB89 mov [ebp+MultiByteStr], 0 .text:1001AB90 mov ecx, 40h .text:1001AB95 xor eax, eax .text:1001AB97 lea edi, [ebp+var_207] .text:1001AB9D rep stosd .text:1001AB9F stosw .text:1001ABA1 stosb .text:1001ABA2 push 0 ; lpUsedDefaultChar .text:1001ABA4 push 0 ; lpDefaultChar .text:1001ABA6 push 104h ; cbMultiByte .text:1001ABAB lea eax, [ebp+MultiByteStr] .text:1001ABB1 push eax ; lpMultiByteStr .text:1001ABB2 push 0FFFFFFFFh ; cchWideChar .text:1001ABB4 mov ecx, [ebp+lpWideCharStr] .text:1001ABB7 push ecx ; lpWideCharStr .text:1001ABB8 push 0 ; dwFlags .text:1001ABBA push 0 ; CodePage .text:1001ABBC call ds:WideCharToMultiByte .text:1001ABC2 mov [ebp+String], 0 .text:1001ABC9 mov ecx, 40h .text:1001ABCE xor eax, eax .text:1001ABD0 lea edi, [ebp+var_30F] .text:1001ABD6 rep stosd .text:1001ABD8 stosw .text:1001ABDA stosb .text:1001ABDB push 5Ch ; int .text:1001ABDD lea edx, [ebp+MultiByteStr] .text:1001ABE3 push edx ; char * .text:1001ABE4 call _strrchr .text:1001ABE9 add esp, 8 .text:1001ABEC mov [ebp+var_20C], eax .text:1001ABF2 mov [ebp+var_104], 0 .text:1001ABF9 mov ecx, 40h .text:1001ABFE xor eax, eax .text:1001AC00 lea edi, [ebp+var_103] .text:1001AC06 rep stosd .text:1001AC08 stosw ·········
|
第一个函数:
在看IDA:
该函数是把ipWideCharStr转化为AscII保存到MultiByteStr中,且个数不超过0x104个,ipWideCharStr就是我们构造的数据,远大于0x104,所以MultiByteStr不存在空字符,全由A填满。再往下看:
IDA中:
该函数为寻找MultiByteStr中有无\
字符串,有则返回地址,无则返回NULL。往下:
IDA中:
这个函数相当于strncmp函数。此函数就是溢出函数了。
溢出原因就是,复制的目标地址和源复制地址空间是相邻的,且大小都为0x104。
在strrchr函数中没有找到\
字符串,返回了NULL,即上面的v10为空,得到一个负数,在内存中很大,复制字数过多了,导致溢出。
溢出效果: