diff --git a/include/forkserver.h b/include/forkserver.h index db3bfcb3..41f85327 100644 --- a/include/forkserver.h +++ b/include/forkserver.h @@ -242,6 +242,7 @@ typedef enum fsrv_run_result { void afl_fsrv_init(afl_forkserver_t *fsrv); void afl_fsrv_init_dup(afl_forkserver_t *fsrv_to, afl_forkserver_t *from); +void afl_fsrv_setup_preload(afl_forkserver_t *fsrv, char *argv0); void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv, volatile u8 *stop_soon_p, u8 debug_child_output); u32 afl_fsrv_get_mapsize(afl_forkserver_t *fsrv, char **argv, diff --git a/src/afl-analyze.c b/src/afl-analyze.c index 89a27f63..a006498a 100644 --- a/src/afl-analyze.c +++ b/src/afl-analyze.c @@ -75,7 +75,6 @@ static bool edges_only, /* Ignore hit counts? */ static volatile u8 stop_soon; /* Ctrl-C pressed? */ static u8 *target_path; -static u8 frida_mode; static u8 qemu_mode; static u8 cs_mode; static u32 map_size = MAP_SIZE; @@ -628,9 +627,7 @@ static void handle_stop_sig(int sig) { static void set_up_environment(char **argv) { - u8 *x; - char *afl_preload; - char *frida_afl_preload = NULL; + u8 *x; fsrv.dev_null_fd = open("/dev/null", O_RDWR); if (fsrv.dev_null_fd < 0) { PFATAL("Unable to open /dev/null"); } @@ -672,57 +669,7 @@ static void set_up_environment(char **argv) { } set_sanitizer_defaults(); - - if (get_afl_env("AFL_PRELOAD")) { - - if (qemu_mode) { - - /* afl-qemu-trace takes care of converting AFL_PRELOAD. */ - - } else if (frida_mode) { - - afl_preload = getenv("AFL_PRELOAD"); - u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so"); - if (afl_preload) { - - frida_afl_preload = alloc_printf("%s:%s", afl_preload, frida_binary); - - } else { - - frida_afl_preload = alloc_printf("%s", frida_binary); - - } - - ck_free(frida_binary); - - setenv("LD_PRELOAD", frida_afl_preload, 1); -#ifdef __APPLE__ - setenv("DYLD_INSERT_LIBRARIES", frida_afl_preload, 1); -#endif - - } else { - - /* CoreSight mode uses the default behavior. */ - - setenv("LD_PRELOAD", getenv("AFL_PRELOAD"), 1); -#ifdef __APPLE__ - setenv("DYLD_INSERT_LIBRARIES", getenv("AFL_PRELOAD"), 1); -#endif - - } - - } else if (frida_mode) { - - u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so"); - setenv("LD_PRELOAD", frida_binary, 1); -#ifdef __APPLE__ - setenv("DYLD_INSERT_LIBRARIES", frida_binary, 1); -#endif - ck_free(frida_binary); - - } - - if (frida_afl_preload) { ck_free(frida_afl_preload); } + afl_fsrv_setup_preload(&fsrv, argv[0]); } @@ -936,10 +883,9 @@ int main(int argc, char **argv_orig, char **envp) { case 'O': /* FRIDA mode */ - if (frida_mode) { FATAL("Multiple -O options not supported"); } + if (fsrv.frida_mode) { FATAL("Multiple -O options not supported"); } - frida_mode = 1; - fsrv.frida_mode = frida_mode; + fsrv.frida_mode = true; setenv("AFL_FRIDA_INST_SEED", "1", 1); break; diff --git a/src/afl-forkserver.c b/src/afl-forkserver.c index b5fec704..e23bf9a0 100644 --- a/src/afl-forkserver.c +++ b/src/afl-forkserver.c @@ -320,6 +320,63 @@ void afl_fsrv_init_dup(afl_forkserver_t *fsrv_to, afl_forkserver_t *from) { } +void afl_fsrv_setup_preload(afl_forkserver_t *fsrv, char *argv0) { + + char *afl_preload; + char *frida_afl_preload = NULL; + if (get_afl_env("AFL_PRELOAD")) { + + if (fsrv->qemu_mode) { + + /* afl-qemu-trace takes care of converting AFL_PRELOAD. */ + + } else if (fsrv->frida_mode) { + + afl_preload = getenv("AFL_PRELOAD"); + u8 *frida_binary = find_afl_binary(argv0, "afl-frida-trace.so"); + if (afl_preload) { + + frida_afl_preload = alloc_printf("%s:%s", afl_preload, frida_binary); + + } else { + + frida_afl_preload = alloc_printf("%s", frida_binary); + + } + + ck_free(frida_binary); + + setenv("LD_PRELOAD", frida_afl_preload, 1); +#ifdef __APPLE__ + setenv("DYLD_INSERT_LIBRARIES", frida_afl_preload, 1); +#endif + + } else { + + /* CoreSight mode uses the default behavior. */ + + setenv("LD_PRELOAD", getenv("AFL_PRELOAD"), 1); +#ifdef __APPLE__ + setenv("DYLD_INSERT_LIBRARIES", getenv("AFL_PRELOAD"), 1); +#endif + + } + + } else if (fsrv->frida_mode) { + + u8 *frida_binary = find_afl_binary(argv0, "afl-frida-trace.so"); + setenv("LD_PRELOAD", frida_binary, 1); +#ifdef __APPLE__ + setenv("DYLD_INSERT_LIBRARIES", frida_binary, 1); +#endif + ck_free(frida_binary); + + } + + if (frida_afl_preload) { ck_free(frida_afl_preload); } + +} + /* Wrapper for select() and read(), reading a 32 bit var. Returns the time passed to read. If the wait times out, returns timeout_ms + 1; diff --git a/src/afl-showmap.c b/src/afl-showmap.c index bec328f4..bd0594dc 100644 --- a/src/afl-showmap.c +++ b/src/afl-showmap.c @@ -714,61 +714,8 @@ static void handle_stop_sig(int sig) { static void set_up_environment(afl_forkserver_t *fsrv, char **argv) { - char *afl_preload; - char *frida_afl_preload = NULL; - set_sanitizer_defaults(); - - if (get_afl_env("AFL_PRELOAD")) { - - if (fsrv->qemu_mode) { - - /* afl-qemu-trace takes care of converting AFL_PRELOAD. */ - - } else if (fsrv->frida_mode) { - - afl_preload = getenv("AFL_PRELOAD"); - u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so"); - if (afl_preload) { - - frida_afl_preload = alloc_printf("%s:%s", afl_preload, frida_binary); - - } else { - - frida_afl_preload = alloc_printf("%s", frida_binary); - - } - - ck_free(frida_binary); - - setenv("LD_PRELOAD", frida_afl_preload, 1); -#ifdef __APPLE__ - setenv("DYLD_INSERT_LIBRARIES", frida_afl_preload, 1); -#endif - - } else { - - /* CoreSight mode uses the default behavior. */ - - setenv("LD_PRELOAD", getenv("AFL_PRELOAD"), 1); -#ifdef __APPLE__ - setenv("DYLD_INSERT_LIBRARIES", getenv("AFL_PRELOAD"), 1); -#endif - - } - - } else if (fsrv->frida_mode) { - - u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so"); - setenv("LD_PRELOAD", frida_binary, 1); -#ifdef __APPLE__ - setenv("DYLD_INSERT_LIBRARIES", frida_binary, 1); -#endif - ck_free(frida_binary); - - } - - if (frida_afl_preload) { ck_free(frida_afl_preload); } + afl_fsrv_setup_preload(fsrv, argv[0]); } diff --git a/src/afl-tmin.c b/src/afl-tmin.c index 894924cd..60f0c84f 100644 --- a/src/afl-tmin.c +++ b/src/afl-tmin.c @@ -899,9 +899,7 @@ static void handle_stop_sig(int sig) { static void set_up_environment(afl_forkserver_t *fsrv, char **argv) { - u8 *x; - char *afl_preload; - char *frida_afl_preload = NULL; + u8 *x; fsrv->dev_null_fd = open("/dev/null", O_RDWR); if (fsrv->dev_null_fd < 0) { PFATAL("Unable to open /dev/null"); } @@ -945,57 +943,7 @@ static void set_up_environment(afl_forkserver_t *fsrv, char **argv) { } set_sanitizer_defaults(); - - if (get_afl_env("AFL_PRELOAD")) { - - if (fsrv->qemu_mode) { - - /* afl-qemu-trace takes care of converting AFL_PRELOAD. */ - - } else if (fsrv->frida_mode) { - - afl_preload = getenv("AFL_PRELOAD"); - u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so"); - if (afl_preload) { - - frida_afl_preload = alloc_printf("%s:%s", afl_preload, frida_binary); - - } else { - - frida_afl_preload = alloc_printf("%s", frida_binary); - - } - - ck_free(frida_binary); - - setenv("LD_PRELOAD", frida_afl_preload, 1); -#ifdef __APPLE__ - setenv("DYLD_INSERT_LIBRARIES", frida_afl_preload, 1); -#endif - - } else { - - /* CoreSight mode uses the default behavior. */ - - setenv("LD_PRELOAD", getenv("AFL_PRELOAD"), 1); -#ifdef __APPLE__ - setenv("DYLD_INSERT_LIBRARIES", getenv("AFL_PRELOAD"), 1); -#endif - - } - - } else if (fsrv->frida_mode) { - - u8 *frida_binary = find_afl_binary(argv[0], "afl-frida-trace.so"); - setenv("LD_PRELOAD", frida_binary, 1); -#ifdef __APPLE__ - setenv("DYLD_INSERT_LIBRARIES", frida_binary, 1); -#endif - ck_free(frida_binary); - - } - - if (frida_afl_preload) { ck_free(frida_afl_preload); } + afl_fsrv_setup_preload(fsrv, argv[0]); }