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/AFLplusplusOverview
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-cminto 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 orafl-tminfirst
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-cminpour 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 dansafl-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