aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvanhauser-thc <vh@thc.org>2024-06-26 01:12:04 +0200
committervanhauser-thc <vh@thc.org>2024-06-26 01:12:10 +0200
commitaf47531745ccdc61b5966f213f6cd6cd9030cc2f (patch)
treeae3754474c4772804ef77b280b04410c2606e32d
parente80bd2d30cdfbaa2fca48f7ee96ca114ddb7d74a (diff)
downloadafl++-af47531745ccdc61b5966f213f6cd6cd9030cc2f.tar.gz
improved seed selection algorithm
-rw-r--r--TODO.md3
m---------custom_mutators/gramatron/json-c0
-rw-r--r--docs/Changelog.md1
-rw-r--r--src/afl-fuzz-bitmap.c4
-rw-r--r--src/afl-fuzz-queue.c126
5 files changed, 111 insertions, 23 deletions
diff --git a/TODO.md b/TODO.md
index 6f7505a6..a1431afa 100644
--- a/TODO.md
+++ b/TODO.md
@@ -2,8 +2,7 @@
## Must
- - fast resume:
- use gzopen(fn, "rb"/"wb9-/f/h", gzwrite, gzread and gzclose
+ - docs: AFL_DISABLE_REDUNDANT (large/slow/LAF)
- check for null ptr for xml/curl/g_ string transform functions
- hardened_usercopy=0 page_alloc.shuffle=0
- add value_profile but only enable after 15 minutes without finds
diff --git a/custom_mutators/gramatron/json-c b/custom_mutators/gramatron/json-c
-Subproject 11546bfd07a575c47416924cb98de3d33a4e642
+Subproject af8dd4a307e7b837f9fa2959549548ace4afe08
diff --git a/docs/Changelog.md b/docs/Changelog.md
index c6266e86..09ea8cb6 100644
--- a/docs/Changelog.md
+++ b/docs/Changelog.md
@@ -10,6 +10,7 @@
then a dump will be loaded and the calibration phase skipped.
to disable this feature set `AFL_NO_FASTRESUME=1`
zlib compression is used if zlib is found at compile time
+ - improved seed selection algorithm
- frida_mode:
- AFL_FRIDA_PERSISTENT_ADDR can now be be any reachable address not just
a function entry
diff --git a/src/afl-fuzz-bitmap.c b/src/afl-fuzz-bitmap.c
index 405d2dd6..97ccd3d3 100644
--- a/src/afl-fuzz-bitmap.c
+++ b/src/afl-fuzz-bitmap.c
@@ -463,7 +463,7 @@ save_if_interesting(afl_state_t *afl, void *mem, u32 len, u8 fault) {
if (unlikely(fault == FSRV_RUN_TMOUT && afl->afl_env.afl_ignore_timeouts)) {
- if (likely(afl->schedule >= FAST && afl->schedule <= RARE)) {
+ if (unlikely(afl->schedule >= FAST && afl->schedule <= RARE)) {
classify_counts(&afl->fsrv);
u64 cksum = hash64(afl->fsrv.trace_bits, afl->fsrv.map_size, HASH_CONST);
@@ -489,7 +489,7 @@ save_if_interesting(afl_state_t *afl, void *mem, u32 len, u8 fault) {
/* Generating a hash on every input is super expensive. Bad idea and should
only be used for special schedules */
- if (likely(afl->schedule >= FAST && afl->schedule <= RARE)) {
+ if (unlikely(afl->schedule >= FAST && afl->schedule <= RARE)) {
classify_counts(&afl->fsrv);
classified = 1;
diff --git a/src/afl-fuzz-queue.c b/src/afl-fuzz-queue.c
index 6069f5b9..999929a1 100644
--- a/src/afl-fuzz-queue.c
+++ b/src/afl-fuzz-queue.c
@@ -123,7 +123,7 @@ void create_alias_table(afl_state_t *afl) {
double weight = 1.0;
{ // inline does result in a compile error with LTO, weird
- if (likely(afl->schedule >= FAST && afl->schedule <= RARE)) {
+ if (unlikely(afl->schedule >= FAST && afl->schedule <= RARE)) {
u32 hits = afl->n_fuzz[q->n_fuzz_entry];
if (likely(hits)) { weight /= (log10(hits) + 1); }
@@ -133,39 +133,127 @@ void create_alias_table(afl_state_t *afl) {
if (likely(afl->schedule < RARE)) {
double t = q->exec_us / avg_exec_us;
+
if (likely(t < 0.1)) {
// nothing
- } else if (likely(t <= 0.25))
+ } else if (likely(t <= 0.25)) {
+
+ weight *= 0.95;
- weight *= 0.9;
- else if (likely(t <= 0.5)) {
+ } else if (likely(t <= 0.5)) {
// nothing
- } else if (likely(t < 1.0))
+ } else if (likely(t <= 0.75)) {
+
+ weight *= 1.05;
+
+ } else if (likely(t <= 1.0)) {
+
+ weight *= 1.1;
+
+ } else if (likely(t < 1.25)) {
+
+ weight *= 0.2; // WTF ??? makes no sense
+
+ } else if (likely(t <= 1.5)) {
+
+ // nothing
+
+ } else if (likely(t <= 2.0)) {
+
+ weight *= 1.1;
+
+ } else if (likely(t <= 2.5)) {
+
+ } else if (likely(t <= 5.0)) {
weight *= 1.15;
- else if (unlikely(t > 2.5 && t < 5.0))
+
+ } else if (likely(t <= 20.0)) {
+
weight *= 1.1;
- // else nothing
+ // else nothing
+
+ }
}
double l = q->len / avg_len;
- if (likely(l < 0.1))
- weight *= 0.75;
- else if (likely(l < 0.25))
- weight *= 1.1;
- else if (unlikely(l >= 10))
- weight *= 1.1;
+ if (likely(l < 0.1)) {
+
+ weight *= 0.5;
+
+ } else if (likely(l <= 0.5)) {
+
+ // nothing
+
+ } else if (likely(l <= 1.25)) {
+
+ weight *= 1.05;
+
+ } else if (likely(l <= 1.75)) {
+
+ // nothing
+
+ } else if (likely(l <= 2.0)) {
+
+ weight *= 0.95;
+
+ } else if (likely(l <= 5.0)) {
+
+ // nothing
+
+ } else if (likely(l <= 10.0)) {
+
+ weight *= 1.05;
+
+ } else {
+
+ weight *= 1.15;
+
+ }
double bms = q->bitmap_size / avg_bitmap_size;
- if (likely(bms < 0.5))
- weight *= (1.0 + ((bms - 0.5) / 2));
- else if (unlikely(bms > 1.33))
- weight *= 1.1;
+ if (likely(bms < 0.1)) {
+
+ weight *= 0.01;
+
+ } else if (likely(bms <= 0.25)) {
+
+ weight *= 0.55;
+
+ } else if (likely(bms <= 0.5)) {
+
+ // nothing
+
+ } else if (likely(bms <= 0.75)) {
+
+ weight *= 1.2;
+
+ } else if (likely(bms <= 1.25)) {
+
+ weight *= 1.3;
+
+ } else if (likely(bms <= 1.75)) {
+
+ weight *= 1.25;
+
+ } else if (likely(bms <= 2.0)) {
+
+ // nothing
+
+ } else if (likely(bms <= 2.5)) {
+
+ weight *= 1.3;
+
+ } else {
+
+ weight *= 0.75;
+
+ }
if (unlikely(!q->was_fuzzed)) { weight *= 2.5; }
if (unlikely(q->fs_redundant)) { weight *= 0.75; }
@@ -741,7 +829,7 @@ void update_bitmap_score(afl_state_t *afl, struct queue_entry *q) {
u64 fav_factor;
u64 fuzz_p2;
- if (likely(afl->schedule >= FAST && afl->schedule < RARE)) {
+ if (unlikely(afl->schedule >= FAST && afl->schedule < RARE)) {
fuzz_p2 = 0; // Skip the fuzz_p2 comparison
@@ -777,7 +865,7 @@ void update_bitmap_score(afl_state_t *afl, struct queue_entry *q) {
u64 top_rated_fav_factor;
u64 top_rated_fuzz_p2;
- if (likely(afl->schedule >= FAST && afl->schedule < RARE)) {
+ if (unlikely(afl->schedule >= FAST && afl->schedule < RARE)) {
top_rated_fuzz_p2 = 0; // Skip the fuzz_p2 comparison