AFL++

Fork maintenu par la communauté d'American Fuzzy Lop, un fuzzer guidé par la couverture pour trouver des crashs et des bugs de sûreté mémoire dans des binaires compilés. Community-maintained fork of American Fuzzy Lop — a coverage-guided fuzzer for finding crashes and memory-safety bugs in compiled binaries.

↗ https://github.com/AFLplusplus/AFLplusplus

Overview

AFL++ extends the classic AFL fuzzer with modern instrumentation modes (QEMU/Unicorn for black-box binaries, LLVM/GCC plugins for source-available targets), better mutators, and persistent-mode/parallel fuzzing support. It’s the standard starting point for finding memory corruption and logic bugs prior to exploit development.

Common Usage

Instrument a source-available target at compile time

afl-cc -o target target.c

Fuzz with an initial seed corpus

afl-fuzz -i seeds/ -o findings/ -- ./target @@

Fuzz a binary-only target via QEMU mode (no source needed)

afl-fuzz -Q -i seeds/ -o findings/ -- ./target @@

Persistent-mode fuzzing (much faster, requires harness support)

afl-fuzz -i seeds/ -o findings/ -- ./target_persistent

Minimize a crashing test case

afl-tmin -i crash_input -o minimized_input -- ./target @@

Parallel Fuzzing

Main (deterministic) fuzzer

afl-fuzz -i seeds/ -o findings/ -M main -- ./target @@
# Secondary fuzzers on other cores
afl-fuzz -i seeds/ -o findings/ -S sec1 -- ./target @@
afl-fuzz -i seeds/ -o findings/ -S sec2 -- ./target @@

Tips

  • Seed the corpus with small, valid, diverse inputs — corpus quality matters more than fuzzing time
  • Use afl-cmin to shrink a corpus down to the inputs that give unique coverage before long runs
  • Check findings/default/crashes/ for triage candidates; feed them into a debugger or afl-tmin first
Help / Man page
afl-fuzz [options] -- /path/to/target [args] [@@]

Required:
  -i dir      Input directory with test cases (seeds)
  -o dir      Output directory for findings

Optional:
  -M name     Distributed mode: main fuzzer
  -S name     Distributed mode: secondary fuzzer
  -Q          Use QEMU mode to fuzz uninstrumented binaries
  -m megs     Memory limit for child process (default 50MB, "none" to disable)
  -t msec     Timeout per run
  -x file     Dictionary file with extra tokens
  -f file     Write mutated input to file instead of stdin
  @@          Placeholder replaced with path to mutated input file

Vue d’ensemble

AFL++ étend le fuzzer classique AFL avec des modes d’instrumentation modernes (QEMU/Unicorn pour les binaires black-box, plugins LLVM/GCC pour les cibles dont on a la source), de meilleurs mutateurs, et le support du mode persistant et du fuzzing parallèle. C’est le point de départ standard pour trouver de la corruption mémoire et des bugs de logique avant le développement d’exploit.

Utilisation courante

# Instrumenter une cible dont on a la source, à la compilation
afl-cc -o target target.c

# Fuzzer avec un corpus de seeds initial
afl-fuzz -i seeds/ -o findings/ -- ./target @@

# Fuzzer une cible binaire seule via le mode QEMU (aucune source nécessaire)
afl-fuzz -Q -i seeds/ -o findings/ -- ./target @@

# Fuzzing en mode persistant (bien plus rapide, nécessite le support du harness)
afl-fuzz -i seeds/ -o findings/ -- ./target_persistent

# Minimiser un cas de test qui provoque un crash
afl-tmin -i crash_input -o minimized_input -- ./target @@

Fuzzing parallèle

# Fuzzer principal (déterministe)
afl-fuzz -i seeds/ -o findings/ -M main -- ./target @@

# Fuzzers secondaires sur les autres cœurs
afl-fuzz -i seeds/ -o findings/ -S sec1 -- ./target @@
afl-fuzz -i seeds/ -o findings/ -S sec2 -- ./target @@

Conseils

  • Amorcez le corpus avec des entrées petites, valides et variées : la qualité du corpus compte plus que le temps de fuzzing
  • Utilisez afl-cmin pour réduire un corpus aux seules entrées qui donnent une couverture unique avant les longues campagnes
  • Regardez findings/default/crashes/ pour les candidats au triage ; passez-les d’abord dans un débogueur ou dans afl-tmin
Aide / Page de manuel
afl-fuzz [options] -- /path/to/target [args] [@@]

Required:
  -i dir      Input directory with test cases (seeds)
  -o dir      Output directory for findings

Optional:
  -M name     Distributed mode: main fuzzer
  -S name     Distributed mode: secondary fuzzer
  -Q          Use QEMU mode to fuzz uninstrumented binaries
  -m megs     Memory limit for child process (default 50MB, "none" to disable)
  -t msec     Timeout per run
  -x file     Dictionary file with extra tokens
  -f file     Write mutated input to file instead of stdin
  @@          Placeholder replaced with path to mutated input file