CVE-2012-0158基于exp分析
CVE-2012-0158这个洞我之前分析过,漏洞战争这本书里也写过,但是都是用poc分析的,我这次找了一个弹计算器的exp来分析,感觉用poc和用exp还是不一样的,从exp分析要比从poc分析更复杂一些,或者说是要使用一些独特的小技巧。顺带补齐漏洞利用的内容,上次没有写这个,看了一下漏洞分析这本书也没有写怎么利用的这个漏洞。
0x0.分析漏洞
0x2.漏洞本质成因
0x3.漏洞利用
0x0.分析漏洞
首先是用windbg挂载word2003进程,F5继续执行之后加载exp文件,会发现中断在了如图所示的地方。

可以由图看出来这是进程退出了,由此推测是shellcode执行完成并且安全顺利的退出了进程。我们要做的就是定位shellcode在内存中的位置。kp一下,如图。可以看到是刚刚调用了ExitProcess函数。

通过对ExitProcess函数下断就可以顺藤摸瓜找到shellcode的位置,如图我们可以看到ExitProcess的调用位置是0x12165C,这个地址明显是在栈上的。

我们来看下0x12165C这个地址到底是有什么东西,如图可以看到确实是shellcode。

然后就是最重要的问题了,我们知道栈溢出是函数向栈上写入数据导致的。我们现在已经知道了栈上的写入位置了,那么怎么找出是在哪个函数中进行写入的呢?这里就是一个技巧了,也是从仙果版主那里学到的。
方法是:对这块栈下写入记录断点,根据断点输出情况来分析。
但是这个断点会影响效率,所以我们尽可能晚的去下记录断点。我们在准备打开文件时Ctrl+Break抛出一个断点。然后下断ba w 4 0x12165C "r eip;gc",输出如图。

可以看到了,最后一个非栈上eip既是漏洞的触发点。如果对这个地方下断的话可以看到0x275c87cb这个地方的是执行过多次的,我们反复调试可以找到最后触发漏洞的那一次,也可以对ecx即复制的大小下条件断点进行输出来看一下什么情况。
如图所示我使用了 ba e 1 MSCOMCTL!DllGetClassObject+0x41a84 "r ecx;gc"来下条件记录断点,输出可以看到有一个超大的ecx=0x8282而我们知道ecx就是复制的次数也就是复制的字节数,这里我们就找到了是第4次调用到memcpy时发生了溢出。

在第四次调用时断下来,看一下前面。我们可以看到以下一些语句
275c878a 8b7d10 mov edi,dword ptr [ebp+10h]
275c87c1 8bcf mov ecx,edi
275c87c8 c1e902 shr ecx,
275c87cb f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
可以看出所谓的复制的字节数其实是来自上层传递过来的参数3。来kv看一下,的确如此。

我们在IDA里看一下到底是怎么导致的漏洞


可以看到参数都是从上面传过来的,0x8282这么大的导致溢出的值也是上层出现的问题,我们继续往上跟踪。我们知道栈溢出是属于一个函数的栈,我们的目的就是找出是那个函数的局部变量缓冲区被溢出了,所以我们要明确向上跟踪的目标,就是找出是某个函数的局部变量我们的目的就达到了。
根据00121458 275e701a 06b5ce6c 07a70810 00000000 MSCOMCTL!DllGetClassObject+0x41cc6这个栈回溯来看,我们继续跟到了这个函数位置。如下图

根据上图我们明显的看到了漏洞的造成,目的地址是栈中的一个8字节的局部缓冲区,但是在复制的时候判断复制尺寸的大小使用cmp [ebp+dwBytes],8 jb loc_275d3085时却是大于8时跳转到复制路径(注意那根红色的线),所以就造成了明显的溢出。
至此,漏洞分析完毕。
0x2.漏洞本质成因
如果是根据网上的资料来看的话,样本的分析应该很简单,只是一个OLE对象而已。但是我手里只有一个经过加密的exp(而且还是excel的)。这就给分析工作增大了难度
CVE-2012-0158基于exp分析的更多相关文章
- Hibernate一级缓存(基于查询分析)
首先我们应该弄清什么是hibernate缓存:hibernate缓存是指为了降低应用程序对物理数据源的访问频次,从而提高应用程序的运行性能的一种策略.我们要将这个跟计算机内存或者cpu的缓存区分开. ...
- x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器
基于Xv6-OS 分析CR0 寄存器 之前一直认为晕乎乎的...啥?什么时候切换real model,怎么切换,为什么要切换? ------------------------------------ ...
- 基于CAS分析对ABA问题的一点思考
基于CAS分析对ABA问题的一点思考 什么是CAS? 背景 synchronized加锁消耗太大 volatile只保证可见性,不保证原子性 基础 用CPU提供的特殊指令,可以: 自动更新共享数据; ...
- 微软BI 之SSAS 系列 - 在 SQL Server 2012 下查看 SSAS 分析服务的模型以及几个模型的简单介绍
在SSDT中部署一个 SSAS 项目到本地服务器上出现错误. You cannot deploy the model because the localhost deployment server i ...
- SQL Server 2012 列存储索引分析(翻译)
一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...
- windwos下基于exp的提权
00x1: 本文是基于windwos 补丁的漏洞提权. 其实是一件很简单的工作:如果看成数据库的3张表分别是: 未打补丁表, 补丁漏洞表, 漏洞利用提权程序表. 为一一对应关系,所以就是资源的掌握,以 ...
- SQL Server 2012 列存储索引分析(转载)
一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...
- 【Python量化投资】基于技术分析研究股票市场
一 金融专业人士以及对金融感兴趣的业余人士感兴趣的一类就是历史价格进行的技术分析.维基百科中定义如下,金融学中,技术分析是通过对过去市场数据(主要是价格和成交量)的研究预测价格方向的证券分析方法. 下 ...
- bcc 基于bpf 分析linux 系统性能的强大工具包
bcc 是一个基于bpf 的强大linux io,网络监控分析工具集(当然也可以分析java,ruby,python...) 一张工具图 说明 bcc 好多工具是需要kernel 4.1 的,但是大部 ...
随机推荐
- Long与long的区别
Java的数据类型分两种:1.基本类型:long,int,byte,float,double,char2. 对象类型(类): Long,Integer,Byte,Float,Double,Char,S ...
- Ansible9:条件语句
目录 一.when 1.基本用法 2.在when中使用jinja2的语法 3.使用bool值作为when的判断条件 4.在when中使用defined关键字 5.when在循环语句中的使用方法 6.在 ...
- js 字符串格式化
在js 文件中写一个函数 String.prototype.format = function(args) { var result = this; if (arguments.length > ...
- 手把手教你使用koa2
简介 koa是由express的原班人马打造的web框架.但是相对于express,koa的性能要更高,因为koa通过使用aysnc函数,帮你丢弃回调函数,并有力的增强了错误处理.而且koa没有绑定任 ...
- Linux装机利器Cobbler安装配置
Linux装机利器Cobbler安装配置 2011-05-27 15:31:05 分类: LINUX 一.安装环境 centos 5.4 关掉iptables 关掉 selinux selinux ...
- [整理]C语言中字符常量与ASCII码
所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为 ...
- 20145226夏艺华 《Java程序设计》第6周学习总结
教材学习内容总结 学习目标 理解流与IO 理解InputStream/OutPutStream的继承架构 理解Reader/Writer继承架构 会使用装饰类 会使用多线程进行并发程序设计 第十章 输 ...
- 图片src拼接后台返回ID
本文地址:http://www.cnblogs.com/veinyin/p/8507403.html 在学习 CSS 时只了解了给固定地址,但是如果给的是一个需要拼接的地址就蒙了,以下是基于 Vue ...
- 阿里云mysql数据库设置让公网访问客户端访问
第一步 首先使用root登入你的mysql ./mysql -u root -p 你的密码 第二步 备注:也可以添加一个用户名为yuancheng,密码为123456,权限为%(表示任意ip都能连接) ...
- Python练习-有点儿意思的用户登录
Alex大神的需求(说实话他需求真特么多,真难满足他): 编写一个用户登陆接口:输入用户名密码,认证成功后显示欢迎信息,输错三次后锁定; # 编辑者:闫龙 #用户登录功能输入3次以上会被锁定:为了方便 ...