AFL入门介绍

AFL入门介绍1 AFL 简介 AFL AmericanFuzz 是由安全研究员 Micha Zalewski lcamtuf 开发的一款基于覆盖引导 Coverage guided 的模糊测试工具 它通过记录输入样本的代码覆盖率 从而调整输入样本以提高覆盖率 增加发现漏洞的概率 其工作流程大致如下 从源码编译程序时进行插桩 以记录代码覆盖率 CodeCoverage 选择一些输入文件 作为初始测试集加入输入队列 queue 将队列中的文件按一定的策略进行 突变 如果经过变异

1、AFL简介

AFL(American Fuzzy Lop)是由安全研究员Michał Zalewski(@lcamtuf)开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。其工作流程大致如下:

①从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);

②选择一些输入文件,作为初始测试集加入输入队列(queue);

③将队列中的文件按一定的策略进行“突变”;

④如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;

⑤上述过程会一直循环进行,期间触发了crash的文件会被记录下来。

AFL

2、AFL变异的方式

bitflip:按位翻转,1变为0,0变为1

arithmetic:整数加/减算术运算

interest:把一些特殊内容替换到原文件中

dictionary:把自动生成或用户提供的token替换/插入到原文件中

havoc:“大破坏”,是前面几种变异的组合

splice:“连接”,此阶段会将两个文件拼接起来得到一个新的文件

3、AFL安装和使用

系统:Ubuntu 16.04        AFL:afl-2.52b

make sudo make install

下面我们进行一个简单的AFL实验了解其使用流程。

3.1准备被测程序

首先创建一个简单的test.c源文件,里面放入我们要测的c程序。

3.2插桩编译

编译过程和普通gcc编译也是一样,除了使用的命令需要带上afl-前缀,因此

afl-gcc -g -o test test.c 

-g选项为使用gdb调试所需,如果不调试就不需加此选项。

3.3准备种子语料库

mkdir fuzz_in fuzz_out echo '1+1' > fuzz_in/seed

3.4开始测试

执行命令,

afl-fuzz -i fuzz_in -o fuzz_out ./test

命令会报错,

[-] Hmm, your system is configured to send core dump notifications to an external utility. This will cause issues: there will be an extended delay between stumbling upon a crash and having this information relayed to the fuzzer via the standard waitpid() API. To avoid having crashes misinterpreted as timeouts, please log in as root and temporarily modify /proc/sys/kernel/core_pattern, like so: echo core >/proc/sys/kernel/core_pattern [-] PROGRAM ABORT : Pipe at the beginning of 'core_pattern' Location : check_crash_handling(), afl-fuzz.c:7275
[-] Whoops, your system uses on-demand CPU frequency scaling, adjusted between 781 and 4003 MHz. Unfortunately, the scaling algorithm in the kernel is imperfect and can miss the short-lived processes spawned by afl-fuzz. To keep things moving, run these commands as root: cd /sys/devices/system/cpu echo performance | tee cpu*/cpufreq/scaling_governor You can later go back to the original state by replacing 'performance' with 'ondemand'. If you don't want to change the settings, set AFL_SKIP_CPUFREQ to make afl-fuzz skip this check - but expect some performance drop. [-] PROGRAM ABORT : Suboptimal CPU scaling governor Location : check_cpu_governor(), afl-fuzz.c:7337

具体原因上述信息已经提到了,大致就是AFL测试时用到功能需要还没有开启,因此,切换到root用户执行上面报错中给出的命令即可。因为上述命令中修改的都是/proc/sys目录下的文件,二者Linux内核映射出来的逻辑文件,并非实际的磁盘文件,重启之后所有修改都会丢失。

echo core | sudo tee /proc/sys/kernel/core_pattern echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
afl-fuzz -i fuzz_in -o fuzz_out ./test

可以正常运行,输出一段信息后呈现如下界面,表示fuzz已经开始了,可以在该界面中查看运行时间、崩溃数量等信息。

AFL入门介绍

 

ctrl-C结束fuzz,可以看到当前目录下已经多出了fuzz_out目录,这是本次模糊测试的结果。

4、fuzz结果分析

crashes:导致目标接收致命signal而崩溃的独特测试用例queue:存放所有具有独特执行路径的测试用例。AFL输出文件:

crashes/README.txt:保存了目标执行这些crashes文件的命令行参数。

hangs:导致目标超时的独特测试用例。

fuzzer_stats:afl-fuzz的运行状态。

plot_data:用于afl-plot绘图。

 参考文献:

AFL漏洞挖掘技术漫谈(一):用AFL开始你的第一次Fuzzing – FreeBuf网络安全行业门户

AFL-数据变异_baizhi2361的博客-CSDN博客

入门AFL | I’m dev

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222393.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:52
下一篇 2026年3月17日 下午3:52


相关推荐

  • 某公司SQL Server 数据库备份方案[通俗易懂]

    某公司SQL Server 数据库备份方案[通俗易懂]概述为了保证XXX公司物业系统数据库的安全,稳定性,数据库管理员应定期备份数据库,采用良好的备份策略,一方面维持数据的安全性;另一方面要保证数据库稳定,顺畅,高效的运行。尽最大的努力减少由于数据丢失或损坏造成的业务系统宕机,须从备份方面做好基本的保障工作。一、备份介绍1.1备份方式SQLServer支持3种类型的备份:完全数据库备份,差异数据库备份,事务日志备份。1.1.1…

    2022年5月15日
    46
  • 添加 OpenAI 节点并选择「Message a model」

    添加 OpenAI 节点并选择「Message a model」

    2026年3月15日
    3
  • Visifire 主要控件「建议收藏」

    Visifire 主要控件「建议收藏」Visifire主要控件柱形图(Column) 曲线图(Line) 折线图(StepLine) 饼图(Pie) 横道图(Bar) 区域图(Area) 环形图(Doughnut) 堆积柱形图(StackedColumn) 100%堆积柱形图(100%StackedColumn) 堆积横道图(StackedBar) 100%堆积横道图(100%Stacked…

    2022年7月21日
    11
  • c++—-随机数算法

    c++—-随机数算法    本文转载:http://blog.csdn.net/luotuo44/article/details/33690179     相对于C++11之前的随机数生成器来说,C++11的随机数生成器是复杂了很多。这是因为相对于之前的只需srand、rand这两函数即可获取随机数来说,C++11提供了太多的选择和东西。 随机数生成算法:   &.

    2022年7月26日
    7
  • 设计模式学习之策略模式

    设计模式学习之策略模式写代码时总会出很多的 if else 或者 case 如果在一个条件语句中又包含了多个条件语句就会使得代码变得臃肿 维护的成本也会加大 而策略模式就能较好的解决这个问题 本篇博客就带你详细了解策略模式 策略模式的定义和使用场景定义 策略模式定义了一系列的算法 并将每一个算法封装起来 而且使他们可以相互替换 让算法独立于使用它的客户而独立变化 分析下定义 策略模式定义和封装了一系列的算法 它们是可以相互替

    2026年3月19日
    2
  • VirtualBox 主机ping不通虚拟机的解决办法

    VirtualBox 主机ping不通虚拟机的解决办法虚拟机与主机之间相互ping通有一个问题,就是虚拟机能够ping通主机本地主机ping不通虚拟机:解决办法:1、如果虚拟机有两个网卡将虚拟机网卡2的连接方式改成桥接即可:⚠️要将虚拟机重启,否则是成功不了的(重要)然后就能够通过网卡2进行连接:2、虚拟机只有一个网卡也是将网卡1改成桥接模式⚠️要将虚拟机重启,否则是成功不…

    2025年6月9日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号