office-cve-2012-0158漏洞分析与利用

漏洞分析环境与工具

操作系统:Windows 7 专业版 32位

office 版本:2003 Sp3

工具:OllyDbg、windbg、IDA Pro、OfficeMalScanner等

###漏洞分析

####一、获取poc

通过一些网络和论坛,例如freebuf、看雪论坛等。

####二、调试漏洞,定位溢出代码块

1.复现漏洞

​ 搭建好所需要的环境,安装相应的系统与office版本。在调试之前利用云沙箱获取一些漏洞信息,如图所示:

在这里插入图片描述
​ 本次分析中是利用OD去附加,所以首先需要对OD进行设置。如下图所示。

在这里插入图片描述

​ 然后打开漏洞POC文件,出现如下情况:

在这里插入图片描述

​ 关掉该POC,重新打开word2003,然后使用OD调试器去加载word程序,如图所示:

在这里插入图片描述
​ 加载完以后运行在用word打开poc文档,出现如下情况:

在这里插入图片描述
在这里插入图片描述

​ 可以看出函数返回地址被修改成了41414141,往上追朔,发现函数MSCOMCTL.275C8A0A,判断模块MSCOMCTL可能发生了溢出。右击该地址选择反汇编可以看到该模块相关信息。
在这里插入图片描述

2.分析漏洞

​ 对漏洞进行调试,定位关键溢出代码块

在这里插入图片描述
​ 可以看出在执行了MSCOMCTL.275c8760这个函数以后发生了堆栈覆盖现象,断定,MSCOMCTL模块发生了溢出。利用IDA PRO对MSCOMCTL模块进行分析,如图所示。

在这里插入图片描述

​ 可以得到buff的一些信息,继续结合OD动态来调试,观察275C876D参数,

在这里插入图片描述
​ 发现有两个表示长度的量需要注意,v7是读取出来的,而dwBytes是表示传入的参数,是否可以改变需要继续分析。

在这里插入图片描述

​ 其中跟IDA PRO 中与之对应的函数三个参数如上图所示。F7单步步入这个MSCOMCTL.275C8760函数,可以定位到溢出代码,如图所示。

在这里插入图片描述
​ 对此处溢出的代码用IDA PRO 继续分析,可以更透彻。

在这里插入图片描述

​ 分析漏洞成因,用010Editor打开,获取shellcode长度后,在文件中搜索定位长度,其中有两个长度,猜测一个是dwBytes,另一个是v7。

在这里插入图片描述

​ 任意修改一个字节,使用OD调试器动态调试来验证,发现参数没有改变,但是局部变量改变了。可以得出,文件中第一个8282是参数中的长度,第二个8282是函数内读取的长度,两个长度都是在文件中,因此可以随意溢出。

在这里插入图片描述

​ 更改后用OD调试器调试,可以看到83是局部变量的值,

在这里插入图片描述

​ 由此可以得到,CVE-2012-0158漏洞触发在MSCOMCTL.OCX模块中,漏洞的原因是在读取数据的过程中,读取的长度和验证的长度都在文件中,因此可以随意改变这两个值的大小,触发栈溢出。

三、漏洞利用

​ 由上可以清楚该漏洞的原理,可以对该漏洞进行利用。步骤如下:首先,分析和设计漏洞shellcode的结构;在运行的程序中寻找跳板指令地址 jmp esp。本次漏洞利用ImmunityDebugger与mony.py。安装ImmunityDebugger,再将mona.py放入PyCommands目录中。!mona modules,找到Rebase ,SafeSEH, ASLR,NXCompat 为 False ,而 OS DLL 为 True 的系统模块。首先使用命令 !mona modules,找到Rebase ,SafeSEH, ASLR,NXCompat 为 False ,而 OS DLL 为 True 的系统模块。
在这里插入图片描述

​ 再使用命令 !mona find -s “\xff\xe4” -m msvbvm60.dll 获取 jmp esp 地址为 0x729A0535。

在这里插入图片描述

​ 最后编写 shellcode,注入 shellcode

// 1. 获取 Kernel32 基地址
// 2. 获取 GetProcAddress 地址
// 3. 获取 LoadLibraryA 地址
// 4. 获取 user32 基地址
// 5. 获取 MessageBoxA 地址
// 6. 调用 MessageBoxA 地址
// 7. 获取 ExitProcess 地址
// 8. 调用 ExitProcess

int main()
{
   
	_asm
	{
   
		pushad;
		sub esp, 0x50;
		jmp tag_ShellCode;
		// GetProcAddress\
		_asm _emit(0x47)_asm _emit(0x65)_asm _emit(0x74)_asm _emit(0x50)
		_asm _emit(0x72)_asm _emit(0x6f)_asm _emit(0x63)_asm _emit(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值