前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漏洞分析入门一

漏洞分析入门一

作者头像
我是小三
发布2018-10-18 11:20:56
1.1K0
发布2018-10-18 11:20:56
举报

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等一些防护手段来防止漏洞的利用,攻与防是一场没有尽头的战争。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x05: shellcode编写
  • 0x06:总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档