aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvan Hauser <vh@thc.org>2021-01-30 15:39:47 +0100
committervan Hauser <vh@thc.org>2021-01-30 15:39:47 +0100
commit9d08f0d098c91e69b5fe41674e4c5d05363af604 (patch)
treeb980c6dd17b4a05cdf7ac12d061d79ebe6bc030a /src
parent3b3565269d0453c9f4b5b2847f809cd5d315fff2 (diff)
downloadafl++-9d08f0d098c91e69b5fe41674e4c5d05363af604.tar.gz
added AFL_CMPLOG_ONLY_NEW feature
Diffstat (limited to 'src')
-rw-r--r--src/afl-analyze.c22
-rw-r--r--src/afl-common.c6
-rw-r--r--src/afl-fuzz-init.c3
-rw-r--r--src/afl-fuzz-one.c5
-rw-r--r--src/afl-fuzz-redqueen.c135
-rw-r--r--src/afl-fuzz-state.c7
-rw-r--r--src/afl-fuzz.c35
-rw-r--r--src/afl-showmap.c24
-rw-r--r--src/afl-tmin.c24
9 files changed, 137 insertions, 124 deletions
diff --git a/src/afl-analyze.c b/src/afl-analyze.c
index 28598ba0..20aef2da 100644
--- a/src/afl-analyze.c
+++ b/src/afl-analyze.c
@@ -1079,28 +1079,28 @@ int main(int argc, char **argv_orig, char **envp) {
if (optind == argc || !in_file) { usage(argv[0]); }
if (qemu_mode && getenv("AFL_USE_QASAN")) {
-
- u8* preload = getenv("AFL_PRELOAD");
- u8* libqasan = get_libqasan_path(argv_orig[0]);
-
+
+ u8 *preload = getenv("AFL_PRELOAD");
+ u8 *libqasan = get_libqasan_path(argv_orig[0]);
+
if (!preload) {
-
+
setenv("AFL_PRELOAD", libqasan, 0);
-
+
} else {
-
+
u8 *result = ck_alloc(strlen(libqasan) + strlen(preload) + 2);
strcpy(result, libqasan);
strcat(result, " ");
strcat(result, preload);
-
+
setenv("AFL_PRELOAD", result, 1);
ck_free(result);
-
+
}
-
+
ck_free(libqasan);
-
+
}
map_size = get_map_size();
diff --git a/src/afl-common.c b/src/afl-common.c
index a69f2e97..235c4c05 100644
--- a/src/afl-common.c
+++ b/src/afl-common.c
@@ -364,11 +364,7 @@ u8 *get_libqasan_path(u8 *own_loc) {
cp = alloc_printf("%s/libqasan.so", own_copy);
ck_free(own_copy);
- if (!access(cp, X_OK)) {
-
- return cp;
-
- }
+ if (!access(cp, X_OK)) { return cp; }
} else {
diff --git a/src/afl-fuzz-init.c b/src/afl-fuzz-init.c
index 1808f0a1..2a7864f9 100644
--- a/src/afl-fuzz-init.c
+++ b/src/afl-fuzz-init.c
@@ -25,6 +25,7 @@
#include "afl-fuzz.h"
#include <limits.h>
+#include "cmplog.h"
#ifdef HAVE_AFFINITY
@@ -833,6 +834,8 @@ void perform_dry_run(afl_state_t *afl) {
}
+ if (afl->afl_env.afl_cmplog_only_new) { q->colorized = CMPLOG_LVL_MAX; }
+
u8 *fn = strrchr(q->fname, '/') + 1;
ACTF("Attempting dry run with '%s'...", fn);
diff --git a/src/afl-fuzz-one.c b/src/afl-fuzz-one.c
index ff766158..0cf889a8 100644
--- a/src/afl-fuzz-one.c
+++ b/src/afl-fuzz-one.c
@@ -26,6 +26,7 @@
#include "afl-fuzz.h"
#include <string.h>
#include <limits.h>
+#include "cmplog.h"
/* MOpt */
@@ -553,7 +554,7 @@ u8 fuzz_one_original(afl_state_t *afl) {
if (unlikely(len < 4)) {
- afl->queue_cur->colorized = 0xff;
+ afl->queue_cur->colorized = CMPLOG_LVL_MAX;
} else {
@@ -2981,7 +2982,7 @@ static u8 mopt_common_fuzzing(afl_state_t *afl, MOpt_globals_t MOpt_globals) {
if (unlikely(len < 4)) {
- afl->queue_cur->colorized = 0xff;
+ afl->queue_cur->colorized = CMPLOG_LVL_MAX;
} else {
diff --git a/src/afl-fuzz-redqueen.c b/src/afl-fuzz-redqueen.c
index fc620781..d7657c1d 100644
--- a/src/afl-fuzz-redqueen.c
+++ b/src/afl-fuzz-redqueen.c
@@ -1118,7 +1118,11 @@ static u8 cmp_extend_encoding(afl_state_t *afl, struct cmp_header *h,
#ifdef ARITHMETIC_LESSER_GREATER
if (lvl < LVL3 || attr == IS_TRANSFORM) { return 0; }
- if (!(attr & (IS_GREATER | IS_LESSER)) || SHAPE_BYTES(h->shape) < 4) { return 0; }
+ if (!(attr & (IS_GREATER | IS_LESSER)) || SHAPE_BYTES(h->shape) < 4) {
+
+ return 0;
+
+ }
// transform >= to < and <= to >
if ((attr & IS_EQUAL) && (attr & (IS_GREATER | IS_LESSER))) {
@@ -1138,110 +1142,110 @@ static u8 cmp_extend_encoding(afl_state_t *afl, struct cmp_header *h,
// lesser/greater FP comparison
if (attr >= IS_FP && attr < IS_FP_MOD) {
- u64 repl_new;
-
- if (attr & IS_GREATER) {
+ u64 repl_new;
- if (SHAPE_BYTES(h->shape) == 4 && its_len >= 4) {
+ if (attr & IS_GREATER) {
- float *f = (float *)&repl;
- float g = *f;
- g += 1.0;
- u32 *r = (u32 *)&g;
- repl_new = (u32)*r;
+ if (SHAPE_BYTES(h->shape) == 4 && its_len >= 4) {
- } else if (SHAPE_BYTES(h->shape) == 8 && its_len >= 8) {
+ float *f = (float *)&repl;
+ float g = *f;
+ g += 1.0;
+ u32 *r = (u32 *)&g;
+ repl_new = (u32)*r;
- double *f = (double *)&repl;
- double g = *f;
- g += 1.0;
+ } else if (SHAPE_BYTES(h->shape) == 8 && its_len >= 8) {
- u64 *r = (u64 *)&g;
- repl_new = *r;
+ double *f = (double *)&repl;
+ double g = *f;
+ g += 1.0;
- } else {
+ u64 *r = (u64 *)&g;
+ repl_new = *r;
- return 0;
+ } else {
- }
+ return 0;
- changed_val = repl_new;
+ }
- if (unlikely(cmp_extend_encoding(
- afl, h, pattern, repl_new, o_pattern, changed_val, 16, idx,
- taint_len, orig_buf, buf, cbuf, len, 1, lvl, status))) {
+ changed_val = repl_new;
- return 1;
+ if (unlikely(cmp_extend_encoding(
+ afl, h, pattern, repl_new, o_pattern, changed_val, 16, idx,
+ taint_len, orig_buf, buf, cbuf, len, 1, lvl, status))) {
- }
+ return 1;
- } else {
+ }
- if (SHAPE_BYTES(h->shape) == 4) {
+ } else {
- float *f = (float *)&repl;
- float g = *f;
- g -= 1.0;
- u32 *r = (u32 *)&g;
- repl_new = (u32)*r;
+ if (SHAPE_BYTES(h->shape) == 4) {
- } else if (SHAPE_BYTES(h->shape) == 8) {
+ float *f = (float *)&repl;
+ float g = *f;
+ g -= 1.0;
+ u32 *r = (u32 *)&g;
+ repl_new = (u32)*r;
- double *f = (double *)&repl;
- double g = *f;
- g -= 1.0;
- u64 *r = (u64 *)&g;
- repl_new = *r;
+ } else if (SHAPE_BYTES(h->shape) == 8) {
- } else {
+ double *f = (double *)&repl;
+ double g = *f;
+ g -= 1.0;
+ u64 *r = (u64 *)&g;
+ repl_new = *r;
- return 0;
+ } else {
- }
+ return 0;
- changed_val = repl_new;
+ }
- if (unlikely(cmp_extend_encoding(
- afl, h, pattern, repl_new, o_pattern, changed_val, 16, idx,
- taint_len, orig_buf, buf, cbuf, len, 1, lvl, status))) {
+ changed_val = repl_new;
- return 1;
+ if (unlikely(cmp_extend_encoding(
+ afl, h, pattern, repl_new, o_pattern, changed_val, 16, idx,
+ taint_len, orig_buf, buf, cbuf, len, 1, lvl, status))) {
- }
+ return 1;
}
- // transform double to float, llvm likes to do that internally ...
- if (SHAPE_BYTES(h->shape) == 8 && its_len >= 4) {
+ }
- double *f = (double *)&repl;
- float g = (float)*f;
- repl_new = 0;
+ // transform double to float, llvm likes to do that internally ...
+ if (SHAPE_BYTES(h->shape) == 8 && its_len >= 4) {
+
+ double *f = (double *)&repl;
+ float g = (float)*f;
+ repl_new = 0;
#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
- memcpy((char *)&repl_new, (char *)&g, 4);
+ memcpy((char *)&repl_new, (char *)&g, 4);
#else
- memcpy(((char *)&repl_new) + 4, (char *)&g, 4);
+ memcpy(((char *)&repl_new) + 4, (char *)&g, 4);
#endif
- changed_val = repl_new;
- h->shape = 3; // modify shape
-
- // fprintf(stderr, "DOUBLE2FLOAT %llx\n", repl_new);
+ changed_val = repl_new;
+ h->shape = 3; // modify shape
- if (unlikely(cmp_extend_encoding(
- afl, h, pattern, repl_new, o_pattern, changed_val, 16, idx,
- taint_len, orig_buf, buf, cbuf, len, 1, lvl, status))) {
+ // fprintf(stderr, "DOUBLE2FLOAT %llx\n", repl_new);
- h->shape = 7; // recover shape
- return 1;
-
- }
+ if (unlikely(cmp_extend_encoding(
+ afl, h, pattern, repl_new, o_pattern, changed_val, 16, idx,
+ taint_len, orig_buf, buf, cbuf, len, 1, lvl, status))) {
h->shape = 7; // recover shape
+ return 1;
}
+ h->shape = 7; // recover shape
+
}
+ }
+
else if (attr < IS_FP) {
// lesser/greater integer comparison
@@ -1707,6 +1711,7 @@ static u8 cmp_fuzz(afl_state_t *afl, u32 key, u8 *orig_buf, u8 *buf, u8 *cbuf,
try_to_add_to_dictN(afl, s128_v1, SHAPE_BYTES(h->shape));
} else
+
#endif
{
diff --git a/src/afl-fuzz-state.c b/src/afl-fuzz-state.c
index 8423a3d1..5040e3ef 100644
--- a/src/afl-fuzz-state.c
+++ b/src/afl-fuzz-state.c
@@ -236,6 +236,13 @@ void read_afl_environment(afl_state_t *afl, char **envp) {
afl->afl_env.afl_custom_mutator_only =
get_afl_env(afl_environment_variables[i]) ? 1 : 0;
+ } else if (!strncmp(env, "AFL_CMPLOG_ONLY_NEW",
+
+ afl_environment_variable_len)) {
+
+ afl->afl_env.afl_cmplog_only_new =
+ get_afl_env(afl_environment_variables[i]) ? 1 : 0;
+
} else if (!strncmp(env, "AFL_NO_UI", afl_environment_variable_len)) {
afl->afl_env.afl_no_ui =
diff --git a/src/afl-fuzz.c b/src/afl-fuzz.c
index 312d9424..9d9b0434 100644
--- a/src/afl-fuzz.c
+++ b/src/afl-fuzz.c
@@ -181,6 +181,7 @@ static void usage(u8 *argv0, int more_help) {
"AFL_AUTORESUME: resume fuzzing if directory specified by -o already exists\n"
"AFL_BENCH_JUST_ONE: run the target just once\n"
"AFL_BENCH_UNTIL_CRASH: exit soon when the first crashing input has been found\n"
+ "AFL_CMPLOG_ONLY_NEW: do not run cmplog on initial testcases (good for resumes!)\n"
"AFL_CRASH_EXITCODE: optional child exit code to be interpreted as crash\n"
"AFL_CUSTOM_MUTATOR_LIBRARY: lib with afl_custom_fuzz() to mutate inputs\n"
"AFL_CUSTOM_MUTATOR_ONLY: avoid AFL++'s internal mutators\n"
@@ -326,8 +327,9 @@ int main(int argc, char **argv_orig, char **envp) {
"compile time)");
}
+
#endif
-
+
char **argv = argv_cpy_dup(argc, argv_orig);
afl_state_t *afl = calloc(1, sizeof(afl_state_t));
@@ -356,8 +358,7 @@ int main(int argc, char **argv_orig, char **envp) {
while ((opt = getopt(
argc, argv,
- "+b:B:c:CdDe:E:hi:I:f:F:l:L:m:M:nNo:p:RQs:S:t:T:UV:Wx:Z")) >
- 0) {
+ "+b:B:c:CdDe:E:hi:I:f:F:l:L:m:M:nNo:p:RQs:S:t:T:UV:Wx:Z")) > 0) {
switch (opt) {
@@ -984,31 +985,31 @@ int main(int argc, char **argv_orig, char **envp) {
usage(argv[0], show_help);
}
-
+
if (afl->fsrv.qemu_mode && getenv("AFL_USE_QASAN")) {
-
- u8* preload = getenv("AFL_PRELOAD");
- u8* libqasan = get_libqasan_path(argv_orig[0]);
-
+
+ u8 *preload = getenv("AFL_PRELOAD");
+ u8 *libqasan = get_libqasan_path(argv_orig[0]);
+
if (!preload) {
-
+
setenv("AFL_PRELOAD", libqasan, 0);
-
+
} else {
-
+
u8 *result = ck_alloc(strlen(libqasan) + strlen(preload) + 2);
strcpy(result, libqasan);
strcat(result, " ");
strcat(result, preload);
-
+
setenv("AFL_PRELOAD", result, 1);
ck_free(result);
-
+
}
-
+
afl->afl_env.afl_preload = (u8 *)getenv("AFL_PRELOAD");
ck_free(libqasan);
-
+
}
if (afl->fsrv.mem_limit && afl->shm.cmplog_mode) afl->fsrv.mem_limit += 260;
@@ -1270,7 +1271,7 @@ int main(int argc, char **argv_orig, char **envp) {
"instead of using AFL_PRELOAD?");
}
-
+
if (afl->afl_env.afl_preload) {
if (afl->fsrv.qemu_mode) {
@@ -1322,7 +1323,7 @@ int main(int argc, char **argv_orig, char **envp) {
FATAL("Use AFL_PRELOAD instead of AFL_LD_PRELOAD");
}
-
+
save_cmdline(afl, argc, argv);
fix_up_banner(afl, argv[optind]);
diff --git a/src/afl-showmap.c b/src/afl-showmap.c
index f3cd5a90..62bf1021 100644
--- a/src/afl-showmap.c
+++ b/src/afl-showmap.c
@@ -942,30 +942,30 @@ int main(int argc, char **argv_orig, char **envp) {
}
if (optind == argc || !out_file) { usage(argv[0]); }
-
+
if (fsrv->qemu_mode && getenv("AFL_USE_QASAN")) {
-
- u8* preload = getenv("AFL_PRELOAD");
- u8* libqasan = get_libqasan_path(argv_orig[0]);
-
+
+ u8 *preload = getenv("AFL_PRELOAD");
+ u8 *libqasan = get_libqasan_path(argv_orig[0]);
+
if (!preload) {
-
+
setenv("AFL_PRELOAD", libqasan, 0);
-
+
} else {
-
+
u8 *result = ck_alloc(strlen(libqasan) + strlen(preload) + 2);
strcpy(result, libqasan);
strcat(result, " ");
strcat(result, preload);
-
+
setenv("AFL_PRELOAD", result, 1);
ck_free(result);
-
+
}
-
+
ck_free(libqasan);
-
+
}
if (in_dir) {
diff --git a/src/afl-tmin.c b/src/afl-tmin.c
index 9e9e2d63..09b5211d 100644
--- a/src/afl-tmin.c
+++ b/src/afl-tmin.c
@@ -1074,30 +1074,30 @@ int main(int argc, char **argv_orig, char **envp) {
if (optind == argc || !in_file || !output_file) { usage(argv[0]); }
check_environment_vars(envp);
-
+
if (fsrv->qemu_mode && getenv("AFL_USE_QASAN")) {
-
- u8* preload = getenv("AFL_PRELOAD");
- u8* libqasan = get_libqasan_path(argv_orig[0]);
-
+
+ u8 *preload = getenv("AFL_PRELOAD");
+ u8 *libqasan = get_libqasan_path(argv_orig[0]);
+
if (!preload) {
-
+
setenv("AFL_PRELOAD", libqasan, 0);
-
+
} else {
-
+
u8 *result = ck_alloc(strlen(libqasan) + strlen(preload) + 2);
strcpy(result, libqasan);
strcat(result, " ");
strcat(result, preload);
-
+
setenv("AFL_PRELOAD", result, 1);
ck_free(result);
-
+
}
-
+
ck_free(libqasan);
-
+
}
/* initialize cmplog_mode */