1# American Fuzzy Lop plus plus (AFL++) 2 3<img align="right" src="https://raw.githubusercontent.com/AFLplusplus/Website/main/static/aflpp_bg.svg" alt="AFL++ logo" width="250" heigh="250"> 4 5Release version: [4.10c](https://github.com/AFLplusplus/AFLplusplus/releases) 6 7GitHub version: 4.10c 8 9Repository: 10[https://github.com/AFLplusplus/AFLplusplus](https://github.com/AFLplusplus/AFLplusplus) 11 12AFL++ is maintained by: 13 14* Marc "van Hauser" Heuse <[email protected]> 15* Dominik Maier <[email protected]> 16* Andrea Fioraldi <[email protected]> 17* Heiko "hexcoder-" Eissfeldt <[email protected]> 18* frida_mode is maintained by @Worksbutnottested 19* Documentation: Jana Aydinbas <[email protected]> 20 21Originally developed by Michal "lcamtuf" Zalewski. 22 23AFL++ is a superior fork to Google's AFL - more speed, more and better 24mutations, more and better instrumentation, custom module support, etc. 25 26You are free to copy, modify, and distribute AFL++ with attribution under the 27terms of the Apache-2.0 License. See the [LICENSE](LICENSE) for details. 28 29## Getting started 30 31Here is some information to get you started: 32 33* For an overview of the AFL++ documentation and a very helpful graphical guide, 34 please visit [docs/README.md](docs/README.md). 35* To get you started with tutorials, go to 36 [docs/tutorials.md](docs/tutorials.md). 37* For releases, see the 38 [Releases tab](https://github.com/AFLplusplus/AFLplusplus/releases) and 39 [branches](#branches). The best branches to use are, however, `stable` or 40 `dev` - depending on your risk appetite. Also take a look at the list of 41 [important changes in AFL++](docs/important_changes.md) and the list of 42 [features](docs/features.md). 43* If you want to use AFL++ for your academic work, check the 44 [papers page](https://aflplus.plus/papers/) on the website. 45* To cite our work, look at the [Cite](#cite) section. 46* For comparisons, use the fuzzbench `aflplusplus` setup, or use 47 `afl-clang-fast` with `AFL_LLVM_CMPLOG=1`. You can find the `aflplusplus` 48 default configuration on Google's 49 [fuzzbench](https://github.com/google/fuzzbench/tree/master/fuzzers/aflplusplus). 50 51## Building and installing AFL++ 52 53To have AFL++ easily available with everything compiled, pull the image directly 54from the Docker Hub (available for both x86_64 and arm64): 55 56```shell 57docker pull aflplusplus/aflplusplus 58docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus 59``` 60 61This image is automatically published when a push to the stable branch happens 62(see [branches](#branches)). If you use the command above, you will find your 63target source code in `/src` in the container. 64 65Note: you can also pull `aflplusplus/aflplusplus:dev` which is the most current 66development state of AFL++. 67 68To build AFL++ yourself - *which we recommend* - continue at 69[docs/INSTALL.md](docs/INSTALL.md). 70 71## Quick start: Fuzzing with AFL++ 72 73*NOTE: Before you start, please read about the 74[common sense risks of fuzzing](docs/fuzzing_in_depth.md#0-common-sense-risks).* 75 76This is a quick start for fuzzing targets with the source code available. To 77read about the process in detail, see 78[docs/fuzzing_in_depth.md](docs/fuzzing_in_depth.md). 79 80To learn about fuzzing other targets, see: 81* Binary-only targets: 82 [docs/fuzzing_binary-only_targets.md](docs/fuzzing_binary-only_targets.md) 83* Network services: 84 [docs/best_practices.md#fuzzing-a-network-service](docs/best_practices.md#fuzzing-a-network-service) 85* GUI programs: 86 [docs/best_practices.md#fuzzing-a-gui-program](docs/best_practices.md#fuzzing-a-gui-program) 87 88Step-by-step quick start: 89 901. Compile the program or library to be fuzzed using `afl-cc`. A common way to 91 do this would be: 92 93 ``` 94 CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared 95 make clean all 96 ``` 97 982. Get a small but valid input file that makes sense to the program. When 99 fuzzing verbose syntax (SQL, HTTP, etc.), create a dictionary as described in 100 [dictionaries/README.md](dictionaries/README.md), too. 101 1023. If the program reads from stdin, run `afl-fuzz` like so: 103 104 ``` 105 ./afl-fuzz -i seeds_dir -o output_dir -- \ 106 /path/to/tested/program [...program's cmdline...] 107 ``` 108 109 To add a dictionary, add `-x /path/to/dictionary.txt` to afl-fuzz. 110 111 If the program takes input from a file, you can put `@@` in the program's 112 command line; AFL++ will put an auto-generated file name in there for you. 113 1144. Investigate anything shown in red in the fuzzer UI by promptly consulting 115 [docs/afl-fuzz_approach.md#understanding-the-status-screen](docs/afl-fuzz_approach.md#understanding-the-status-screen). 116 1175. You will find found crashes and hangs in the subdirectories `crashes/` and 118 `hangs/` in the `-o output_dir` directory. You can replay the crashes by 119 feeding them to the target, e.g. if your target is using stdin: 120 121 ``` 122 cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...] 123 ``` 124 125 You can generate cores or use gdb directly to follow up the crashes. 126 1276. We cannot stress this enough - if you want to fuzz effectively, read the 128 [docs/fuzzing_in_depth.md](docs/fuzzing_in_depth.md) document! 129 130## Contact 131 132Questions? Concerns? Bug reports? 133 134* The contributors can be reached via (e.g., by creating an issue): 135 [https://github.com/AFLplusplus/AFLplusplus](https://github.com/AFLplusplus/AFLplusplus). 136* Take a look at our [FAQ](docs/FAQ.md). If you find an interesting or important 137 question missing, submit it via 138 [https://github.com/AFLplusplus/AFLplusplus/discussions](https://github.com/AFLplusplus/AFLplusplus/discussions). 139* Best: join the [Awesome Fuzzing](https://discord.gg/gCraWct) Discord server. 140* There is a (not really used) mailing list for the AFL/AFL++ project 141 ([browse archive](https://groups.google.com/group/afl-users)). To compare 142 notes with other users or to get notified about major new features, send an 143 email to <[email protected]>, but note that this is not 144 managed by us. 145 146## Branches 147 148The following branches exist: 149 150* [release](https://github.com/AFLplusplus/AFLplusplus/tree/release): the latest 151 release 152* [stable/trunk](https://github.com/AFLplusplus/AFLplusplus/): stable state of 153 AFL++ - it is synced from dev from time to time when we are satisfied with its 154 stability 155* [dev](https://github.com/AFLplusplus/AFLplusplus/tree/dev): development state 156 of AFL++ - bleeding edge and you might catch a checkout which does not compile 157 or has a bug. **We only accept PRs (pull requests) for the 'dev' branch!** 158* (any other): experimental branches to work on specific features or testing new 159 functionality or changes. 160 161## Help wanted 162 163We have several [ideas](docs/ideas.md) we would like to see in AFL++ to make it 164even better. However, we already work on so many things that we do not have the 165time for all the big ideas. 166 167This can be your way to support and contribute to AFL++ - extend it to do 168something cool. 169 170For everyone who wants to contribute (and send pull requests), please read our 171[contributing guidelines](CONTRIBUTING.md) before you submit. 172 173## Special thanks 174 175Many of the improvements to the original AFL and AFL++ wouldn't be possible 176without feedback, bug reports, or patches from our contributors. 177 178Thank you! (For people sending pull requests - please add yourself to this list 179:-) 180 181<details> 182 183 <summary>List of contributors</summary> 184 185 ``` 186 Jann Horn Hanno Boeck 187 Felix Groebert Jakub Wilk 188 Richard W. M. Jones Alexander Cherepanov 189 Tom Ritter Hovik Manucharyan 190 Sebastian Roschke Eberhard Mattes 191 Padraig Brady Ben Laurie 192 @dronesec Luca Barbato 193 Tobias Ospelt Thomas Jarosch 194 Martin Carpenter Mudge Zatko 195 Joe Zbiciak Ryan Govostes 196 Michael Rash William Robinet 197 Jonathan Gray Filipe Cabecinhas 198 Nico Weber Jodie Cunningham 199 Andrew Griffiths Parker Thompson 200 Jonathan Neuschaefer Tyler Nighswander 201 Ben Nagy Samir Aguiar 202 Aidan Thornton Aleksandar Nikolich 203 Sam Hakim Laszlo Szekeres 204 David A. Wheeler Turo Lamminen 205 Andreas Stieger Richard Godbee 206 Louis Dassy teor2345 207 Alex Moneger Dmitry Vyukov 208 Keegan McAllister Kostya Serebryany 209 Richo Healey Martijn Bogaard 210 rc0r Jonathan Foote 211 Christian Holler Dominique Pelle 212 Jacek Wielemborek Leo Barnes 213 Jeremy Barnes Jeff Trull 214 Guillaume Endignoux ilovezfs 215 Daniel Godas-Lopez Franjo Ivancic 216 Austin Seipp Daniel Komaromy 217 Daniel Binderman Jonathan Metzman 218 Vegard Nossum Jan Kneschke 219 Kurt Roeckx Marcel Boehme 220 Van-Thuan Pham Abhik Roychoudhury 221 Joshua J. Drake Toby Hutton 222 Rene Freingruber Sergey Davidoff 223 Sami Liedes Craig Young 224 Andrzej Jackowski Daniel Hodson 225 Nathan Voss Dominik Maier 226 Andrea Biondo Vincent Le Garrec 227 Khaled Yakdan Kuang-che Wu 228 Josephine Calliotte Konrad Welc 229 Thomas Rooijakkers David Carlier 230 Ruben ten Hove Joey Jiao 231 fuzzah @intrigus-lgtm 232 Yaakov Saxon Sergej Schumilo 233 ``` 234 235</details> 236 237## Cite 238 239If you use AFL++ in scientific work, consider citing 240[our paper](https://www.usenix.org/conference/woot20/presentation/fioraldi) 241presented at WOOT'20: 242 243 Andrea Fioraldi, Dominik Maier, Heiko Eißfeldt, and Marc Heuse. “AFL++: Combining incremental steps of fuzzing research”. In 14th USENIX Workshop on Offensive Technologies (WOOT 20). USENIX Association, Aug. 2020. 244 245<details> 246 247<summary>BibTeX</summary> 248 249 ```bibtex 250 @inproceedings {AFLplusplus-Woot20, 251 author = {Andrea Fioraldi and Dominik Maier and Heiko Ei{\ss}feldt and Marc Heuse}, 252 title = {{AFL++}: Combining Incremental Steps of Fuzzing Research}, 253 booktitle = {14th {USENIX} Workshop on Offensive Technologies ({WOOT} 20)}, 254 year = {2020}, 255 publisher = {{USENIX} Association}, 256 month = aug, 257 } 258 ``` 259 260</details> 261