使用Afl-fuzz (American Fuzzy Lop) 进行fuzzing测试(三)——技术白皮书(technical whitepaper)

本文不完全译自:http://lcamtuf.coredump.cx/afl/technical_details.txt
转载请注明出处。

0. 设计声明(Design statement)

American Fuzzy Lop并不是集中某一规则或者某一理论的POC代码,而是集多种实用型的技术开发的高效、简单、健壮、易用的模糊测试工具。

1. 覆盖率衡量(Coverage measurements)

通过插桩的形式注入到被编译的程序中,实现对分支(branch、edge)覆盖率的捕获,以及分支节点计数。在分支节点处注入的代码基本上是一样的:

  cur_location = <COMPILE_TIME_RANDOM>;
  shared_mem[cur_location ^ prev_location]++; 
  prev_location = cur_location >> 1;

其中cur_location值随机生成,用于简化处理链接复杂项目,并保持XOR均匀输出。

shared_mem[]数组是一个被调用者传入插桩二进制的64Kb SHM大小的区域,每一个在输出映射(map)中的字节集能被认为对应着命中的特定元组(branch_src,branch_dst)。

映射区(map)的大小的选择是为了对几乎所有的特定目标而言,使得碰撞更加零散(sporadic)。可发现的分支数通常在2K到10K之间。

Branch cnt Colliding tuples Example targets
1,000 0.75% giflib, lzo
2,000 1.5% zlib, tar, xz
5,000 3.5% libpng, libwebp
10,000 7% libxml
20,000 14% sqlite
50,000 30% -

同时,映射区的足够小使得映射分析能在微秒级内完成,而且容易适用到L2级缓存。
这种形式的覆盖率能提供跟程序执行路径相关的更多的视野,而不是简单的块覆盖信息(block coverage)。特别的,这种策略能细微地鉴别以下两条执行路径:

A -> B -> C -> D -> E (tuples: AB, BC, CD, DE)
A -> B -> D -> C -> E (tuples: AB, BD, DC, CE)

这能帮助发现潜在程序中的细微的错误条件,因为安全漏洞更经常和非预期的或不正确的状态转换相关,而不仅仅是到达新的基本块。

在上面伪代码中最后一行的移位(shift)操作是为了保留元组的方向性(如果没有这一操作,将很难鉴别A ^ B和B ^ A),以及对比较紧凑的循环保留同一性(否则,A ^ A将明显地与B ^ B等价)。

Intel CPU中缺乏简单饱和的算术操作码(arithmetic opcodes),这意味着命中计数有时会趋近于0。但因为这种情况并不多见,所以相对于性能的折中,是可以接受的。

2. 新行为检测(Detecting new behaviors)

在程序执行过程中,fuzzer维护着一个全局的元组映射,这些数据能使用简单的dword或qword宽度的指令或者简单的循环(loop)迅速实现单次跟踪对比和更新。

当被变异后的测试输入执行跟踪,包含新的元组,相应的输入文件为后续的附加处理进行保留和routed。在执行跟踪过程中,对没有触发新的局部状态转换的测试输入将被丢弃,即使它们的总体控制流系列是唯一的。

这一方式在不需要对复杂执行跟踪时进行

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值