盒子
盒子
文章目录
  1. 前言:
  2. 正文:
    1. 溢出效果:

ActiveX控件ImageMan.dll栈溢出分析

前言:

在搞一个栈溢出的cve分析就搞堆去了,开始这个阿里旺旺的研究了半天,搞了半天才发现是控件的锅,而且还是浏览器触发执行的,有点骚。

正文:

栈溢出的研究也就无非那些摸清楚的套路了,栈回溯啊ub啊什么的。所以按套路出牌,运行崩溃样本Poc,attach上IE进程,发现崩溃在此处:

67FAD509-8AB7-41C8-BEBD-D040BDB6FA9A

而且ecx的值都是A,此处就是溢出点了,该处dll就为ImageMan.dll。在此处下断点,重新attach上去。

因为此处的ImageMan.dll是动态加载的,所以不能直接对这个地址下断点,这里就采用硬件断点来下断:

1
ba e 1 273406b

查看栈回溯:

2AA8CBFC-FA97-4899-B93D-B1760D63995B

发现调用函数为0x2734027,在0x271c31f处下断点attach:

9CDEE868-B105-4D17-B9CE-01236811C9AA

看到该函数的三个参数中的第二个就是所构造的溢出内容。继续往下走:

3B85678C-2BBC-4F2B-9C5B-0121216AF6C2

往上面对比一下,可以发现edi就是第一个参数,edx就是第三个参数,可以大致猜测到这个函数的功能就是复制字符串操作,复制个数限制在第三个参数。

一直回溯,断在此处:

93878F07-019A-49A9-9F05-856656AFE879

再往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
·········

第一个函数:

C684F05A-A6EF-4680-9CA9-E336728BA410

在看IDA:

024A54D9-7946-4EAF-9BBA-387424ACB785

该函数是把ipWideCharStr转化为AscII保存到MultiByteStr中,且个数不超过0x104个,ipWideCharStr就是我们构造的数据,远大于0x104,所以MultiByteStr不存在空字符,全由A填满。再往下看:

C9B8450E-1991-4BFE-9CF9-13EAE3EF019B

IDA中:

E41F943D-F245-49DF-AC4A-105A88255006

该函数为寻找MultiByteStr中有无\字符串,有则返回地址,无则返回NULL。往下:

72723FE8-24BB-4A0E-BE01-5D2677A50922

IDA中:

39C37DC8-FBFD-41BA-9B3E-97AF79E8AF0B

这个函数相当于strncmp函数。此函数就是溢出函数了。

溢出原因就是,复制的目标地址和源复制地址空间是相邻的,且大小都为0x104。

C3E7DA61-685B-45A4-9F6D-6FC305A2FB98

在strrchr函数中没有找到\字符串,返回了NULL,即上面的v10为空,得到一个负数,在内存中很大,复制字数过多了,导致溢出。

溢出效果:

F1CC3852-8368-42A8-B0B3-3C77B34F39F7

支持一下
扫一扫,支持v1nke
  • 微信扫一扫
  • 支付宝扫一扫