软件安全课件第4章软件漏洞的挖掘与利用
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“aaaaabbbbbcccccd”787
1771 3 1819 3 1868 3
缺陷点
总时间(秒)
0x80483d4
call ds: strncpy参数
4.125
2:UserInput
4.140
4.135
4.156
TaintDroid的结构图
图 相关智能模糊测试系统
图 智能灰盒测试的一般流程
举例说明:分为以下五个步骤 ➢ 漏洞信息搜集:要善于利用与待分析漏洞相关的一切信息,如:官方公告中的信息,
独立研究机构或独立研究者关于漏洞的分析等。这以CNNVD-201112-203为例。 ➢ 搭建调试环境:在Windows XP SP3系统上调试,先在没有打过补丁的纯净系统上找
到encdec.dll文件,然后再在微软官网上找到MS11-092漏洞对应的补丁程序,从中 提取出打过补丁后的encdec.dll文件。
0x08O4851c<+56>:
mov -0x2c(%ebp),%eax
0x0804851f<+59>:
mov -%edx,0x8(%esp)
0x08048523<+63>:
mov -%eax,0x4(%esp)
0x08048527<+67>:
lea -Oxlb(%ebp)%eax
0x0804852a<+70>:
典型工具:DarunGrim实现了主要的二进制比对分析功能 DarunGrim原理:指纹哈希方法作为它的主要算法,指纹哈希采用指令序列作为特征
值。为了快速地匹配海量的指纹哈希,DaranGrim2把生成的指纹串存在哈希表中然 后进行匹配。 DaranGrim2算法特点:(1)基于基本块的指纹生成;(2)顺序依赖问题的解决; (3)降低哈希碰撞概率;(4)检测函数匹配对;(5)计算匹配指数
(3)
0x2e(%esp),%eax
(4)
0x0804850f<+43>:
mov -0x2c(%ebp),%eax
0x08048512<+46>:
mov %eax,(%esp)
0x08048515<+49>:
call 0x80483f4<strlen@plt>
0x0804851a<+54>:
mov %eax,%edx
举例说明:分为以下五个步骤 ➢ 动态调试:将文件中控制内存分配大小的值改为一个较大的值,如果这样能使
SysAllocateStringLen函数分配内存失败,则这个畸形样本就可以触发漏洞。本文中 所选用的样本文件中有很多“Vali”标签,将其偏移为0x20处的值改为一个较大的值, 如改为“00 00 00 7F”。在sub_4ADE5AA2函数入口处下断点,然后单步或逐步下 断点,观察寄存器值的变化。
测试步骤: ➢ 污点分析:(1)内存/寄存器污点向量:将程序使用的4G虚拟内存中的用户输入标记
为污点源,对于每个虚拟地址addr,计算对应的污点标识。(2)污点跟踪:根据指令 执行语义及上下文环境,将指令对污点影响反映到内存和寄存器向量,并标记指令操 作数是否被污染。(3)污点消除:根据指令执行语义及上下文环境,将指令对污点影 响反映到内存和寄存器向量,并标记指令操作数是否被污染。 ➢ 执行Trace获取:通过上述中间语言的转换,以及精确的污点信息跟踪,可以获得如下 的程序执行信息。
渗透测试可以分为广义渗透测试和狭义渗透测试,广义渗透测试的目标对象一般包含 操作系统、数据库系统、网络系统、应用软件、网络设备等;而狭义渗透测试一般特 指网络系统渗透测试。这两个概念与运行系统漏洞分析相似。
图 运行系统漏洞分析原理
图 运行系统漏洞分析技术分类
信息收集概念:分析人员利用社会工程学、主机扫描技术、端口扫描技术等多项技术, 通过人工.或者一些自动化工具收集有关运行系统架构、运行系统所部署机器的网络拓 扑结构及其上面运行的操作系统类型版本、开启的端口及服务等信息。这个阶段搜集 的信息是否充足,直接影响到后续漏洞检测阶段的检测效果。
scanf( %d ,&x); y = x + k; x = 0;
while(i<y);
源代码
污点分析规则: Source点规则 Sink点规则 污点传播规则
词法分析
代码建模 语法分析
中间代码生 成
调用图/控制流图/三地址码/抽象语法树
污点分析
基于数据流 的污点分析
基于依赖关 系的污点分
析
处理分析结 果
JAVA源代码
指针指向分析
混合切片分析
处理分析结果
有限调度处理
2 * y == x
X=0 Y=1
X=2 Y=1
x + y > 10
X = 30 Y = 15 ERROR!
源代码
漏洞分析规则: 符号标记规则
取值约束
词法分析
代码建模 语法分析
中间代码 生成
调用图/控制流图/三地址码/抽象语法树
析
二进制代码比对
动态污点分析 智能灰盒分析
模糊测试
识别目标
识别输入
构建模糊测试 数据
监视执行并过 滤异常
确定可用性
文件读 取
测试数据生成
COM 对象
获取
COM 对象 属性 和方
法
模板 文件 解析
应用程序监控 端
自动化脚本
执行监控 动态调试 异常过滤
测试结果管理
。
if(fgets(buf,sizeof(buf),stdin) == buf){ strcpy(other,buf) system(other)
下面是一个简单的程序示例,假设printf(“ok\n”)是一段含有漏洞的程 序,输人文件为input.txt,下面将简要叙述如何使用智能灰盒测试来进行漏洞检测:
测试步骤: ➢ 关键路径提取:(1)利用静态分析方法识别出程序内部的输入函数和敏感点;(2)
通过搜索策略检测包含输入函数和敏感点的危险路径;(3)使用敏感点逼近算法筛选 危险路径;(4)利用符号执行引擎求解危险路径的路径约束;(5)最后输出覆盖目 标程序危险路径的测试集 ➢ 中间符号设置:将上面的二进制代码转换为中间表示,“中间表示”是一种结构简单、 含义明确的记号系统,可以在中间表示一级对汇编代码进行一定的优化,使符号执行 易于实现。系统的中间表示代码定义了七种语句:定义语句、引用语句、赋值语句、 分支语句、跳转语句、调用语句、返回语句等。
mov %eax,(%esp)
0x0804852d<+73>:
call 0x80483d4<strncpy@plt>
(5)
输人
插桩指 令数
分析指 令数
库函数分 析数
污染源
“123”
777 1742 3
0x80483c4 call ds: gets
“132456”
783
“12345678912” 783
静态漏洞分析 符号执行 约束求解
处理分析 结果
get_slot_by_minor
get_drv_by_nr
spin_lock_irqsave
di 0
0 di 32
di 32 di 0
(di 32 di 0) di 0
di 32 0 di 64
0 di 64 di 32
0x0804855f<+26>:xor 0x08048561<+28>:lea
0x08048565<+32>:mov
0x08048568<+35>:call 0x0804856d<+40>:lea
%eax,%eax 0x2e(%esp),%eax
%eax,(%esp)
0x80483c4<gets@plt>
N
END
Y
反汇编
汇编代码
中间表示构 造
中间表示
中间表示
二进制代码
输入数据生 成
测试用例 指导信息
测试用例
静态分析 基于模式的漏洞分析
二进制代码比对
动静结合分析 动态污点分析 智能灰盒分析
动态分析 随机模糊测试 动态模糊测试
漏洞验证
漏洞
二
二
进
二
进
制
进
制
漏
制
漏
洞
漏
洞
动
洞
静
静
动
态
结
态
分
合
分
析
分
析
输入字符串
参数解析
参数列表管道(任务建 ຫໍສະໝຸດ )操作绑定翻译
主机信息
工具链 工具 任务
执行
结果
构建消费者
创建上下文
创建Lexer和 Parser
运行Lexer
Consumer>HandleTopLevelDecl()
N
Adecl == null?
Y
PaserTopLevelDecl(Adecl) == TRUE?
两个版本的程序之间差异的技术。补丁比对主要通过二进制比对技术实现,通过对补 丁文件和原始文件的比对,找出补丁修补的关键代码逻辑,辅助进行漏洞分析或者进 行1day漏洞的利用。
图 补丁对比的一般原理
基本原理 ➢ 二进制对比技术原理:(1)基于文本的比对:最简单的比对方式,其比对的对象分
为两种,即二进制文件和反汇编代码(2)基于图同构的比对:依托于图论知识,首先 对可执行程序的控制流图进行抽象,将二进制程序转化为一个有向图,即将二进制比 对问题转化为图论中的图同构问题,然后根据图论的知识进行解决(3)基于结构化的 比对:区别于指令比对技术,其注重点是可执行文件逻辑结构上的变化,而不是某一 条反汇编指令的改变,自然就避免了基于图同构方法的缺点(4)综合比对技术:在上 述基本比对技术基础上,进行多种比对技术的综合应用,也成为目前二进制比对技术 的主要研究和应用方向。
BB3: X1=!X
BB4:W1 = *W
BB5: Q1 = *Q
BB
Int contrived_caller(int *w,int x,int *p)
BB0
BB1: param p call kfree param p param w param
BB2:r = ret w1
BB0
contrived_caller
测试步骤: ➢ 路径控制与定向遍历:选择离敏感点最近的路径,对新路径约束通过约束求解器进行
求解,构造生成能够引导程序执行进入敏感点的路径的新输入测试数据。
图 路径控制原理图
测试步骤:
➢ 约束求解:当将指令转化为对应的中间语言,继而收集路径条件生成约束表达式,之后采 用STP约束求解工具计算可达性。用STP进行求解时,当论证形式为无效时,即所有的 ASSERT公式都满足但QUERY公式不满足时,会举出一个反例,并在反例中为约束中的变 量赋值,该赋值使得当前的论证是无效的。
源代码
漏洞分析规则: 状态机模型
取值分析模型
词法分析
代码建模 语法分析
中间代码生 成
调用图/控制流图/三地址码/抽象语法树
静态漏洞分析 数据流分析
检测分析结 果
Int contrived(int *p,int *w,int x) BB0
BB1: if(x)
BB2: param w
图 Smart Fuzzing体系结构
基本概念:通过分析软件代码在打补丁前后的差异就可以比较快速地定位产生漏洞的 代码位置,这便是基于补丁比对的漏洞分析技术,也可称为基于二进制代码比对的漏 洞分析技术。其目的就是通过分析软件开发商提供的补丁的相关信息,定位出补丁所 修补的软件漏洞。
基本原理 ➢ 补丁对比技术原理:补丁比对技术是一种通过比对打补丁前后的目标代码,分析发现
举例说明:分为以下五个步骤 ➢ 补丁对比:调试之前首先要确定调试的目标,即针对哪些函数、关注什么信息。确定
调试目标的过程就需要用到补丁比对技术。这里选用的补丁比对工具是DarunGrim 3.12 Beta。将encdec.dll 6.5.2600.5512和encdec.dll 6.5.2600.6161两个文件使用 DarunGrim 3工具进行补丁比对。 ➢ 静态分析:通过补丁比对,找出了需要分析的目标函数和子函数。接下来要做的就是 逆向和调试工作。对补丁之前的encdec.dll文件进行逆向分析,分析的目标函数是通 过补丁比对找出的sub_4ADE5825。
contrived
kfree
源代码
进入Fortify SCA
Fortify 前端
系统自带规则 用户定义规则
输入规则
进入Fortify SCA
规则生成器
NST 生成器
NST
分析引擎 数据流引擎 控制流引擎 语义引擎 结构引擎 控制引擎
审计工作台 FortifyCSA工作
台
FPR
Source点 Sink点
图 QUERY公式
典型工具:Smart fuzzing Smart fuzzing的原理:通过一种动静态结合的方式,来将程序的执行流程导向最易触
发漏洞的状态空间,并提升fuzzing的效率。Smart fuzzing使用符号执行和污点分析 等技术,大大增加了代码的覆盖能力,且有 针对性地检测某些安全敏感点的行为也大大 增加了漏洞发现的概率,提高了检测效率。