Office 2003 sp3(CVE-2012-0158)漏洞分析报告

 

软件名称Office 2003 sp3

软件版本:2.0

漏洞模块:MSCOMCTL.ocx

模块版本:2.0.0.0

编译日期:2003

操作系统:Windows XP/2003/7/8.1/10

漏洞编号:CVE-2012-0158

危害等级:超危 or 高危 or 中危 or 低危

漏洞类型:栈溢出

威胁类型:本地

  • 软件简介

Microsoft Office 2003 是微软公司针对Windows操作系统所推出的办公室套装软件,包含WORD、EXCEL、PowerPoint等三大组件,用处广泛,多以普及办公室、行政等。与办公室应用程序一样,它包括联合的服务器和基于互联网的服务。

  • 漏洞成因

2.1漏洞介绍

CVE-2012-0158漏洞是一个栈溢出漏洞,该漏洞是微软Office办公软件中的MSCOMCTL.oce中MSCOMCTL.ListView控件时检查错误造成的,攻击者可以通过精心构造的数据控制程序EIP实现任意代码执行

CVE-2012-0158漏洞的微软编号是ms02-027

2.2复现漏洞

准备:获取造成漏洞的poc,安装 office 2003 sp3

使用winworld直接执行poc效果:

2.3调试漏洞

设置OD不忽略异常,不跳过异常,附加WINWORD程序

2.3.1定位漏洞触发点

 

分析溢出点附近堆栈,溢出点下面的堆栈一般是刚刚调用的函数的上一层函数堆栈,溢出后

可能已经破坏,溢出点上面的堆栈一般是刚刚执行的函数堆栈,可以发现有一个地址

275C8A0A,可以看出这个地址是 MSCOMCTL 模块中的地址,由此判断刚刚执行的函数中执

行了 MSCOMCTL 模块中的代码

多次调试发现无随机基址

在调用275C8A0A函数的外部函数下断点

重新调试,观察其返回地址在何处被改变

可以看出返回地址在275C8A05地址,调用MSCOMCTL.275C876D函数后被改变

接下来分析该函数,找到MSCOMCTL.OCX文件,使用IDA找到该函数静态分析一下

发现该函数中有拷贝函数

使用OD进行调试发现是拷贝出了问题,栈破坏将外层函数返回地址覆盖

调用它的函数,发现限定的字节数v7和dwBytes都是局部变量

且同为8282

使用010查看文件发现,两个字节数存储在文件中

改变数字,再次调试

EDI是参数,也就是第一个数是传进来的数字dzbyte,第二个数是限定的字节数v7

也就是可以随意的更改缓冲区的大小,填充时,局部变量存不下,破坏了堆栈

参考:

 

  • 利用过程

漏洞利用的步骤:

1. 分析和设计漏洞 shellcode 的结构

2. 在运行的程序中寻找跳板指令地址

jmp esp

使用ImmunityDebugger+mona.py

将mona.py放入ImmunityDebugger的PyCommands目录中

在ImmunityDebugger中使用 !mona modules命令 遍历模块

找到 Rebase ,SafeSEH, ASLR,NXCompat 为 False ,而 OS DLL 为 True 的系统模块。(也就是,无保护,系统会调用的模块)

msvbvm60.dll

使用!mona find -s "\xff\xe4" -m msvbvm60.dll命令,在找到的模块中,查找jmp esp指令

找到一个可读可执行的jmp esp指令,0x729a0535

以小端方式放入文件缓冲区覆盖返回地址的位置

  • PoC

jmp esp指令地址有了,接下来是写 shellcode

shellcode模板:

弹出一个messagebox,helloworld

 

CVE-2012-0158 漏洞分析报告的更多相关文章

  1. WiFi网络WPA2 KRACK漏洞分析报告

    作者:东帆@阿里安全技术平台团队 --------   0x00 漏洞概述 安全研究员Mathy Vanhoef发现的WPA2协议的KRA(Key Reinstallation Attacks)漏洞, ...

  2. Android APP通用型拒绝服务、漏洞分析报告

    点评:记得曾经有段时间很多SRC平台被刷了大量APP本地拒绝服务漏洞(目前腾讯金刚审计系统已经可检测此类漏洞),移动安全团队发现了一个安卓客户端的通用型拒绝服务漏洞,来看看他们的详细分析吧. 0xr0 ...

  3. office(CVE-2012-0158)漏洞分析报告

    2019/9/12 1.漏洞复现 ①发现崩溃 ②找到漏洞所在的函数,下断点,重新跑起来,单步调试,找到栈被改写的地方 ③分析该函数 把MSCOMCTL拖入IDA,查看该函数代码 ④查看调用栈,回溯. ...

  4. Intel CPU 漏洞分析

    Intel CPU漏洞分析报告 预备知识 存储分级 由于计算机存储分级的特性(第一级:寄存器,第二级:高速缓存,第三级:内存,第四级:磁盘),每一级之间的访问速度差距高达数量级.所以处理器会将用到的数 ...

  5. CVE漏洞分析

    分析cve-2018-9489漏洞和download content provider(CVE-2018-9468, CVE-2018-9493, CVE-2018-9546), 每人至少选择一个漏洞 ...

  6. Google发布SSLv3漏洞简要分析报告

    今天上午,Google发布了一份关于SSLv3漏洞的简要分析报告.根据Google的说法,该漏洞贯穿于所有的SSLv3版本中,利用该漏洞,黑客可以通过中间人攻击等类似的方式(只要劫持到的数据加密两端均 ...

  7. 漏洞分析:CVE 2021-3156

    漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...

  8. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  9. [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)

    Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...

随机推荐

  1. 什么是.NET CLI CLR IL JIT GC,它们是如何工作的

    参考网址: https://cloud.tencent.com/developer/article/1432891 1:什么是.NET? NET 是 Microsoft 的用以创建 XML Web 服 ...

  2. 基于WindowsService的WebSocket编程Demo

    一.什么是WebSocket WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端.说了半天也就是说有了它 ...

  3. 菜鸟攻略–C语言多文件编程初探(二):使用 gcc 手动编译多文件 C 程序

    step1:下载安装 Dev-C++ 已经安装了 Dev-C++ 或系统中的可以跳过这步.去官网下载 Dev-C++.我昨天下载,发现有点慢,所以我把安装文件放到百度网盘了,供大家下载,下载链接为:h ...

  4. jQuery中获取属性值:attr()、html()、text()、val()等(一)

    <!DOCTYPE html> <html> <head> <title>01_basic.html</title> <meta na ...

  5. opencv入门系列教学(二)图像入门:读取、展示并保存视频

    一.从相机读取视频 通常情况下,我们必须用摄像机捕捉实时画面.让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来.        要捕获视频,我们需要 ...

  6. Python也可以拥有延迟函数

    延迟函数defer 我们知道在Golang中有一个关键字defer,用它来声明在函数调用前,会让函数*延迟**到外部函数退出时再执行,注意,这里的退出含义:函数return返回或者函数panic退出 ...

  7. etcd学习(7)-etcd中的线性一致性实现

    线性一致性 CAP 什么是CAP CAP的权衡 AP wihtout C CA without P CP without A 线性一致性 etcd中如何实现线性一致性 线性一致性写 线性一致性读 1. ...

  8. 整理之Fragment

    基础 生命周期 执行层次 进 退 创建与销毁 onAttach -> onCreate -> onCreateView -> onActivityCreate onDestroyVi ...

  9. Excel 快速跳转到工作表

    新建 vba 模块 Sub GotoSheet() tname = InputBox("input table name") If StrPtr(tname) = 0 Then E ...

  10. openresty lua-resty-redis 封装 a wrapper for lua-resty-redis 优雅一点点

    搜了一下别人的封装代码,感觉不够优雅,主要是 set_keepalive 的调用时机不太好 我自己下面的代码是利用 coroutine, 每次当前 phase 结束后自动调用 set_keepaliv ...