一、前言
二、模糊测试的概念
模糊测试是一种自动化的测试技术,它会根据一定的规则自动或半自动地生成随机数据,然后将这些产生的随机数据输入到动态运行的被测程序入口,同时监控被测程序是否有异常情况出现,如系统崩溃、断言失败等来发现软件的缺陷。
三、模糊测试常用工具
根据模糊测试的测试用例生成方法分为变异测试和生成测试。
变异测试:fuzz软件通过测试软件,根据算法评估结果,将优秀结果放入待变异库,变异后继续测试。
生成测试:提前生成好测试用例模板导入到fuzz软件中测试软件。
基于变异-覆盖制导fuzz:
afl:最经典的fuzz工具
libafl:分为apifuzz模式和frida模式,frida模式可用于无源码fuzz
honggfuzz:用于无源码fuzz
winafl:专用于windows的fuzz
syzkaller:专用于内核fuzz
基于生成的fuzz:
peach:用于数据模板fuzz
四、模糊测试的原理
1、模糊测试的框架
模糊测试首先在插桩后的进程中输入数据,进程生成对应结果并将路径信息传递进行规整,路径信息规整好之后反馈给数据生成器,数据生成器对路径信息进行样本质量评估,高质量的样本将会放入待变异库进行针对性变异并等待下一次数据输入。
2、插桩
(1)插桩方法
原理:clang(前端的语法解析器)/llvm(后端的语法引擎)相结合插桩。
(2)插桩的实现
afl-fuzz进程执行目标进程,在目标进程中插入afl_maybe_log函数,在目标进程中执行函数之后会生成对应的hash以及index索引,根据index索引,目标进程会使afl-fuzz进程与目标进程的共享内存数组中index索引对应位置的值+1,即记录了对应操作执行数量。
生成index索引的过程:
index索引是通过操作A的afl_prev_loc与结果B的afl_maybe_log异或得到的。
3、forkserver
4、index数据规整
5、样本变异
若样本被afl算法评估为优秀或者存在检测到的可能的token,则该样本会被添加到待变异样本队列中继续运行并变异。
样本变异算法分为确定性变异与不确定性变异。
确定性变异:
bitflip :按位翻转,如1011 各个位分别转换为相反数并测试。当测试时发现修改某些字段会导致走向不同路径但是通向同一结果,此时相当于发现token=>这一段必须是这种固定组合。当修改任意字段都通向同一路径,则认为是无价值字段。
arithmetic :整数加/减算术运算
interest :特殊数值替换
dictionary :把自动生成或用户提供的token替换/插入到原文件(字典)
不确定性变异:
havoc :随机变异(在前四种变异中随机选一种进行变异)
splice:文件拼接(将以前的变异文件和现在的比较,一样则不合并,不一样则合并)
6、AFL覆盖制导的一些问题
(1)针对大型项目的缺陷
3、路径过多的时候会删除一部分afl_maybe_log
(2)AFL对抗
在程序中加一个对afl的特征检测——环境变量,若存在则退出程序或清空共享内存。由于AFL固定使用199与198管道,程序自己使用198/199管道或者检测198/199管道即可。
原文始发于微信公众号(智检安全):模糊测试基础(一)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论