documentation update

This commit is contained in:
van Hauser
2019-08-08 10:36:43 +02:00
parent 65a3a9773d
commit 2971b5b315
5 changed files with 60 additions and 20 deletions

35
TODO
View File

@ -1,6 +1,6 @@
Roadmap 2.53d: Roadmap 2.53d:
============== ==============
- indent all the code: clang-format -style=Google - indent all the code: .clang-format
- update docs/sister_projects.txt - update docs/sister_projects.txt
@ -18,16 +18,41 @@ gcc_plugin:
qemu_mode: qemu_mode:
- deferred mode with AFL_DEFERRED_QEMU=0xaddress - deferred mode with AFL_DEFERRED_QEMU=0xaddress
@andrea - dont we have that already with AFL_ENTRYPOINT?
unit testing / or large testcase campaign unit testing / or large testcase campaign
Roadmap 2.54d: Roadmap 2.54d:
============== ==============
- expand MAP size to 256k (current L2 cache size on processors) Problem: Average targets (tiff, jpeg, unrar) go through 1500 edges.
-> 18 bit map At afl's default map that means ~16 collisions and ~3 wrappings.
- llvm_mode: dynamic map size and collission free basic block IDs Solution #1: increase map size.
every +1 decreases fuzzing speed by ~10% and halfs the collisions
birthday paradox predicts at collisions at this # of edges:
2^16 = 302
2^17 = 427
2^18 = 603
2^19 = 853
2^20 = 1207
2^21 = 1706
2^22 = 2412
2^23 = 3411
2^24 = 4823
Its an easy solution but also not a good one.
Solution #2: use dynamic map size and collision free basic block IDs
This only works in llvm_mode and llvm >= 9 though
A potential good future solution
Solution #3: write instruction pointers to a big shared map
512kb/1MB shared map and the instrumented code writes the instruction
pointer into the map. Map must be big enough but could be command line
controlled.
Good: complete coverage information, nothing is lost. choice of analysis
impacts speed, but this can be decided by user options
Neutral: a little bit slower but no loss of coverage
Bad: completely changes how afl uses the map and the scheduling.
Overall another very good solution
qemu_mode: qemu_mode:
- persistent mode patching the return address (WinAFL style) - persistent mode patching the return address (WinAFL style)
- instrument only comparison with immediate values by default when using compcov - instrument only comparison with immediate values by default when using compcov

View File

@ -17,6 +17,8 @@ sending a mail to <afl-users+subscribe@googlegroups.com>.
Version ++2.53d (dev): Version ++2.53d (dev):
---------------------- ----------------------
- llvm 9 is now supported (still needs testing)
- fix building qemu on some Ubuntus (thanks to floyd!)
- custom mutator by a loaded library is now supported (thanks to kyakdan!) - custom mutator by a loaded library is now supported (thanks to kyakdan!)
- fix for a few features to support different map sized than 2^16 - fix for a few features to support different map sized than 2^16
- afl-showmap: new option -r now shows the real values in the buckets (stock - afl-showmap: new option -r now shows the real values in the buckets (stock
@ -26,7 +28,6 @@ Version ++2.53d (dev):
- ... your patch? :) - ... your patch? :)
-------------------------- --------------------------
Version ++2.53c (release): Version ++2.53c (release):
-------------------------- --------------------------

View File

@ -257,10 +257,14 @@ The QEMU wrapper used to instrument binary-only code supports several settings:
Use this if you are unsure if the entrypoint might be wrong - but Use this if you are unsure if the entrypoint might be wrong - but
use it directly, e.g. afl-qemu-trace ./program use it directly, e.g. afl-qemu-trace ./program
- If you want to specify a specific entrypoint into the binary (this can - AFL_ENTRYPOINT allows you to specify a specific entrypoint into the
be very good for the performance!), use AFL_ENTRYPOINT for this. binary (this can be very good for the performance!).
The entrypoint is specified as hex address, e.g. 0x4004110 The entrypoint is specified as hex address, e.g. 0x4004110
- AFL_QEMU_COMPCOV is for a sub-project in qemu_mode called ./libcompcov
which implements laf-intel for qemu. It also needs AFL_PRELOAD and
you can find more information in qemu_mode/libcompcov/README.compcov
5) Settings for afl-cmin 5) Settings for afl-cmin
------------------------ ------------------------

View File

@ -8,8 +8,7 @@ Fast LLVM-based instrumentation for afl-fuzz
1) Introduction 1) Introduction
--------------- ---------------
! llvm_mode works with llvm version 3.8.1 up to 8.x ! ! llvm_mode works with llvm versions 3.8.1 up to 9 !
! llvm version 9 does not work yet !
The code in this directory allows you to instrument programs for AFL using The code in this directory allows you to instrument programs for AFL using
true compiler-level instrumentation, instead of the more crude true compiler-level instrumentation, instead of the more crude

View File

@ -46,7 +46,19 @@ Note: if you want the QEMU helper to be installed on your system for all
users, you need to build it before issuing 'make install' in the parent users, you need to build it before issuing 'make install' in the parent
directory. directory.
3) Notes on linking 3) Options
----------
There is ./libcompcov/ which implements laf-intel (splitting memcmp,
strncmp, etc. to make these conditions easier solvable by afl-fuzz).
Highly recommended.
Another option is the environment variable AFL_ENTRYPOINT which allows
move the forkserver to a different part, e.g. just before the file is
opened (e.g. way after command line parsing and config file loading, etc)
which can be a huge speed improvement.
4) Notes on linking
------------------- -------------------
The feature is supported only on Linux. Supporting BSD may amount to porting The feature is supported only on Linux. Supporting BSD may amount to porting
@ -68,7 +80,7 @@ practice, this means two things:
Setting AFL_INST_LIBS=1 can be used to circumvent the .text detection logic Setting AFL_INST_LIBS=1 can be used to circumvent the .text detection logic
and instrument every basic block encountered. and instrument every basic block encountered.
4) Benchmarking 5) Benchmarking
--------------- ---------------
If you want to compare the performance of the QEMU instrumentation with that of If you want to compare the performance of the QEMU instrumentation with that of
@ -84,7 +96,7 @@ Comparative measurements of execution speed or instrumentation coverage will be
fairly meaningless if the optimization levels or instrumentation scopes don't fairly meaningless if the optimization levels or instrumentation scopes don't
match. match.
5) Gotchas, feedback, bugs 6) Gotchas, feedback, bugs
-------------------------- --------------------------
If you need to fix up checksums or do other cleanup on mutated test cases, see If you need to fix up checksums or do other cleanup on mutated test cases, see
@ -106,7 +118,7 @@ with -march=core2, can help.
Beyond that, this is an early-stage mechanism, so fields reports are welcome. Beyond that, this is an early-stage mechanism, so fields reports are welcome.
You can send them to <afl-users@googlegroups.com>. You can send them to <afl-users@googlegroups.com>.
6) Alternatives: static rewriting 7) Alternatives: static rewriting
--------------------------------- ---------------------------------
Statically rewriting binaries just once, instead of attempting to translate Statically rewriting binaries just once, instead of attempting to translate
@ -114,12 +126,11 @@ them at run time, can be a faster alternative. That said, static rewriting is
fraught with peril, because it depends on being able to properly and fully model fraught with peril, because it depends on being able to properly and fully model
program control flow without actually executing each and every code path. program control flow without actually executing each and every code path.
If you want to experiment with this mode of operation, there is a module The best implementation is this one:
contributed by Aleksandar Nikolich:
https://github.com/vanhauser-thc/afl-dyninst https://github.com/vanhauser-thc/afl-dyninst
https://groups.google.com/forum/#!topic/afl-users/HlSQdbOTlpg
At this point, the author reports the possibility of hiccups with stripped The issue however is Dyninst which is not rewriting the binaries so that
binaries. That said, if we can get it to be comparably reliable to QEMU, we may they run stable. a lot of crashes happen, especially in C++ programs that
decide to switch to this mode, but I had no time to play with it yet. use throw/catch. Try it first, and if it works for you be happy as it is
2-3x as fast as qemu_mode.