mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-17 20:28:08 +00:00
afl-showmap -I option
This commit is contained in:
2
afl-cmin
2
afl-cmin
@ -234,7 +234,7 @@ BEGIN {
|
|||||||
} # while options
|
} # while options
|
||||||
|
|
||||||
if (!mem_limit) mem_limit = "none"
|
if (!mem_limit) mem_limit = "none"
|
||||||
if (!timeout) timeout = "none"
|
if (!timeout) timeout = "5000"
|
||||||
|
|
||||||
# get program args
|
# get program args
|
||||||
i = 0
|
i = 0
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
data before post process on finds
|
data before post process on finds
|
||||||
- afl-showmap:
|
- afl-showmap:
|
||||||
- added custom mutator post_process and send support
|
- added custom mutator post_process and send support
|
||||||
|
- add `-I filelist` option, an alternative to `-i in_dir`
|
||||||
- a new grammar custom mutator atnwalk was submitted by @voidptr127 !
|
- a new grammar custom mutator atnwalk was submitted by @voidptr127 !
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,7 +69,9 @@ static afl_state_t *afl;
|
|||||||
static char *stdin_file; /* stdin file */
|
static char *stdin_file; /* stdin file */
|
||||||
|
|
||||||
static u8 *in_dir = NULL, /* input folder */
|
static u8 *in_dir = NULL, /* input folder */
|
||||||
*out_file = NULL, *at_file = NULL; /* Substitution string for @@ */
|
*out_file = NULL, /* output file or directory */
|
||||||
|
*at_file = NULL, /* Substitution string for @@ */
|
||||||
|
*in_filelist = NULL; /* input file list */
|
||||||
|
|
||||||
static u8 outfile[PATH_MAX];
|
static u8 outfile[PATH_MAX];
|
||||||
|
|
||||||
@ -878,6 +880,104 @@ u32 execute_testcases(u8 *dir) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 execute_testcases_filelist(u8 *fn) {
|
||||||
|
|
||||||
|
u32 done = 0;
|
||||||
|
u8 buf[4096];
|
||||||
|
u8 val_buf[2][STRINGIFY_VAL_SIZE_MAX];
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
if (!be_quiet) { ACTF("Reading from '%s'...", fn); }
|
||||||
|
|
||||||
|
if ((f = fopen(fn, "r")) == NULL) { FATAL("could not open '%s'", fn); }
|
||||||
|
|
||||||
|
while (fgets(buf, sizeof(buf), f) != NULL) {
|
||||||
|
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
u8 *fn2 = buf, *fn3;
|
||||||
|
;
|
||||||
|
|
||||||
|
while (*fn2 == ' ') {
|
||||||
|
|
||||||
|
++fn2;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*fn2) {
|
||||||
|
|
||||||
|
while (fn2[strlen(fn2) - 1] == '\r' || fn2[strlen(fn2) - 1] == '\n' ||
|
||||||
|
fn2[strlen(fn2) - 1] == ' ') {
|
||||||
|
|
||||||
|
fn2[strlen(fn2) - 1] = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug) { printf("Getting coverage for '%s'\n", fn2); }
|
||||||
|
|
||||||
|
if (!*fn2) { continue; }
|
||||||
|
|
||||||
|
if (lstat(fn2, &st) || access(fn2, R_OK)) {
|
||||||
|
|
||||||
|
WARNF("Unable to access '%s'", fn2);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!S_ISREG(st.st_mode) || !st.st_size) { continue; }
|
||||||
|
|
||||||
|
if ((fn3 = strrchr(fn2, '/'))) {
|
||||||
|
|
||||||
|
++fn3;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
fn3 = fn2;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (st.st_size > MAX_FILE && !be_quiet && !quiet_mode) {
|
||||||
|
|
||||||
|
WARNF("Test case '%s' is too big (%s, limit is %s), partial reading", fn2,
|
||||||
|
stringify_mem_size(val_buf[0], sizeof(val_buf[0]), st.st_size),
|
||||||
|
stringify_mem_size(val_buf[1], sizeof(val_buf[1]), MAX_FILE));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!collect_coverage)
|
||||||
|
snprintf(outfile, sizeof(outfile), "%s/%s", out_file, fn3);
|
||||||
|
|
||||||
|
if (read_file(fn2)) {
|
||||||
|
|
||||||
|
if (wait_for_gdb) {
|
||||||
|
|
||||||
|
fprintf(stderr, "exec: gdb -p %d\n", fsrv->child_pid);
|
||||||
|
fprintf(stderr, "exec: kill -CONT %d\n", getpid());
|
||||||
|
kill(0, SIGSTOP);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
showmap_run_target_forkserver(fsrv, in_data, in_len);
|
||||||
|
ck_free(in_data);
|
||||||
|
++done;
|
||||||
|
|
||||||
|
if (child_crashed && debug) { WARNF("crashed: %s", fn2); }
|
||||||
|
|
||||||
|
if (collect_coverage)
|
||||||
|
analyze_results(fsrv);
|
||||||
|
else
|
||||||
|
tcnt = write_results_to_file(fsrv, outfile);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return done;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* Show banner. */
|
/* Show banner. */
|
||||||
|
|
||||||
static void show_banner(void) {
|
static void show_banner(void) {
|
||||||
@ -920,6 +1020,7 @@ static void usage(u8 *argv0) {
|
|||||||
" With -C, -o is a file, without -C it must be a "
|
" With -C, -o is a file, without -C it must be a "
|
||||||
"directory\n"
|
"directory\n"
|
||||||
" and each bitmap will be written there individually.\n"
|
" and each bitmap will be written there individually.\n"
|
||||||
|
" -I filelist - alternatively to -i, -I is a list of files\n"
|
||||||
" -C - collect coverage, writes all edges to -o and gives a "
|
" -C - collect coverage, writes all edges to -o and gives a "
|
||||||
"summary\n"
|
"summary\n"
|
||||||
" Must be combined with -i.\n"
|
" Must be combined with -i.\n"
|
||||||
@ -932,7 +1033,7 @@ static void usage(u8 *argv0) {
|
|||||||
"This tool displays raw tuple data captured by AFL instrumentation.\n"
|
"This tool displays raw tuple data captured by AFL instrumentation.\n"
|
||||||
"For additional help, consult %s/README.md.\n\n"
|
"For additional help, consult %s/README.md.\n\n"
|
||||||
|
|
||||||
"If you use -i mode, then custom mutator post_process send send "
|
"If you use -i/-I mode, then custom mutator post_process send send "
|
||||||
"functionality\n"
|
"functionality\n"
|
||||||
"is supported.\n\n"
|
"is supported.\n\n"
|
||||||
|
|
||||||
@ -994,7 +1095,7 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
if (getenv("AFL_QUIET") != NULL) { be_quiet = true; }
|
if (getenv("AFL_QUIET") != NULL) { be_quiet = true; }
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "+i:o:f:m:t:AeqCZOH:QUWbcrshXY")) > 0) {
|
while ((opt = getopt(argc, argv, "+i:I:o:f:m:t:AeqCZOH:QUWbcrshXY")) > 0) {
|
||||||
|
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
|
|
||||||
@ -1012,6 +1113,11 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
in_dir = optarg;
|
in_dir = optarg;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'I':
|
||||||
|
if (in_filelist) { FATAL("Multiple -I options not supported"); }
|
||||||
|
in_filelist = optarg;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'o':
|
case 'o':
|
||||||
|
|
||||||
if (out_file) { FATAL("Multiple -o options not supported"); }
|
if (out_file) { FATAL("Multiple -o options not supported"); }
|
||||||
@ -1234,10 +1340,12 @@ 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 (in_dir) {
|
if (in_dir && in_filelist) { FATAL("you can only specify either -i or -I"); }
|
||||||
|
|
||||||
|
if (in_dir || in_filelist) {
|
||||||
|
|
||||||
if (!out_file && !collect_coverage)
|
if (!out_file && !collect_coverage)
|
||||||
FATAL("for -i you need to specify either -C and/or -o");
|
FATAL("for -i/-I you need to specify either -C and/or -o");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1294,7 +1402,7 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_dir) {
|
if (in_dir || in_filelist) {
|
||||||
|
|
||||||
/* If we don't have a file name chosen yet, use a safe default. */
|
/* If we don't have a file name chosen yet, use a safe default. */
|
||||||
u8 *use_dir = ".";
|
u8 *use_dir = ".";
|
||||||
@ -1400,7 +1508,7 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if (!fsrv->nyx_mode && in_dir) {
|
if (!fsrv->nyx_mode && (in_dir || in_filelist)) {
|
||||||
|
|
||||||
(void)check_binary_signatures(fsrv->target_path);
|
(void)check_binary_signatures(fsrv->target_path);
|
||||||
|
|
||||||
@ -1483,7 +1591,7 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_dir) {
|
if (in_dir || in_filelist) {
|
||||||
|
|
||||||
afl->fsrv.dev_urandom_fd = open("/dev/urandom", O_RDONLY);
|
afl->fsrv.dev_urandom_fd = open("/dev/urandom", O_RDONLY);
|
||||||
afl->afl_env.afl_custom_mutator_library =
|
afl->afl_env.afl_custom_mutator_library =
|
||||||
@ -1496,33 +1604,46 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
if (getenv("AFL_CUSTOM_MUTATOR_LIBRARY") || getenv("AFL_PYTHON_MODULE")) {
|
if (getenv("AFL_CUSTOM_MUTATOR_LIBRARY") || getenv("AFL_PYTHON_MODULE")) {
|
||||||
|
|
||||||
WARNF(
|
WARNF(
|
||||||
"Custom mutator environment detected, this is only supported in -i "
|
"Custom mutator environment detected, this is only supported in "
|
||||||
"mode!\n");
|
"-i/-I mode!\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_dir) {
|
if (in_dir || in_filelist) {
|
||||||
|
|
||||||
DIR *dir_in, *dir_out = NULL;
|
DIR *dir_in, *dir_out = NULL;
|
||||||
|
u8 *dn = NULL;
|
||||||
|
|
||||||
if (getenv("AFL_DEBUG_GDB")) wait_for_gdb = true;
|
if (getenv("AFL_DEBUG_GDB")) wait_for_gdb = true;
|
||||||
|
|
||||||
fsrv->dev_null_fd = open("/dev/null", O_RDWR);
|
fsrv->dev_null_fd = open("/dev/null", O_RDWR);
|
||||||
if (fsrv->dev_null_fd < 0) { PFATAL("Unable to open /dev/null"); }
|
if (fsrv->dev_null_fd < 0) { PFATAL("Unable to open /dev/null"); }
|
||||||
|
|
||||||
// if a queue subdirectory exists switch to that
|
if (in_filelist) {
|
||||||
u8 *dn = alloc_printf("%s/queue", in_dir);
|
|
||||||
if ((dir_in = opendir(dn)) != NULL) {
|
|
||||||
|
|
||||||
closedir(dir_in);
|
if (!be_quiet) ACTF("Reading from file list '%s'...", in_filelist);
|
||||||
in_dir = dn;
|
|
||||||
|
|
||||||
} else
|
} else {
|
||||||
|
|
||||||
ck_free(dn);
|
// if a queue subdirectory exists switch to that
|
||||||
if (!be_quiet) ACTF("Reading from directory '%s'...", in_dir);
|
dn = alloc_printf("%s/queue", in_dir);
|
||||||
|
|
||||||
|
if ((dir_in = opendir(dn)) != NULL) {
|
||||||
|
|
||||||
|
closedir(dir_in);
|
||||||
|
in_dir = dn;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
ck_free(dn);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!be_quiet) ACTF("Reading from directory '%s'...", in_dir);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (!collect_coverage) {
|
if (!collect_coverage) {
|
||||||
|
|
||||||
@ -1576,9 +1697,21 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
if (fsrv->support_shmem_fuzz && !fsrv->use_shmem_fuzz)
|
if (fsrv->support_shmem_fuzz && !fsrv->use_shmem_fuzz)
|
||||||
shm_fuzz = deinit_shmem(fsrv, shm_fuzz);
|
shm_fuzz = deinit_shmem(fsrv, shm_fuzz);
|
||||||
|
|
||||||
if (execute_testcases(in_dir) == 0) {
|
if (in_dir) {
|
||||||
|
|
||||||
FATAL("could not read input testcases from %s", in_dir);
|
if (execute_testcases(in_dir) == 0) {
|
||||||
|
|
||||||
|
FATAL("could not read input testcases from %s", in_dir);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (execute_testcases_filelist(in_filelist) == 0) {
|
||||||
|
|
||||||
|
FATAL("could not read input testcases from %s", in_filelist);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user