AFL的并行模式

参考/docs/parallel.txt

1.介绍

每一个afl-fuzz都需要占用一个CPU内核。这意味着在多核系统上,能可以运行几个fuzzing。事实上,如果你在多核系统上只运行一个fuzzing工作,这将造成硬件的浪费。所以,并行化是一个很好的方法。

2.单系统的并行

如果你想在本地的多核系统上并行化的运行一个fuzzing,能只想要新建一个空的文件夹(sync_dir)用来被afl-fuzz进程所共享,并给每一个afl-fuzz命名,如“fuzzer01","fuzzer02"等。

首先运行一个Master进程:

./afl-fuzz -i testcase_dir -o sync_dir -M fuzzer01 [...other stuff...]

然后开始其他的slave进程:

./afl-fuzz -i testcase_dir -o sync_dir -S fuzzer02 [...other stuff...]
./afl-fuzz -i testcase_dir -o sync_dir -S fuzzer03 [...other stuff...]

每一个fuzzer都在sync_dir文件夹中有一个单独的空间来存储其状态,如

/sync_dir/fuzzer01/

每一个fuzzer都会遍历/sync_dir/文件夹中被其他fuzzer所创建的测试用例,并且将它们加入自己的fuzzing队列中,如果它们足够有趣的话。

Master进程与Slave进程的不同之处在于Master进程使用确定性策略进行变异,而Slave进程则是使用随机性策略。如果你不想使用确定性策略,则可以在运行所有afl-fuzz时都加上-S选项。当对目标的模糊测试非常缓慢或复杂时,这是一个很好的选择。

实验上证明,启动多个Master进程是可行的,不过这样通常会造成浪费。

./afl-fuzz -i testcase_dir -o sync_dir -M masterA:1/3 [...]
./afl-fuzz -i testcase_dir -o sync_dir -M masterB:2/3 [...]
./afl-fuzz -i testcase_dir -o sync_dir -M masterC:3/3 [...]

冒号后面的数字,第一个表示这个master进程的ID值,第二个表示总的Master进程数量。注意,如果启动比传递给-M的第二个数字指示的更少的模糊器,则可能会导致覆盖率不高。

你还可以通过命令行的afl-whatsup工具监视你的fuzzing进程,当找不到新的路径时,就是时候停止了。

显式指定-f选项时请务必小心。 每个fuzzer必须使用一个单独的临时文件; 否则事情出现错误。 一个安全的例子可能是:

./afl-fuzz [...] -S fuzzer10 -f file10.txt ./fuzzed/binary @@
./afl-fuzz [...] -S fuzzer11 -f file11.txt ./fuzzed/binary @@
./afl-fuzz [...] -S fuzzer12 -f file12.txt ./fuzzed/binary @@

如果您使用@@而不使用-f并且让afl-fuzz出现文件名,这没有关系。

3.多系统的并行

多系统上的并行操作与单系统上的区别不大。唯一的差别是需要写一个简单的脚本完成2个操作:

  • 使用ssh连接到主机上,检索每个fuzzer文件夹中的/path/to/sync_dir/<fuzzer_id>/queue/目录下的tar文件

    for s in {1..10}; do
          ssh user@host${s} "tar -czf - sync/host${s}_fuzzid*/[qf]*" >host${s}.tgz
    done
    
  • 对这些文件进行解压

    for s in {1..10}; do
          for d in {1..10}; do
            test "$s" = "$d" && continue
            ssh user@host${d} 'tar -kxzf -' <host${s}.tgz
          done
    done
    

在/experimental/distributed_fuzzing文件夹中有个脚本实例。

也可以参看这两个网站:

https://github.com/MartijnB/disfuzz-afl

https://github.com/richo/roving

4.远程监控与数据收集

你可以使用screen,nohup,tmux等工具运行远程afl-fuzz实例。原则上,可以使用Master进程的状态屏幕来监控其他的Slave进程并决定何时停止。你还可以依赖该实例的输出目录来收集合成的语料库。

5.不对称设置

值得注意,以下的操作都是允许的:

  • 你可以与其他可以提高代码覆盖率的工具一起运行afl-fuzz.
  • 你可以使用不同(但相关)的目标二进制文件运行一些同步的fuzzers。
  • 有一些以不同的方式调用二进制文件的fuzzers。
  • 可以使用不同的起始测试用例或字典来运行同步的fuzzers。
### 配置和使用AFL Fuzzer的QEMU模式 #### 设置核心转储模式 为了确保在遇到错误能够正常处理,需要调整内核的核心转储模式。这一步骤对于防止某些类型的崩溃报告至关重要[^2]。 ```bash sudo su echo core >/proc/sys/kernel/core_pattern exit ``` #### 定义环境变量 定义必要的环境变量可以简化后续命令并确保路径正确无误。特别是`AFL_PATH`应指向AFL安装位置,而`QEMU_LD_PREFIX`则需指定目标架构库的位置。 ```bash export AFL_PATH=/path/to/afl-directory export QEMU_LD_PREFIX=./target_architecture_lib_directory/ ``` #### 启动模糊测试会话 启动AFL fuzzer,通过添加特定选项来启用QEMU模式,并指明输入输出目录以及其他必要参数。这里的关键在于使用`-Q`标志激活QEMU支持,同可能还需要其他如内存限制(`-m`)等附加设置以优化性能或解决潜在问题。 ```bash afl-fuzz -i input_test_cases_dir -o output_results_dir -m none -Q -- ./binary_to_fuzz @@ ``` 上述命令中: - `-i`: 输入样本所在文件夹。 - `-o`: 输出结果保存文件夹。 - `-m`: 设定最大可用内存,默认单位为MB;此处设为`none`表示不限制。 - `-Q`: 开启QEMU模式。 - `--`: 命令分隔符之后跟随待测程序及其参数。 #### 处理常见错误提示 如果忽略了一些重要的配置项,则可能会遭遇不同形式的警告或失败情况。例如忘记修改默认的核心转储行为可能导致报错1;不声明`QEMU_LD_PREFIX`环境变量会造成报错3等问题。因此,在执行前务必仔细检查所有预设条件是否满足。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值