欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Vuzzer自动漏洞挖掘工具简单分析附使用介绍

来源:本站整理 作者:vickylzy 时间:2017-08-09 TAG: 我要投稿

Vuzzer 是由计算机科学机构  Vrije Universiteit Amsterdam、Amsterdam Department of Informatics 以及 International Institute of Information Technology, Hyderabad 共同开发的工具。
项目来源 : https://github.com/vusec/vuzzer
参考资料 :《VUzzer: Application-aware Evolutionary Fuzzing》
VUzzer 是什么?
为何选择 VUzzer
自动漏洞测试技术当前主要为基于fuzzing的有结果反馈能力的AFL与使用符号执行的driller等。
​ 符号执行(symbolic execution)的一大优势在于发现尽可能多的路径,实现高覆盖率,但其消耗大量运行空间的方式使其难以扩展,而vuzzer能在不使用符号执行的情况下,对AFL效率进行大幅的提升。
VUzzer使用应用感知的”智能“变异策略——基于数据流和控制流,使用轻量静态分析与动态分析,通过结果反馈和优化输入的生成过程以求产生更优秀更少的测试输入,达到加快挖掘效率,增加挖掘深度的目的。
案例
用以下简单的情况进行对比
...
read(fd,buf,size);
if(buf[5] == 0xD8 && buf[4] == 0xFF){
  //在汇编代码中以CMP形式出现,同时应注意其检查顺序
  if(...)
    //if的嵌套
  ...some useful code containg bug...
 }else{
  ...
 EXIT_ERROR("Invalid file\n");
}
输入buf中的buf[4],buf[5]包含着被污染的数据(tained data)。
对于工具AFL—-对程序进行黑盒测试的fuzzer:
1.必须通过变异输入完全猜对两字节为FFD8才能进入深层代码
2.必须找对该在buf[4],buf[5]的位置进行变异
3.作为一基于覆盖率的fuzzer,AFL追求发现新路径,当AFL没能通过if而进入了else,对其来说仍然发现了新路径,将会以这个进入else的输入作为新的反馈。可能致使AFL过分轻视if分支,这种情况在嵌套判断语句中会更加明显。
这将会使fuzzer浪费大量时间与运算资源,在else和其下的错误处理中。
而对于VUzzer:
1.在静态分析阶段,vuzzer会通过在程序的汇编码中寻找cmp指令集相关命令,将if语句中的判断值提取出来存储在Lcmp当中,找到这些magic bytes值是什么(如 FFD8)
2.而在动态分析中,通过不断迭代,将Lcmp 与取地址值类操作Llea中信息与种子文件输入和新生成输入进行类型匹配等,找到这些magic bytes在输入中的可能位置,更精准的进行变异
3.而对于嵌套判断语句引起的深度代码不易发现的问题,VUzzer的基本块(Basic Block)权重管理将会很好的解决这个问题

对于应用反汇编后,汇编码中的每一个基本块(Basic Block),都有一个权重值,由于VUzzer追求更深层的代码,所以对可能执行到概率越小的块,他的权重值要更高,若从main到达块A的概率为P,其权重就为1/p。
但如何做到这一点?
以上图为例如果说有main开始,那么执行到main的概率就是1,main后有两个可能方向,那么就划分两者概率均为0.5,依次向下。
例如$H{概率}=E*0.5+P{外来}(0.5)*0.5=0.5$
则$H{权重}=1/H{概率}=2$
例图中蓝线所表示为F块触发概率为0.25,权重为倒数4
特别的,对于很小可能含有bug的错误处理块其权重为1(通过动态分析才能发现错误处理块)
由此有了,解决深层代码被隐藏的方法。
VUzzer 概述

vuzzer顶层图(具体术语参见下表)

静态分析阶段
1).在汇编码中进行,找出基本块,计算块权重并将块重量存入LBB
2).扫描编码中的cmp指令相关的立即数,存入Limm(包含如上文中的0xFF,0xD8等)
动态分析阶段—–每一loop为一代
1).对种子文件(使用者提供的基础输入)进行DTA分析,捕获输入中的共同特征,以期找到magic bytes的位置与错误处理块,使新产生的孩子测试输入,不会陷于外围的判断和出错处理
2).对于发现了新的基本块的输入用例,进行DTA分析,追踪输入的值在程序中的运行,监测数据流特征,以推断输入的结构
3).适应度计算
适应度是对每一个输入而言的,适应度越高,代表其可进入更多的块,更深的块(权重更大的块),是更有价值的输入。

再结合此图,对于每一个输入,运行中必会通过一条路径,输入A的适应度就是改路径所经过块的权重和
例如路径1(红色)2(蓝色):
$p1=A-B-D-E-H-J=1+1+2+2+2-1=7$
$p2=A-B-D-E-F-J=1+1+2+2+4-1=9$

$适应度{P2}>适应度{P1}$
输入2将更被看重,更多的参与到生成下一代去,具体做法是将输入按适应度呈顺序排列存入Lfit,再选取使用时,使用前n%的做法
4).生成下一代
其变异来源是被称为vuzzer下的ROOT set的输入集合,其中包含种子文件,tainted input, Lfit中的前n%。

典型的子测试用例演化算法
vuzzer采用典型演化算法步骤并优化
INITIALIZE population with seed inputs       
    repeat
        SELECT1 parents

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载