绪论
典型安全问题
- 恶意软件:在计算机系统上执行病毒, 木马等程序,通过破坏软件进程来实施控制;
- 软件漏洞:由于软件程序设计失误存在漏洞,导致攻击可以利用漏洞引起敏感数据泄露或获取控制权;
- 软件后门:软件开发人员刻意设计的后门,对用户隐瞒的一些功能,在日后用于特殊目的。
主要方法和技术
- 反汇编与反编译
- 程序调试
- 程序切片
- 污点传播分析
- 符号执行
- 模糊测试
主要分析应用
- 恶意软件分析
- 网络协议逆向分析
- 软件漏洞分析与利用
PE文件结构
- PE文件结构分为:PE头、DOS部分、区块表、区块数据
- PE文件头里的image_optional_header里的SizeOfStackCommit和SizeOfHeapCommit对应程序运行时的堆和栈
- 区块数据里的.data节和.text节对应程序运行时的数据块和代码块
程序切片
切片基础知识及原理
程序切片主要通过寻找程序内部的相关特性,从而分解程序,然后对分解所得的程序切片进行分析研究,以此达到对整个程序理解和认识的目的。 给定程序P, s是P中的一个语句,V是P中变量的集合,则P关于(s,V)的程序切片是P的一个,子集P’,P’中只包含那些可能影响s处的变量V的语句的集合。 一般将(s,V)称为切片标准,切片得到的程序P’称为程序片。切片标准中的语句s也常用s的编号n代替,变量集合V也常常缩减为一个变量v,即切片标准为C=(n,v)。 P’必须满足如下特征:
- P’必须是一个有效的程序。
- 对于所有的输入,P’和P的执行行为一致:无论何时,若P终止,则P’也能终止,且对任意v,P’与P计算得出v的结果值相同。
基于图可达性算法的切片方法
由于程序的控制依赖关系和数据依赖关系都能体现在程序依赖图上,因此可以将程序的切片问题转换为图的遍历问题,即在程序依赖图上,把所有从切片准则所在的节点可达的节点(无论数据依赖还是控制依赖边)均加入切片中。
符号执行
概念
即使用符号值代替真实值执行。 符号执行是一种重要的形式化方法和软件分析技术,通过使用符号执行技术,将程序中变量的值表示为符号值和常量组成的计算表达式,符号是指取值集合的记号,程序计算的输出被表示为输入符号值的函数,其在软件测试和程序验证中发挥着重要作用,并可以应用于程序漏洞的检测。 简单的来说,符号执行就是在运行程序时,用符号来替代真实值。
优点
符号执行相较于真实值执行的优点在于: 当使用真实值执行程序时,我们能够遍历的程序路径只有一条 而使用符号进行执行时,由于符号是可变的,我们就可以利用这一特性,尽可能的将程序的每一条路径遍历 这样的话,必定存在至少一条能够输出正确结果的分支,每一条分支的结果都可以表示为一个离散关系式,使用约束求解引擎即可分析出正确结果,这就是符号执行的简单阐述。
缺点
符号执行的路径选择问题到现在依旧是一个很大的问题: 当我们的程序存在循环时,因为符号执行会尽量遍历所有的路径,所以每次循环之后会形成至少两个分支,当循环的次数足够多时,就会造成路径爆炸,整个机器的内存会被耗尽。
典型的符号执行工具
- Triton
- angr
3种符号执行
- 传统符号执行:并不真实的执行,而是通过解析程序通过符号值模拟执行。
- 动态符号执行:结合了真实执行和传统符号执行技术的优点,在真实执行的过程中同时进行符号执行。
- 选择性符号执行:可以对程序员感兴趣的部分进行符号执行,其它的部分使用真实值执行,代表工具S2E。
动态符号执行
动态符号执行使用一个具体的值进行符号执行。 这种符号执行可以避免由循环引起的路径爆炸,和在表达式太复杂或系统调用会生成值时给符号一个具体的值。 在这种方法中,我们每次只考虑一条路径,输入约束会随着程序路径的不断延伸而不断增长,当路径走到尽头时,将其中某一个约束条件取反,以到达新的代码路径。
动态符号执行分析流程
- 程序实际执行、符号执行及约束条件提取:路径上的每条指令都需要同时做符号化执行处理。
- 路径约束条件取反求解和路径遍历
动态执行程序提取路径约束 约束条件取反,生成新的路径约束条件 求解生成新的测试用例 继续开展测试
符号执行树
用来描述程序执行路径的树形结构。 符号执行的关键思想就是,把输入变为符号值,那么程序计算的输出值就是一个符号输入值的函数。 简而言之,就是一个程序执行的路径通常是true和false条件的序列,这些条件是在分支语句处产生的。 在序列的if位置如果值是true,那么意味着if条件语句走的是then这个分支; 反之如果是false就意味着程序执行走的是else分支。
模糊测试
模糊测试是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。 其是一种安全测试方法,他介于完全的手工测试和完全的自动化测试之间。
模糊测试的重要性
完全的手工测试即是渗透测试,测试人员可以模拟黑客恶意进入系统、查找漏洞,这对测试人员的要求比较高。 能力强的测试人员可以发现比较多或者高质量的安全性问题,但是如果测试人员的能力不够,可能就不能找到足够多、威胁大的安全漏洞。 所有渗透测试对人员能力的依赖性强,成本高,难以大规模的实施。 但是想用完全的自动化来实现渗透测试也不可行,同一套测试用例和方法不可能不加修改的就用在不同的产品上,因为各个产品的需求、实现、功能等等都不一样。测试过程中还需要测试人员的介入来分析结果、判断漏洞等等。 那么,这种情况下我们就可以引入模糊测试。
模糊测试的工作模式
- 本地模糊测试:应用于本地系统或者托管的目标系统上,比如命令行模糊测试、文件格式模糊测试、 内核模糊测试。
- 网络模糊测试:远程模糊测试远程测试目标网络。比如:网络协议模糊测试、数据库模糊测试、Web模糊测试。
- 虚拟机模糊测试:模糊测试系统主要通过虚拟机的控制接口对测试对象进行控制。云计算环境下的模糊测试。
模糊测试的过程
确定测试的目标
确定输入的向量
生成模糊测试数据,可由测试工具通过随机或是半随机的方式生成
测试工具将生成的数据发送给被测试的系统(输入)
测试工具检测被测系统的状态(如是否能够响应,响应是否正确等)
根据被测系统的状态判断发现是否有漏洞可以被利用
模糊测试的组成
一般来说,模糊测试分为测试数据生成、数据交互与控制、测试结果反馈3个阶段。
模糊测试的基本原理
模糊测试需要构造合适的输入,然后强制目标接收输入数据,并观测目标的反应,同时需要批量和自动化地进行测试来提高测试速度。 从执行过程来说,模糊测试的执行过程非常简单:
(1)生成fuzz数据;
(2)将fuzz数据输入;
(3)查看目标的响应是否正常;
(4)根据目标响应判断是否存在潜在漏洞
模糊测试的基本方法和技术
模糊测试充分利用了机器的能力:随机生成和发送数据;
同时,也尝试将安全专家在安全性方面的经验引入进来。
- 数据生成模块:生成字段数据值;组装网络数据包;合成多阶段交互数据结构
- 状态监控模块:监控网络流量;判断服务是否正常运行
- 环境控制模块:建立网络连接;根据协议交互过程发送数据包;缓存发送数据包
污点传播分析
污点或污染数据,指那些外部非可信实体数据源输入到应用程序的数据。 污点传播分析用来追踪和防止对这些不可信数据的直接使用。
污点分析的基本原理
(1)污点源,污点分析的目标来源,通常表示来自程序外部的不可信数据,包括硬盘文件内容、网络数据包等。 (2)传播规则,污点分析的计算依据,通常包括污点扩散规则和清除规则,其中普通赋值语句、计算语句可使用扩散规则、而常值赋值语句则需要利用清除规则进行计算。 (3)污点检测,污点分析的功能体现,通常在程序执行过程中的敏感位置进行污点判定,而敏感位置主要包括程序跳转以及系统函数调用等。
恶意代码检测和分析
按照恶意代码的功能来区分,可分为病毒、蠕虫、木马、后门、僵尸程序、下载器、Rootkit、恐吓软件、勒索软件等。 (1)病毒。病毒具有自我复制的功能,一般嵌入主机的程序中。病毒一般都具有破坏性。 (2)木马。这种程序从表面上看没有危害,但实际上却隐含着恶意的意图和破坏的作用,通常不容易被发现。 (3)蠕虫。蠕虫可以自动创建与它的功能完全相同的副本,并能在无人干涉的情况下自动运行,大量地复制占用计算机的空间,使计算机的运行缓慢甚至瘫痪。 (4)移动代码。移动代码是能够从主机传输到客户端计算机上并执行的代码,它通常是作为病毒、蠕虫或者是特洛伊木马的一部分被传送到客户的计算机上的。 (5)间谍软件。散布间谍软件的网站或个人会使用各种方法使用户下载间谍软件并将其安装在他们的计算机上。
典型的分析流程
- 用成熟的工具进行快速的静态属性分析,识别已经有分析结果的样本
- 开展静态代码分析,识别其中的混淆代码,大致了解代码结构和执行流程
- 使用静态分析了解样本的组成和结构,初步判断样本是否包含恶意代码,为动态分析提供准备
- 选择适合工具进行动态分析,观察恶意代码的行为和功能
- 根据静态和动态分析的结果,对恶意代码的攻击过程、功能特点、实现机理进行深入分析
静态分析
在不执行二进制程序的条件下,利用分析工具对恶意代码的静态特征和功能模块进行分析的技术
(1)基于代码特征的分析技术
在基于代码特征的分析过程中,不考虑恶意代码的指令意义,而是分析指令的统计特性、代码的结构特性等。
(2)基于代码语义的分析技术
基于代码语义的分析技术要求考虑构成恶意代码的指令的含义,通过理解指令语义建立恶意代码的流程图和功能框图,进一步分析恶意代码的功能结构。
优势:避免恶意代码执行过程对分析系统的破坏。
缺陷:
- 由于静态分析本身的局限性,导致出现问题的不可判定;
- 绝大多数静态分析技术只能识别出已知的病毒或恶意代码,对多态变种和加壳病毒则无能为力。
无法检测未知的恶意代码是静态分析技术的一大缺陷。
动态分析
是指恶意代码执行的情况下,利用程序调试工具对恶意代码实施跟踪和观察,确定恶意代码的工作过程,对静态分析结果进行验证。
(1)外部观察技术。外部观察技术是利用系统监视工具观察恶意代码运行过程中系统环境的变化,通过分析这些变化判断恶意代码功能的一种分析技术。
(2)跟踪调试技术。跟踪调试技术是通过跟踪恶意代码执行过程使用的系统函数和指令特征分析恶意代码功能的技术。在实际分析过程中,跟踪调试可以有两种方法: ①单步跟踪恶意代码执行过程,即监视恶意代码的每一个执行步骤,在分析过程中也可以在适当的时候执行恶意代码的一个片段,这种分析方法可以全面监视恶意代码的执行过程,但是分析过程相当耗时。 ②利用系统hook技术监视恶意代码执行过程中的系统调用和API使用状态来分析恶意代码的功能,这种方法经常用于恶意代码检测。
软件漏洞挖掘与分析
- 以漏洞利用的位置为标准:
本地漏洞:攻击代码需要在目标主机上运行,主要为提权漏洞、本地溢出漏洞等。
远程漏洞:通过网络访问向目标主机发送攻击数据包,获得远程主机的控制权、添加用户或执行远程控制代码。
- 按照产生机理分类:
非控制流劫持类漏洞:攻击者无法直接控制程序控制流,但能够通过其他方式影响程序的执行逻辑,针对此类漏洞的攻击通常以修改应用程序相关的关键敏感数据为目的,如配置数据、用户输入数据、用户身份信息和与关键条件判断相关的数据等。 控制流劫持类漏洞:使得程序的控制流转移目标地址能够被输入数据所控制,因而可以通过篡改控制流相关的数据(例如函数指针、函数返回地址等)来劫持程序执行权,通过插入代码或者重用已有的程序代码来实现利用的目的。 包括栈溢出漏洞、堆溢出漏洞、释放后重用漏洞、整数溢出漏洞等,以及部分非控制流劫持漏洞,包括SQL注入漏洞、跨站脚本漏洞(XSS)