mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-13 18:48:08 +00:00
Remove AFL_PRELOAD and AFL_USE_QASAN handlers
These are now processed in afl-qemu-trace so that the "copy+paste" code that is in all of the other AFL tools can be removed. This also allows the AFL_USE_QASAN flag to work the same when used with tools like afl-fuzz as it does with afl-qemu-trace. This is important in situations where loading the QASAN library changes the address of your desired entrypoint, or for crash validation using the same environment that afl-fuzz was using. With this change, the same set of environment variables can be used in exactly the same way between afl-fuzz, afl-showmap, and afl-qemu-trace, and you will get exactly the same guest environment.
This commit is contained in:
@ -48,7 +48,6 @@ void argv_cpy_free(char **argv);
|
|||||||
char **get_qemu_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv);
|
char **get_qemu_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv);
|
||||||
char **get_wine_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv);
|
char **get_wine_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv);
|
||||||
char * get_afl_env(char *env);
|
char * get_afl_env(char *env);
|
||||||
u8 * get_libqasan_path(u8 *own_loc);
|
|
||||||
|
|
||||||
extern u8 be_quiet;
|
extern u8 be_quiet;
|
||||||
extern u8 *doc_path; /* path to documentation dir */
|
extern u8 *doc_path; /* path to documentation dir */
|
||||||
|
@ -822,38 +822,7 @@ static void set_up_environment(void) {
|
|||||||
|
|
||||||
if (qemu_mode) {
|
if (qemu_mode) {
|
||||||
|
|
||||||
u8 *qemu_preload = getenv("QEMU_SET_ENV");
|
/* afl-qemu-trace takes care of converting AFL_PRELOAD. */
|
||||||
u8 *afl_preload = getenv("AFL_PRELOAD");
|
|
||||||
u8 *buf;
|
|
||||||
|
|
||||||
s32 i, afl_preload_size = strlen(afl_preload);
|
|
||||||
for (i = 0; i < afl_preload_size; ++i) {
|
|
||||||
|
|
||||||
if (afl_preload[i] == ',') {
|
|
||||||
|
|
||||||
PFATAL(
|
|
||||||
"Comma (',') is not allowed in AFL_PRELOAD when -Q is "
|
|
||||||
"specified!");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemu_preload) {
|
|
||||||
|
|
||||||
buf = alloc_printf("%s,LD_PRELOAD=%s,DYLD_INSERT_LIBRARIES=%s",
|
|
||||||
qemu_preload, afl_preload, afl_preload);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
buf = alloc_printf("LD_PRELOAD=%s,DYLD_INSERT_LIBRARIES=%s",
|
|
||||||
afl_preload, afl_preload);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
setenv("QEMU_SET_ENV", buf, 1);
|
|
||||||
|
|
||||||
ck_free(buf);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -1079,31 +1048,6 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
if (optind == argc || !in_file) { usage(argv[0]); }
|
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]);
|
|
||||||
|
|
||||||
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();
|
map_size = get_map_size();
|
||||||
|
|
||||||
use_hex_offsets = !!get_afl_env("AFL_ANALYZE_HEX");
|
use_hex_offsets = !!get_afl_env("AFL_ANALYZE_HEX");
|
||||||
|
@ -338,66 +338,6 @@ char **get_wine_argv(u8 *own_loc, u8 **target_path_p, int argc, char **argv) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get libqasan path. */
|
|
||||||
|
|
||||||
u8 *get_libqasan_path(u8 *own_loc) {
|
|
||||||
|
|
||||||
if (!unlikely(own_loc)) { FATAL("BUG: param own_loc is NULL"); }
|
|
||||||
|
|
||||||
u8 *tmp, *cp = NULL, *rsl, *own_copy;
|
|
||||||
|
|
||||||
tmp = getenv("AFL_PATH");
|
|
||||||
|
|
||||||
if (tmp) {
|
|
||||||
|
|
||||||
cp = alloc_printf("%s/libqasan.so", tmp);
|
|
||||||
|
|
||||||
if (access(cp, X_OK)) { FATAL("Unable to find '%s'", tmp); }
|
|
||||||
|
|
||||||
return cp;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
own_copy = ck_strdup(own_loc);
|
|
||||||
rsl = strrchr(own_copy, '/');
|
|
||||||
|
|
||||||
if (rsl) {
|
|
||||||
|
|
||||||
*rsl = 0;
|
|
||||||
|
|
||||||
cp = alloc_printf("%s/libqasan.so", own_copy);
|
|
||||||
ck_free(own_copy);
|
|
||||||
|
|
||||||
if (!access(cp, X_OK)) { return cp; }
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
ck_free(own_copy);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!access(AFL_PATH "/libqasan.so", X_OK)) {
|
|
||||||
|
|
||||||
if (cp) { ck_free(cp); }
|
|
||||||
|
|
||||||
return ck_strdup(AFL_PATH "/libqasan.so");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
SAYF("\n" cLRD "[-] " cRST
|
|
||||||
"Oops, unable to find the 'libqasan.so' binary. The binary must be "
|
|
||||||
"built\n"
|
|
||||||
" separately by following the instructions in "
|
|
||||||
"qemu_mode/libqasan/README.md. "
|
|
||||||
"If you\n"
|
|
||||||
" already have the binary installed, you may need to specify "
|
|
||||||
"AFL_PATH in the\n"
|
|
||||||
" environment.\n");
|
|
||||||
|
|
||||||
FATAL("Failed to locate 'libqasan.so'.");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find binary, used by analyze, showmap, tmin
|
/* Find binary, used by analyze, showmap, tmin
|
||||||
@returns the path, allocating the string */
|
@returns the path, allocating the string */
|
||||||
|
|
||||||
|
@ -1022,32 +1022,6 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (afl->fsrv.qemu_mode && getenv("AFL_USE_QASAN")) {
|
|
||||||
|
|
||||||
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;
|
if (afl->fsrv.mem_limit && afl->shm.cmplog_mode) afl->fsrv.mem_limit += 260;
|
||||||
|
|
||||||
OKF("afl++ is maintained by Marc \"van Hauser\" Heuse, Heiko \"hexcoder\" "
|
OKF("afl++ is maintained by Marc \"van Hauser\" Heuse, Heiko \"hexcoder\" "
|
||||||
@ -1312,38 +1286,7 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
if (afl->fsrv.qemu_mode) {
|
if (afl->fsrv.qemu_mode) {
|
||||||
|
|
||||||
u8 *qemu_preload = getenv("QEMU_SET_ENV");
|
/* afl-qemu-trace takes care of converting AFL_PRELOAD. */
|
||||||
u8 *afl_preload = getenv("AFL_PRELOAD");
|
|
||||||
u8 *buf;
|
|
||||||
|
|
||||||
s32 j, afl_preload_size = strlen(afl_preload);
|
|
||||||
for (j = 0; j < afl_preload_size; ++j) {
|
|
||||||
|
|
||||||
if (afl_preload[j] == ',') {
|
|
||||||
|
|
||||||
PFATAL(
|
|
||||||
"Comma (',') is not allowed in AFL_PRELOAD when -Q is "
|
|
||||||
"specified!");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemu_preload) {
|
|
||||||
|
|
||||||
buf = alloc_printf("%s,LD_PRELOAD=%s,DYLD_INSERT_LIBRARIES=%s",
|
|
||||||
qemu_preload, afl_preload, afl_preload);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
buf = alloc_printf("LD_PRELOAD=%s,DYLD_INSERT_LIBRARIES=%s",
|
|
||||||
afl_preload, afl_preload);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
setenv("QEMU_SET_ENV", buf, 1);
|
|
||||||
|
|
||||||
ck_free(buf);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -599,38 +599,7 @@ static void set_up_environment(afl_forkserver_t *fsrv) {
|
|||||||
|
|
||||||
if (fsrv->qemu_mode) {
|
if (fsrv->qemu_mode) {
|
||||||
|
|
||||||
u8 *qemu_preload = getenv("QEMU_SET_ENV");
|
/* afl-qemu-trace takes care of converting AFL_PRELOAD. */
|
||||||
u8 *afl_preload = getenv("AFL_PRELOAD");
|
|
||||||
u8 *buf;
|
|
||||||
|
|
||||||
s32 i, afl_preload_size = strlen(afl_preload);
|
|
||||||
for (i = 0; i < afl_preload_size; ++i) {
|
|
||||||
|
|
||||||
if (afl_preload[i] == ',') {
|
|
||||||
|
|
||||||
PFATAL(
|
|
||||||
"Comma (',') is not allowed in AFL_PRELOAD when -Q is "
|
|
||||||
"specified!");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemu_preload) {
|
|
||||||
|
|
||||||
buf = alloc_printf("%s,LD_PRELOAD=%s,DYLD_INSERT_LIBRARIES=%s",
|
|
||||||
qemu_preload, afl_preload, afl_preload);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
buf = alloc_printf("LD_PRELOAD=%s,DYLD_INSERT_LIBRARIES=%s",
|
|
||||||
afl_preload, afl_preload);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
setenv("QEMU_SET_ENV", buf, 1);
|
|
||||||
|
|
||||||
ck_free(buf);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -946,31 +915,6 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
if (optind == argc || !out_file) { usage(argv[0]); }
|
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]);
|
|
||||||
|
|
||||||
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) {
|
if (in_dir) {
|
||||||
|
|
||||||
if (!out_file && !collect_coverage)
|
if (!out_file && !collect_coverage)
|
||||||
|
@ -753,38 +753,7 @@ static void set_up_environment(afl_forkserver_t *fsrv) {
|
|||||||
|
|
||||||
if (fsrv->qemu_mode) {
|
if (fsrv->qemu_mode) {
|
||||||
|
|
||||||
u8 *qemu_preload = getenv("QEMU_SET_ENV");
|
/* afl-qemu-trace takes care of converting AFL_PRELOAD. */
|
||||||
u8 *afl_preload = getenv("AFL_PRELOAD");
|
|
||||||
u8 *buf;
|
|
||||||
|
|
||||||
s32 i, afl_preload_size = strlen(afl_preload);
|
|
||||||
for (i = 0; i < afl_preload_size; ++i) {
|
|
||||||
|
|
||||||
if (afl_preload[i] == ',') {
|
|
||||||
|
|
||||||
PFATAL(
|
|
||||||
"Comma (',') is not allowed in AFL_PRELOAD when -Q is "
|
|
||||||
"specified!");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemu_preload) {
|
|
||||||
|
|
||||||
buf = alloc_printf("%s,LD_PRELOAD=%s,DYLD_INSERT_LIBRARIES=%s",
|
|
||||||
qemu_preload, afl_preload, afl_preload);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
buf = alloc_printf("LD_PRELOAD=%s,DYLD_INSERT_LIBRARIES=%s",
|
|
||||||
afl_preload, afl_preload);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
setenv("QEMU_SET_ENV", buf, 1);
|
|
||||||
|
|
||||||
ck_free(buf);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -1079,31 +1048,6 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
check_environment_vars(envp);
|
check_environment_vars(envp);
|
||||||
setenv("AFL_NO_AUTODICT", "1", 1);
|
setenv("AFL_NO_AUTODICT", "1", 1);
|
||||||
|
|
||||||
if (fsrv->qemu_mode && getenv("AFL_USE_QASAN")) {
|
|
||||||
|
|
||||||
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 */
|
/* initialize cmplog_mode */
|
||||||
shm.cmplog_mode = 0;
|
shm.cmplog_mode = 0;
|
||||||
|
|
||||||
|
@ -237,38 +237,7 @@ static void set_up_environment(afl_forkserver_t *fsrv) {
|
|||||||
|
|
||||||
if (fsrv->qemu_mode) {
|
if (fsrv->qemu_mode) {
|
||||||
|
|
||||||
u8 *qemu_preload = getenv("QEMU_SET_ENV");
|
/* afl-qemu-trace takes care of converting AFL_PRELOAD. */
|
||||||
u8 *afl_preload = getenv("AFL_PRELOAD");
|
|
||||||
u8 *buf;
|
|
||||||
|
|
||||||
s32 i, afl_preload_size = strlen(afl_preload);
|
|
||||||
for (i = 0; i < afl_preload_size; ++i) {
|
|
||||||
|
|
||||||
if (afl_preload[i] == ',') {
|
|
||||||
|
|
||||||
PFATAL(
|
|
||||||
"Comma (',') is not allowed in AFL_PRELOAD when -Q is "
|
|
||||||
"specified!");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemu_preload) {
|
|
||||||
|
|
||||||
buf = alloc_printf("%s,LD_PRELOAD=%s,DYLD_INSERT_LIBRARIES=%s",
|
|
||||||
qemu_preload, afl_preload, afl_preload);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
buf = alloc_printf("LD_PRELOAD=%s,DYLD_INSERT_LIBRARIES=%s",
|
|
||||||
afl_preload, afl_preload);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
setenv("QEMU_SET_ENV", buf, 1);
|
|
||||||
|
|
||||||
afl_free(buf);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user