码迷,mamicode.com
首页 > 其他好文 > 详细

漏洞分析入门一

时间:2018-10-15 23:12:58      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:教程   技术分享   proc   pat   并且   缓冲区溢出   位置   也有   分配   

0x00: 什么是漏洞及漏洞分类
1. 漏洞是指信息系统在生命周期的各个阶段(设计、实现、运维等过程)中产生的某类问题,这些问题会对系统的安全(机密性、完整性、可用性)产生影响。
2. 漏洞的分类:本地漏洞(比如:权限提升类漏洞)、远程漏洞
基于技术类型的分类:内存破坏类、逻辑错误类、输入验证类、设计错误类、配置错误类、栈缓冲区溢出、堆缓冲区溢出、静态数、释放后重用、二次释放。

0x01: 漏洞挖掘一般方法
1. 手动法漏洞挖掘
手动法挖掘,就是不使用自动挖掘工具,手动分析软件可能出问题的地方。其中挖掘点是靠手动来寻找的,畸形数据也是手动来构造的。用这种发现软件漏洞的方法,一般称为手动法。
手动测试不需要专业的fuzz工具,并且测试的漏洞主要是堆栈溢出漏洞,原理较为简单。因此手动挖掘的速度是非常快的,效率也是比较高的。可以在短时间内发现可利用的缓冲区溢出漏洞。
但是相对于文件格式漏洞难以挖掘(比如各种图片声音等等这样复杂的文件格式,是不适合定位于手动挖掘)。因为文件格式的处理逻辑一般都较为复杂,关于这一点手动挖掘方法效果不是很好。
2. 静态扫描:
这种漏洞挖掘方法的思路就是扫描目标程序的二进制文件,通过PE文件分析,指令分析等来发现目标程序中存在的潜在漏洞代码。最容易想到的就是通过扫描PE文件的倒入表,查找是否存在危险函数,这种扫描方法速度快,而且比较有效,但是也有缺点:检出率不高,存在遗漏,因为只能扫描到倒入表这一方面,而如果一些模块是使用了静态lib链接的话,那就可能直接把某些危险函数嵌入了模块内部,倒入表中不存在。所以还需要加以指令分析的方法,但是指令分析的实现难度和成本都比较高,因为要考虑到所有的漏洞模式,这也导致了另一个缺点检测速度非常慢。
3. FUZZ法进行漏洞挖掘
Fuzz属于动态方法,凡是动态方法的都需要有一个比较全面的路径覆盖,所以需要比较高的自动化系统,实现成本比较高,
一般fuzz的步骤如下:
a.选取目标文件。
b.用Fuzz工具对目标文件的格式进行变异,生成大量的畸形样本。
c.让程序分别载入并解析这些畸形样本,监测程序是否会触发异常。
d.通过逆向分析这些异常样本,查看是否是漏洞同时确定危害级别。
通用FUZZ优点:
上手容易,不需要了解文件格式即可对目标进行漏洞挖掘。全自动化,效率很高。
通用FUZZ缺点:
测试深度不够,只适合一些文件结构较为简单的文件格式,对复杂的文件格式无能为力。
0x02: 什么是缓冲区溢出
1. 缓冲区溢出的含义是为缓冲区提供了多于其存储容量的数据,就像往杯子里倒入了过量的水一样。通常情况下,缓冲区溢出的数据只会破坏程序数据,造成意外终止。但是如果精心构造溢出数据的内容,那么就有可能获得系统的控制权!
2. 溢出漏洞利用,是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束进行攻击行为。
0x03: 从操作系统的角度看堆和栈
1. 在物理机中是没有堆栈的概念,只是一片空间而也,只有当操作系统与程序运行起来后才给与了堆栈的概念。
2. 栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放
3. 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆则是存放在二级缓存中,生命周期由垃圾回收算法来决定。
0x04: 缓冲区溢出漏洞攻击实战
1. 目标软件介绍:S-Demo是一个大多被破解者用来作破解动画教程的软件,它可以记录你的屏幕上的任何动作及鼠标的移动过程。
2. 漏洞简介:该软件录制后的视频文件格式属于自己定义的一种文件格式。如果将视频文件加密时密钥会被加密存放在视频文件中,当要播放视频时,程序会验证密码的正确性,然后读取视频文件中存放的加密密钥做比较,会取加密后的密钥放入内存栈中,在执行strcpy函数拷贝加密后的密钥时,没有对密钥进行长度检测,导致堆栈溢出。如果用户用sdemo播放器打开黑客构造特定的视频文件,可以导致任意代码执行。
3. 通过逆向分析解析视频文件格式,发现函数处理密钥在文件所在位置如下图。

技术分享图片

4. 构造畸形数据并测试,我们手动构造一个超长字符串为畸形数据(作为加密后的密钥),该密钥字符串是以0结尾的,我们用winhex手动把这个字符串修改的很长,来测试程序是否发生崩溃

技术分享图片

用播放器打开我样构造后的文件就直接死了。

技术分享图片

5. 分析崩溃信息:异常已经成功触发,下面我们用调试器来详细分析一下异常的原理。用X64Dbg载入sdemo播放器S-Player.exe,然后打开我们构造的畸形文件。查看调试器的信息。这时候发现EIP的数值是43434343H,43H为C的ASCII码,也就是说EIP已经被我们所控制,一般情况下能控制EIP的漏洞都是可以利用的,如下图:

技术分享图片

通过调试分析。我们定位到漏洞是由strcpy函数所导致,这个函数没有控制esi所指向数据的大小,esi指向的数据过大后可导致缓冲区溢出,直接淹没缓冲区地址。

技术分享图片

6. 当步过strcpy函数后,观测SEH链表。淹没以后,我们发现SE处理程序是43434343H,这个数据就是我们输入的畸形数据,也就是说,当程序异常我们可以控制SEH了,如下

技术分享图片

7. 漏洞利用,根据上面的分析原理,该漏洞是可以利用的。既然我们可以控制SEH,首先我们要找控制SEH的地址。经过调试,通过计算seh地址到存密钥开始址的大小,定位SEH处理程序的地址。也就是我们让SEH地址为一个内存的某可执行的代码地址,程序异常后,就可以执行了这一段代码。我们证它跳到如下代码处执行,会弹出一个messagebox对话框,只要将SEH地址替换成0040203E就行了。

技术分享图片

技术分享图片

如下图动态调试时栈情况,SHE地址己经被换成了上面代码地址了,程序异常就会执行到该地址处。

技术分享图片

此时我们看下图栈的第3个值,正是我们文件结构内的数据。该数据我们可以控制。下面我们的目标就是要运行到这个指令(数据FFFFFFFFH)。 因此我们只要在内存中选择pop pop ret类似的指令,就可以把栈前2个地址pop掉,然后返回这个指令所在的地址(数据FFFFFFFFH所在的地址)执行这里的指令了。

技术分享图片

在我的程序中找到了这样一段代码。他的地址0x004041BC,代码如下图

技术分享图片

也就是说,我们把SEH地址改为0x004041BC,程序异常后,执行了这一段代码,然后eip返回到指令FFFFFFFFH。我们再把FFFFFFFFH这个数据修改成我们要执行的shellcode,就可以利用了。这时候我们把FFFFFFFFH修改为EB B6 jmp 19FAC8就可以跳到我们的shellcode中执行了。

0x05: shellcode编写

1. 用一句话给的shellcode的下个定义,那就是“一段可以执行特定功能的机器码”。由于时间有限就采用硬编码弹出计算器,用c语言来描述我们要实现的功能其实就是几句代码:

技术分享图片

编译如上代码载入调试器确定被调用函数的虚拟地址, 因为这次是用的是硬编码的方式,所以需要通过查找kernel32.dll的导出表,来确定的的WinExec()和ExitProcess()的虚拟地址。本次虚拟地址为别为:0x764A3980和0x76463A10。

1. 编写汇编代码测试,然后提取shellcode代码。测试结果能成功弹出计算器,用调试加载程序,二进制复制,再粘贴到的的WinHex中。

技术分享图片

技术分享图片

当程序载入了tests_patch_seh.smv文件后,成功弹出来了计算器,如果这个代码不是一个执行计算器的代码,而是一个恶意代码(病毒、木马等)?

0x06:总结

实战部分只讲了一些简单漏洞分析,二进制漏洞所带来的危害巨大,但是发现起来也相对困难,随着攻防对抗的增加,各种各样的防护手段和攻击技巧也层出不穷。Security Cookie、SafeSEH、DEP、ASLR、CFG等一些防护手段来防止漏洞的利用,攻与防是一场没有尽头的战争。

 

漏洞分析入门一

标签:教程   技术分享   proc   pat   并且   缓冲区溢出   位置   也有   分配   

原文地址:https://www.cnblogs.com/2014asm/p/9795034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!