mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-24 14:43:22 +00:00
Compare commits
88 Commits
Author | SHA1 | Date | |
---|---|---|---|
5a2688c213 | |||
c31817863b | |||
54684728a1 | |||
4c8e473376 | |||
f1d829c7ca | |||
c900a8e30c | |||
fd82e3330c | |||
1db82f3303 | |||
2d4a4ba73f | |||
ca55858aa7 | |||
e639521b01 | |||
894339c5d7 | |||
e13dc9b7e6 | |||
9419e39fdf | |||
a3125c38f4 | |||
224add0222 | |||
19636f748c | |||
7aa5e1c443 | |||
93279db71b | |||
5bf760510e | |||
03dc80afc4 | |||
fda3106fd9 | |||
9721a77204 | |||
92a8c2804f | |||
e1521fa8eb | |||
4e3cd8ac3f | |||
31a8beb449 | |||
e7d871c8bf | |||
56d5aa3101 | |||
c6a2a4046e | |||
6dd5e931fc | |||
635140ba43 | |||
497f341eac | |||
068aa13c6b | |||
ba7ae6c59d | |||
6ae95271be | |||
a2e0163cc1 | |||
1db3b81d2e | |||
0a16ea7487 | |||
a26bb0b0f2 | |||
7d3530a22e | |||
a87ea96913 | |||
81609a0f42 | |||
938edab25f | |||
29c9870658 | |||
b6c4f3775a | |||
5ee5564ae2 | |||
ab36756061 | |||
831b8f35d5 | |||
0cf78b7748 | |||
0892a2245e | |||
622474e9e4 | |||
0cabc12f91 | |||
b282ce999d | |||
24b9d74e70 | |||
c03f2897d0 | |||
90fbf59bf1 | |||
93c7cbd496 | |||
db60555c1b | |||
45117a3384 | |||
4d4880b428 | |||
ac6ccd53df | |||
4ec376bd6a | |||
3c0448305b | |||
a6029a10cc | |||
26eaf53a83 | |||
5d623a27ed | |||
69e554b941 | |||
7340374a7c | |||
67d356b73f | |||
da18f1f722 | |||
58abcceff5 | |||
ad0d0c77fb | |||
2c3f761ede | |||
70c60cfba7 | |||
f3b6d64ad3 | |||
43e9a13921 | |||
526dbe8f16 | |||
951a0e5225 | |||
458b939bc4 | |||
476aca5b67 | |||
96bf0f8323 | |||
58206a3180 | |||
f138ab8ac6 | |||
50839cf6e9 | |||
626a4434ed | |||
d84cc73d13 | |||
6b049536f1 |
1
.github/workflows/ci.yml
vendored
1
.github/workflows/ci.yml
vendored
@ -5,7 +5,6 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- stable
|
- stable
|
||||||
- dev
|
- dev
|
||||||
- 420
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- dev # No need for stable-pull-request, as that equals dev-push
|
- dev # No need for stable-pull-request, as that equals dev-push
|
||||||
|
4
.gitmodules
vendored
4
.gitmodules
vendored
@ -25,3 +25,7 @@
|
|||||||
[submodule "nyx_mode/QEMU-Nyx"]
|
[submodule "nyx_mode/QEMU-Nyx"]
|
||||||
path = nyx_mode/QEMU-Nyx
|
path = nyx_mode/QEMU-Nyx
|
||||||
url = https://github.com/nyx-fuzz/QEMU-Nyx
|
url = https://github.com/nyx-fuzz/QEMU-Nyx
|
||||||
|
[submodule "xgboost"]
|
||||||
|
path = xgboost
|
||||||
|
url = https://github.com/dmlc/xgboost
|
||||||
|
branch = 742c19f
|
||||||
|
@ -471,8 +471,13 @@ src/afl-forkserver.o : $(COMM_HDR) src/afl-forkserver.c include/forkserver.h
|
|||||||
src/afl-sharedmem.o : $(COMM_HDR) src/afl-sharedmem.c include/sharedmem.h
|
src/afl-sharedmem.o : $(COMM_HDR) src/afl-sharedmem.c include/sharedmem.h
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_FLTO) $(SPECIAL_PERFORMANCE) -c src/afl-sharedmem.c -o src/afl-sharedmem.o
|
$(CC) $(CFLAGS) $(CFLAGS_FLTO) $(SPECIAL_PERFORMANCE) -c src/afl-sharedmem.c -o src/afl-sharedmem.o
|
||||||
|
|
||||||
afl-fuzz: $(COMM_HDR) include/afl-fuzz.h $(AFL_FUZZ_FILES) src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o src/hashmap.c | test_x86
|
libxgboost.so:
|
||||||
$(CC) $(CFLAGS) $(COMPILE_STATIC) $(CFLAGS_FLTO) $(SPECIAL_PERFORMANCE) -Wno-shift-count-overflow $(AFL_FUZZ_FILES) src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o src/hashmap.c -o $@ $(PYFLAGS) $(LDFLAGS) -lm
|
git submodule init
|
||||||
|
git submodule update --recursive
|
||||||
|
mkdir -p xgboost/build && cd xgboost && git submodule init && git submodule update --recursive && cd build && cmake -DUSE_OPENMP=OFF -DHIDE_CXX_SYMBOLS=ON .. && make && cp -v ../lib/libxgboost.so ../..
|
||||||
|
|
||||||
|
afl-fuzz: $(COMM_HDR) include/afl-fuzz.h $(AFL_FUZZ_FILES) src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o src/hashmap.c libxgboost.so | test_x86
|
||||||
|
$(CC) $(CFLAGS) $(COMPILE_STATIC) $(CFLAGS_FLTO) $(SPECIAL_PERFORMANCE) -Wno-shift-count-overflow $(AFL_FUZZ_FILES) src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o src/hashmap.c -o $@ $(PYFLAGS) $(LDFLAGS) -I./xgboost/include -lm -L. -lxgboost
|
||||||
|
|
||||||
afl-showmap: src/afl-showmap.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o $(COMM_HDR) | test_x86
|
afl-showmap: src/afl-showmap.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o $(COMM_HDR) | test_x86
|
||||||
$(CC) $(CFLAGS) $(COMPILE_STATIC) $(CFLAGS_FLTO) $(SPECIAL_PERFORMANCE) src/$@.c src/afl-fuzz-mutators.c src/afl-fuzz-python.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o -o $@ $(PYFLAGS) $(LDFLAGS)
|
$(CC) $(CFLAGS) $(COMPILE_STATIC) $(CFLAGS_FLTO) $(SPECIAL_PERFORMANCE) src/$@.c src/afl-fuzz-mutators.c src/afl-fuzz-python.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o -o $@ $(PYFLAGS) $(LDFLAGS)
|
||||||
|
@ -46,7 +46,7 @@ LLVMVER = $(shell $(LLVM_CONFIG) --version 2>/dev/null | sed 's/git//' | sed 's
|
|||||||
LLVM_MAJOR = $(shell $(LLVM_CONFIG) --version 2>/dev/null | sed 's/\..*//' )
|
LLVM_MAJOR = $(shell $(LLVM_CONFIG) --version 2>/dev/null | sed 's/\..*//' )
|
||||||
LLVM_MINOR = $(shell $(LLVM_CONFIG) --version 2>/dev/null | sed 's/.*\.//' | sed 's/git//' | sed 's/svn//' | sed 's/ .*//' | sed 's/rc.*//' )
|
LLVM_MINOR = $(shell $(LLVM_CONFIG) --version 2>/dev/null | sed 's/.*\.//' | sed 's/git//' | sed 's/svn//' | sed 's/ .*//' | sed 's/rc.*//' )
|
||||||
LLVM_UNSUPPORTED = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^[0-2]\.|^3.[0-8]\.' && echo 1 || echo 0 )
|
LLVM_UNSUPPORTED = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^[0-2]\.|^3.[0-8]\.' && echo 1 || echo 0 )
|
||||||
LLVM_TOO_NEW = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[8-9]|^2[0-9]' && echo 1 || echo 0 )
|
LLVM_TOO_NEW = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^19|^2[0-9]' && echo 1 || echo 0 )
|
||||||
LLVM_TOO_OLD = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^[1-9]\.|^1[012]\.' && echo 1 || echo 0 )
|
LLVM_TOO_OLD = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^[1-9]\.|^1[012]\.' && echo 1 || echo 0 )
|
||||||
LLVM_NEW_API = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[0-9]' && echo 1 || echo 0 )
|
LLVM_NEW_API = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[0-9]' && echo 1 || echo 0 )
|
||||||
LLVM_NEWER_API = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[6-9]' && echo 1 || echo 0 )
|
LLVM_NEWER_API = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[6-9]' && echo 1 || echo 0 )
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Release version: [4.20c](https://github.com/AFLplusplus/AFLplusplus/releases)
|
Release version: [4.20c](https://github.com/AFLplusplus/AFLplusplus/releases)
|
||||||
|
|
||||||
GitHub version: 4.20c
|
GitHub version: 4.21a
|
||||||
|
|
||||||
Repository:
|
Repository:
|
||||||
[https://github.com/AFLplusplus/AFLplusplus](https://github.com/AFLplusplus/AFLplusplus)
|
[https://github.com/AFLplusplus/AFLplusplus](https://github.com/AFLplusplus/AFLplusplus)
|
||||||
|
2
TODO.md
2
TODO.md
@ -11,11 +11,13 @@
|
|||||||
- afl-showmap -f support
|
- afl-showmap -f support
|
||||||
- afl-fuzz multicore wrapper script
|
- afl-fuzz multicore wrapper script
|
||||||
- when trimming then perform crash detection
|
- when trimming then perform crash detection
|
||||||
|
- cyclomatic complexity: 2 + calls + edges - blocks
|
||||||
|
|
||||||
|
|
||||||
## Should
|
## Should
|
||||||
|
|
||||||
- afl-crash-analysis
|
- afl-crash-analysis
|
||||||
|
- cmplog: add loop count resolving (byte -> loop cnt change, calc special values)
|
||||||
- support persistent and deferred fork server in afl-showmap?
|
- support persistent and deferred fork server in afl-showmap?
|
||||||
- better autodetection of shifting runtime timeout values
|
- better autodetection of shifting runtime timeout values
|
||||||
- afl-plot to support multiple plot_data
|
- afl-plot to support multiple plot_data
|
||||||
|
6
afl-cmin
6
afl-cmin
@ -13,7 +13,7 @@ awk -f - -- ${@+"$@"} <<'EOF'
|
|||||||
# awk script to minimize a test corpus of input files
|
# awk script to minimize a test corpus of input files
|
||||||
#
|
#
|
||||||
# based on afl-cmin bash script written by Michal Zalewski
|
# based on afl-cmin bash script written by Michal Zalewski
|
||||||
# rewritten by Heiko Eißfeldt (hexcoder-)
|
# rewritten by Heiko Eissfeldt (hexcoder-)
|
||||||
# tested with:
|
# tested with:
|
||||||
# gnu awk (x86 Linux)
|
# gnu awk (x86 Linux)
|
||||||
# bsd awk (x86 *BSD)
|
# bsd awk (x86 *BSD)
|
||||||
@ -603,8 +603,8 @@ BEGIN {
|
|||||||
# create path for the trace file from afl-showmap
|
# create path for the trace file from afl-showmap
|
||||||
tracefile_path = trace_dir"/"fn
|
tracefile_path = trace_dir"/"fn
|
||||||
# ensure the file size is not zero
|
# ensure the file size is not zero
|
||||||
cmd = "du -b "tracefile_path
|
cmd = "du -b \""tracefile_path"\""
|
||||||
"ls -l "tracefile_path
|
# "ls -l \""tracefile_path"\""
|
||||||
cmd | getline output
|
cmd | getline output
|
||||||
close(cmd)
|
close(cmd)
|
||||||
split(output, result, "\t")
|
split(output, result, "\t")
|
||||||
|
@ -152,6 +152,7 @@ Minimization settings:
|
|||||||
-e - solve for edge coverage only, ignore hit counts
|
-e - solve for edge coverage only, ignore hit counts
|
||||||
|
|
||||||
For additional tips, please consult README.md.
|
For additional tips, please consult README.md.
|
||||||
|
This script cannot read filenames that end with a space ' '.
|
||||||
|
|
||||||
Environment variables used:
|
Environment variables used:
|
||||||
AFL_KEEP_TRACES: leave the temporary <out_dir>\.traces directory
|
AFL_KEEP_TRACES: leave the temporary <out_dir>\.traces directory
|
||||||
|
@ -111,7 +111,13 @@ if [ -z "$NO_COLOR" ]; then
|
|||||||
RESET="$NC"
|
RESET="$NC"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CUR_TIME=`date +%s`
|
PLATFORM=`uname -s`
|
||||||
|
if [ "$PLATFORM" = "Linux" ] ; then
|
||||||
|
CUR_TIME=`cat /proc/uptime | awk '{printf "%.0f\n", $1}'`
|
||||||
|
else
|
||||||
|
# This will lead to inacurate results but will prevent the script from breaking on platforms other than Linux
|
||||||
|
CUR_TIME=`date +%s`
|
||||||
|
fi
|
||||||
|
|
||||||
TMP=`mktemp -t .afl-whatsup-XXXXXXXX` || TMP=`mktemp -p /data/local/tmp .afl-whatsup-XXXXXXXX` || TMP=`mktemp -p /data/local/tmp .afl-whatsup-XXXXXXXX` || exit 1
|
TMP=`mktemp -t .afl-whatsup-XXXXXXXX` || TMP=`mktemp -p /data/local/tmp .afl-whatsup-XXXXXXXX` || TMP=`mktemp -p /data/local/tmp .afl-whatsup-XXXXXXXX` || exit 1
|
||||||
trap "rm -f $TMP" 1 2 3 13 15
|
trap "rm -f $TMP" 1 2 3 13 15
|
||||||
|
@ -1 +1 @@
|
|||||||
5ed4f8d
|
95a6857
|
||||||
|
Submodule custom_mutators/grammar_mutator/grammar_mutator updated: 5ed4f8d6e6...95a685773e
@ -22,10 +22,10 @@ afl_state_t *afl_struct;
|
|||||||
typedef struct my_mutator {
|
typedef struct my_mutator {
|
||||||
|
|
||||||
afl_state_t *afl;
|
afl_state_t *afl;
|
||||||
u8 * mutator_buf;
|
u8 *mutator_buf;
|
||||||
u8 * out_dir;
|
u8 *out_dir;
|
||||||
u8 * tmp_dir;
|
u8 *tmp_dir;
|
||||||
u8 * target;
|
u8 *target;
|
||||||
uint32_t seed;
|
uint32_t seed;
|
||||||
|
|
||||||
} my_mutator_t;
|
} my_mutator_t;
|
||||||
@ -101,7 +101,7 @@ my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|||||||
|
|
||||||
/* When a new queue entry is added we run this input with the symcc
|
/* When a new queue entry is added we run this input with the symcc
|
||||||
instrumented binary */
|
instrumented binary */
|
||||||
uint8_t afl_custom_queue_new_entry(my_mutator_t * data,
|
uint8_t afl_custom_queue_new_entry(my_mutator_t *data,
|
||||||
const uint8_t *filename_new_queue,
|
const uint8_t *filename_new_queue,
|
||||||
const uint8_t *filename_orig_queue) {
|
const uint8_t *filename_orig_queue) {
|
||||||
|
|
||||||
@ -176,7 +176,7 @@ uint8_t afl_custom_queue_new_entry(my_mutator_t * data,
|
|||||||
|
|
||||||
struct dirent **nl;
|
struct dirent **nl;
|
||||||
int32_t items = scandir(data->tmp_dir, &nl, NULL, NULL);
|
int32_t items = scandir(data->tmp_dir, &nl, NULL, NULL);
|
||||||
u8 * origin_name = basename(filename_new_queue);
|
u8 *origin_name = basename(filename_new_queue);
|
||||||
int32_t i;
|
int32_t i;
|
||||||
if (items > 0) {
|
if (items > 0) {
|
||||||
|
|
||||||
@ -187,8 +187,8 @@ uint8_t afl_custom_queue_new_entry(my_mutator_t * data,
|
|||||||
DBG("test=%s\n", fn);
|
DBG("test=%s\n", fn);
|
||||||
if (stat(source_name, &st) == 0 && S_ISREG(st.st_mode) && st.st_size) {
|
if (stat(source_name, &st) == 0 && S_ISREG(st.st_mode) && st.st_size) {
|
||||||
|
|
||||||
u8 *destination_name =
|
u8 *destination_name = alloc_printf("%s/%s.%s", data->out_dir,
|
||||||
alloc_printf("%s/%s.%s", data->out_dir, origin_name, nl[i]->d_name);
|
origin_name, nl[i]->d_name);
|
||||||
rename(source_name, destination_name);
|
rename(source_name, destination_name);
|
||||||
ck_free(destination_name);
|
ck_free(destination_name);
|
||||||
DBG("found=%s\n", source_name);
|
DBG("found=%s\n", source_name);
|
||||||
@ -248,7 +248,7 @@ uint32_t afl_custom_fuzz_count(my_mutator_t *data, const u8 *buf,
|
|||||||
for (i = 0; i < (u32)items; ++i) {
|
for (i = 0; i < (u32)items; ++i) {
|
||||||
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
u8 * fn = alloc_printf("%s/%s", data->out_dir, nl[i]->d_name);
|
u8 *fn = alloc_printf("%s/%s", data->out_dir, nl[i]->d_name);
|
||||||
DBG("test=%s\n", fn);
|
DBG("test=%s\n", fn);
|
||||||
if (stat(fn, &st) == 0 && S_ISREG(st.st_mode) && st.st_size) {
|
if (stat(fn, &st) == 0 && S_ISREG(st.st_mode) && st.st_size) {
|
||||||
|
|
||||||
@ -282,12 +282,12 @@ size_t afl_custom_fuzz(my_mutator_t *data, uint8_t *buf, size_t buf_size,
|
|||||||
|
|
||||||
if (items <= 0) return 0;
|
if (items <= 0) return 0;
|
||||||
|
|
||||||
for (i = 0; i < (u32)items; ++i) {
|
for (i = 0; i < (s32)items; ++i) {
|
||||||
|
|
||||||
struct stat st;
|
if (!done) {
|
||||||
u8 * fn = alloc_printf("%s/%s", data->out_dir, nl[i]->d_name);
|
|
||||||
|
|
||||||
if (done == 0) {
|
struct stat st;
|
||||||
|
u8 *fn = alloc_printf("%s/%s", data->out_dir, nl[i]->d_name);
|
||||||
|
|
||||||
if (stat(fn, &st) == 0 && S_ISREG(st.st_mode) && st.st_size) {
|
if (stat(fn, &st) == 0 && S_ISREG(st.st_mode) && st.st_size) {
|
||||||
|
|
||||||
@ -306,10 +306,10 @@ size_t afl_custom_fuzz(my_mutator_t *data, uint8_t *buf, size_t buf_size,
|
|||||||
}
|
}
|
||||||
|
|
||||||
unlink(fn);
|
unlink(fn);
|
||||||
|
ck_free(fn);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ck_free(fn);
|
|
||||||
free(nl[i]);
|
free(nl[i]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,38 @@
|
|||||||
This is the list of all noteworthy changes made in every public
|
This is the list of all noteworthy changes made in every public
|
||||||
release of the tool. See README.md for the general instruction manual.
|
release of the tool. See README.md for the general instruction manual.
|
||||||
|
|
||||||
|
### Version ++4.21a (dev)
|
||||||
|
* afl-fuzz
|
||||||
|
- fixed a regression in afl-fuzz that resulted in a 5-10% performace loss
|
||||||
|
do a switch from gettimeofday() to clock_gettime() which should be rather
|
||||||
|
three times faster. The reason for this is unknown.
|
||||||
|
- added AFL_DISABLE_REDUNDANT for huge queues
|
||||||
|
- fix AFL_PERSISTENT_RECORD
|
||||||
|
- run custom_post_process after standard trimming
|
||||||
|
- prevent filenames in the queue that have spaces
|
||||||
|
- minor fix for FAST schedules
|
||||||
|
- more frequent stats update when syncing (todo: check performance impact)
|
||||||
|
- now timing of calibration, trimming and syncing is measured seperately,
|
||||||
|
thanks to @eqv!
|
||||||
|
- -V timing is now accurately the fuzz time (without syncing), before
|
||||||
|
long calibration times and syncing could result in now fuzzing being
|
||||||
|
made when the time was already run out until then, thanks to @eqv!
|
||||||
|
* afl-cc:
|
||||||
|
- re-enable i386 support that was accidently disabled
|
||||||
|
- fixes for LTO and outdated afl-gcc mode for i386
|
||||||
|
- fix COMPCOV split compare for old LLVMs
|
||||||
|
- disable xml/curl/g_ string transform functions because we do not check
|
||||||
|
for null pointers ... TODO
|
||||||
|
- ensure shared memory variables are visible in weird build setups
|
||||||
|
- compatability to new LLVM 19 changes
|
||||||
|
* afl-cmin
|
||||||
|
- work with input files that have a space
|
||||||
|
* afl-showmap
|
||||||
|
- fix memory leak on shmem testcase usage (thanks to @ndrewh)
|
||||||
|
- minor fix to collect coverage -C (thanks to @bet4it)
|
||||||
|
* enhanced the ASAN configuration
|
||||||
|
|
||||||
|
|
||||||
### Version ++4.20c (release)
|
### Version ++4.20c (release)
|
||||||
! A new forkserver communication model is now introduced. afl-fuzz is
|
! A new forkserver communication model is now introduced. afl-fuzz is
|
||||||
backward compatible to old compiled targets if they are not built
|
backward compatible to old compiled targets if they are not built
|
||||||
@ -36,12 +68,13 @@
|
|||||||
- afl-whatsup:
|
- afl-whatsup:
|
||||||
- now also displays current average speed
|
- now also displays current average speed
|
||||||
- small bugfixes
|
- small bugfixes
|
||||||
- Fixes for aflpp custom mutator and standalone tool
|
- custom mutators:
|
||||||
|
- fixes for aflpp custom mutator and standalone tool
|
||||||
|
- important fix to the symcc custom mutator
|
||||||
- Minor edits to afl-persistent-config
|
- Minor edits to afl-persistent-config
|
||||||
- Prevent temporary files being left behind on aborted afl-whatsup
|
- Prevent temporary files being left behind on aborted afl-whatsup
|
||||||
- More CPU benchmarks added to benchmark/
|
- More CPU benchmarks added to benchmark/
|
||||||
|
|
||||||
|
|
||||||
### Version ++4.10c (release)
|
### Version ++4.10c (release)
|
||||||
- afl-fuzz:
|
- afl-fuzz:
|
||||||
- default power schedule is now EXPLORE, due a fix in fast schedules
|
- default power schedule is now EXPLORE, due a fix in fast schedules
|
||||||
|
@ -266,6 +266,11 @@ trimmed input. Here's a quick API description:
|
|||||||
Omitting any of three trimming methods will cause the trimming to be disabled
|
Omitting any of three trimming methods will cause the trimming to be disabled
|
||||||
and trigger a fallback to the built-in default trimming routine.
|
and trigger a fallback to the built-in default trimming routine.
|
||||||
|
|
||||||
|
**IMPORTANT** If you have a custom post process mutator that needs to be run
|
||||||
|
after trimming, you must call it yourself at the end of your successful
|
||||||
|
trimming!
|
||||||
|
|
||||||
|
|
||||||
### Environment Variables
|
### Environment Variables
|
||||||
|
|
||||||
Optionally, the following environment variables are supported:
|
Optionally, the following environment variables are supported:
|
||||||
|
@ -381,6 +381,9 @@ checks or alter some of the more exotic semantics of the tool:
|
|||||||
- Setting `AFL_DISABLE_TRIM` tells afl-fuzz not to trim test cases. This is
|
- Setting `AFL_DISABLE_TRIM` tells afl-fuzz not to trim test cases. This is
|
||||||
usually a bad idea!
|
usually a bad idea!
|
||||||
|
|
||||||
|
- Setting `AFL_DISABLE_REDUNDANT` disables any queue items that are redundant.
|
||||||
|
This can be useful with huge queues.
|
||||||
|
|
||||||
- Setting `AFL_KEEP_TIMEOUTS` will keep longer running inputs if they reach
|
- Setting `AFL_KEEP_TIMEOUTS` will keep longer running inputs if they reach
|
||||||
new coverage
|
new coverage
|
||||||
|
|
||||||
@ -547,6 +550,9 @@ checks or alter some of the more exotic semantics of the tool:
|
|||||||
use a custom afl-qemu-trace or if you need to modify the afl-qemu-trace
|
use a custom afl-qemu-trace or if you need to modify the afl-qemu-trace
|
||||||
arguments.
|
arguments.
|
||||||
|
|
||||||
|
- `AFL_SHA1_FILENAMES` causes AFL++ to generate files named by the SHA1 hash
|
||||||
|
of their contents, rather than use the standard `id:000000,...` names.
|
||||||
|
|
||||||
- `AFL_SHUFFLE_QUEUE` randomly reorders the input queue on startup. Requested
|
- `AFL_SHUFFLE_QUEUE` randomly reorders the input queue on startup. Requested
|
||||||
by some users for unorthodox parallelized fuzzing setups, but not advisable
|
by some users for unorthodox parallelized fuzzing setups, but not advisable
|
||||||
otherwise.
|
otherwise.
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -139,6 +139,10 @@
|
|||||||
#define AFL_RAND_RETURN u32
|
#define AFL_RAND_RETURN u32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef INTERESTING_32_LEN
|
||||||
|
#error INTERESTING_32_LEN not defined - BUG!
|
||||||
|
#endif
|
||||||
|
|
||||||
extern s8 interesting_8[INTERESTING_8_LEN];
|
extern s8 interesting_8[INTERESTING_8_LEN];
|
||||||
extern s16 interesting_16[INTERESTING_8_LEN + INTERESTING_16_LEN];
|
extern s16 interesting_16[INTERESTING_8_LEN + INTERESTING_16_LEN];
|
||||||
extern s32
|
extern s32
|
||||||
@ -452,7 +456,8 @@ typedef struct afl_env_vars {
|
|||||||
afl_keep_timeouts, afl_no_crash_readme, afl_ignore_timeouts,
|
afl_keep_timeouts, afl_no_crash_readme, afl_ignore_timeouts,
|
||||||
afl_no_startup_calibration, afl_no_warn_instability,
|
afl_no_startup_calibration, afl_no_warn_instability,
|
||||||
afl_post_process_keep_original, afl_crashing_seeds_as_new_crash,
|
afl_post_process_keep_original, afl_crashing_seeds_as_new_crash,
|
||||||
afl_final_sync, afl_ignore_seed_problems;
|
afl_final_sync, afl_ignore_seed_problems, afl_disable_redundant,
|
||||||
|
afl_sha1_filenames;
|
||||||
|
|
||||||
u8 *afl_tmpdir, *afl_custom_mutator_library, *afl_python_module, *afl_path,
|
u8 *afl_tmpdir, *afl_custom_mutator_library, *afl_python_module, *afl_path,
|
||||||
*afl_hang_tmout, *afl_forksrv_init_tmout, *afl_preload,
|
*afl_hang_tmout, *afl_forksrv_init_tmout, *afl_preload,
|
||||||
@ -1404,6 +1409,32 @@ void queue_testcase_retake_mem(afl_state_t *afl, struct queue_entry *q, u8 *in,
|
|||||||
|
|
||||||
void queue_testcase_store_mem(afl_state_t *afl, struct queue_entry *q, u8 *mem);
|
void queue_testcase_store_mem(afl_state_t *afl, struct queue_entry *q, u8 *mem);
|
||||||
|
|
||||||
|
/* Compute the SHA1 hash of `data`, which is of `len` bytes, and return the
|
||||||
|
* result as a `\0`-terminated hex string, which the caller much `ck_free`. */
|
||||||
|
char *sha1_hex(const u8 *data, size_t len);
|
||||||
|
|
||||||
|
/* Apply `sha1_hex` to the first `len` bytes of data of the file at `fname`. */
|
||||||
|
char *sha1_hex_for_file(const char *fname, u32 len);
|
||||||
|
|
||||||
|
/* Create file `fn`, but allow it to already exist if `AFL_SHA1_FILENAMES` is
|
||||||
|
* enabled. */
|
||||||
|
static inline int permissive_create(afl_state_t *afl, const char *fn) {
|
||||||
|
|
||||||
|
int fd = open(fn, O_WRONLY | O_CREAT | O_EXCL, DEFAULT_PERMISSION);
|
||||||
|
if (unlikely(fd < 0)) {
|
||||||
|
|
||||||
|
if (!(afl->afl_env.afl_sha1_filenames && errno == EEXIST)) {
|
||||||
|
|
||||||
|
PFATAL("Unable to create '%s'", fn);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#if TESTCASE_CACHE == 1
|
#if TESTCASE_CACHE == 1
|
||||||
#error define of TESTCASE_CACHE must be zero or larger than 1
|
#error define of TESTCASE_CACHE must be zero or larger than 1
|
||||||
#endif
|
#endif
|
||||||
|
@ -33,6 +33,10 @@
|
|||||||
|
|
||||||
#define MUT_STRATEGY_ARRAY_SIZE 256
|
#define MUT_STRATEGY_ARRAY_SIZE 256
|
||||||
|
|
||||||
|
#ifndef INTERESTING_32
|
||||||
|
#error INTERESTING_32 is not defined - BUG!
|
||||||
|
#endif
|
||||||
|
|
||||||
s8 interesting_8[] = {INTERESTING_8};
|
s8 interesting_8[] = {INTERESTING_8};
|
||||||
s16 interesting_16[] = {INTERESTING_8, INTERESTING_16};
|
s16 interesting_16[] = {INTERESTING_8, INTERESTING_16};
|
||||||
s32 interesting_32[] = {INTERESTING_8, INTERESTING_16, INTERESTING_32};
|
s32 interesting_32[] = {INTERESTING_8, INTERESTING_16, INTERESTING_32};
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
/* Version string: */
|
/* Version string: */
|
||||||
|
|
||||||
// c = release, a = volatile github dev, e = experimental branch
|
// c = release, a = volatile github dev, e = experimental branch
|
||||||
#define VERSION "++4.20c"
|
#define VERSION "++4.21a"
|
||||||
|
|
||||||
/******************************************************
|
/******************************************************
|
||||||
* *
|
* *
|
||||||
@ -464,7 +464,7 @@
|
|||||||
/* Do not change this unless you really know what you are doing. */
|
/* Do not change this unless you really know what you are doing. */
|
||||||
|
|
||||||
#define MAP_SIZE (1U << MAP_SIZE_POW2)
|
#define MAP_SIZE (1U << MAP_SIZE_POW2)
|
||||||
#if MAP_SIZE <= 65536
|
#if MAP_SIZE <= 2097152
|
||||||
#define MAP_INITIAL_SIZE (2 << 20) // = 2097152
|
#define MAP_INITIAL_SIZE (2 << 20) // = 2097152
|
||||||
#else
|
#else
|
||||||
#define MAP_INITIAL_SIZE MAP_SIZE
|
#define MAP_INITIAL_SIZE MAP_SIZE
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -21,17 +21,18 @@ static char *afl_environment_variables[] = {
|
|||||||
"AFL_BENCH_UNTIL_CRASH", "AFL_CAL_FAST", "AFL_CC", "AFL_CC_COMPILER",
|
"AFL_BENCH_UNTIL_CRASH", "AFL_CAL_FAST", "AFL_CC", "AFL_CC_COMPILER",
|
||||||
"AFL_CMIN_ALLOW_ANY", "AFL_CMIN_CRASHES_ONLY", "AFL_CMPLOG_ONLY_NEW",
|
"AFL_CMIN_ALLOW_ANY", "AFL_CMIN_CRASHES_ONLY", "AFL_CMPLOG_ONLY_NEW",
|
||||||
"AFL_CODE_END", "AFL_CODE_START", "AFL_COMPCOV_BINNAME",
|
"AFL_CODE_END", "AFL_CODE_START", "AFL_COMPCOV_BINNAME",
|
||||||
"AFL_CMPLOG_MAX_LEN", "AFL_COMPCOV_LEVEL", "AFL_CRASH_EXITCODE",
|
"AFL_DUMP_CYCLOMATIC_COMPLEXITY", "AFL_CMPLOG_MAX_LEN", "AFL_COMPCOV_LEVEL",
|
||||||
"AFL_CRASHING_SEEDS_AS_NEW_CRASH", "AFL_CUSTOM_MUTATOR_LIBRARY",
|
"AFL_CRASH_EXITCODE", "AFL_CRASHING_SEEDS_AS_NEW_CRASH",
|
||||||
"AFL_CUSTOM_MUTATOR_ONLY", "AFL_CUSTOM_INFO_PROGRAM",
|
"AFL_CUSTOM_MUTATOR_LIBRARY", "AFL_CUSTOM_MUTATOR_ONLY",
|
||||||
"AFL_CUSTOM_INFO_PROGRAM_ARGV", "AFL_CUSTOM_INFO_PROGRAM_INPUT",
|
"AFL_CUSTOM_INFO_PROGRAM", "AFL_CUSTOM_INFO_PROGRAM_ARGV",
|
||||||
"AFL_CUSTOM_INFO_OUT", "AFL_CXX", "AFL_CYCLE_SCHEDULES", "AFL_DEBUG",
|
"AFL_CUSTOM_INFO_PROGRAM_INPUT", "AFL_CUSTOM_INFO_OUT", "AFL_CXX",
|
||||||
"AFL_DEBUG_CHILD", "AFL_DEBUG_GDB", "AFL_DEBUG_UNICORN", "AFL_DISABLE_TRIM",
|
"AFL_CYCLE_SCHEDULES", "AFL_DEBUG", "AFL_DEBUG_CHILD", "AFL_DEBUG_GDB",
|
||||||
"AFL_DISABLE_LLVM_INSTRUMENTATION", "AFL_DONT_OPTIMIZE",
|
"AFL_DEBUG_UNICORN", "AFL_DISABLE_REDUNDANT", "AFL_NO_REDUNDANT",
|
||||||
"AFL_DRIVER_STDERR_DUPLICATE_FILENAME", "AFL_DUMB_FORKSRV",
|
"AFL_DISABLE_TRIM", "AFL_NO_TRIM", "AFL_DISABLE_LLVM_INSTRUMENTATION",
|
||||||
"AFL_EARLY_FORKSERVER", "AFL_ENTRYPOINT", "AFL_EXIT_WHEN_DONE",
|
"AFL_DONT_OPTIMIZE", "AFL_DRIVER_STDERR_DUPLICATE_FILENAME",
|
||||||
"AFL_EXIT_ON_TIME", "AFL_EXIT_ON_SEED_ISSUES", "AFL_FAST_CAL",
|
"AFL_DUMB_FORKSRV", "AFL_EARLY_FORKSERVER", "AFL_ENTRYPOINT",
|
||||||
"AFL_FINAL_SYNC", "AFL_FORCE_UI", "AFL_FRIDA_DEBUG_MAPS",
|
"AFL_EXIT_WHEN_DONE", "AFL_EXIT_ON_TIME", "AFL_EXIT_ON_SEED_ISSUES",
|
||||||
|
"AFL_FAST_CAL", "AFL_FINAL_SYNC", "AFL_FORCE_UI", "AFL_FRIDA_DEBUG_MAPS",
|
||||||
"AFL_FRIDA_DRIVER_NO_HOOK", "AFL_FRIDA_EXCLUDE_RANGES",
|
"AFL_FRIDA_DRIVER_NO_HOOK", "AFL_FRIDA_EXCLUDE_RANGES",
|
||||||
"AFL_FRIDA_INST_CACHE_SIZE", "AFL_FRIDA_INST_COVERAGE_ABSOLUTE",
|
"AFL_FRIDA_INST_CACHE_SIZE", "AFL_FRIDA_INST_COVERAGE_ABSOLUTE",
|
||||||
"AFL_FRIDA_INST_COVERAGE_FILE", "AFL_FRIDA_INST_DEBUG_FILE",
|
"AFL_FRIDA_INST_COVERAGE_FILE", "AFL_FRIDA_INST_DEBUG_FILE",
|
||||||
@ -107,15 +108,15 @@ static char *afl_environment_variables[] = {
|
|||||||
"AFL_QEMU_PERSISTENT_RETADDR_OFFSET", "AFL_QEMU_PERSISTENT_EXITS",
|
"AFL_QEMU_PERSISTENT_RETADDR_OFFSET", "AFL_QEMU_PERSISTENT_EXITS",
|
||||||
"AFL_QEMU_INST_RANGES", "AFL_QEMU_EXCLUDE_RANGES", "AFL_QEMU_SNAPSHOT",
|
"AFL_QEMU_INST_RANGES", "AFL_QEMU_EXCLUDE_RANGES", "AFL_QEMU_SNAPSHOT",
|
||||||
"AFL_QEMU_TRACK_UNSTABLE", "AFL_QUIET", "AFL_RANDOM_ALLOC_CANARY",
|
"AFL_QEMU_TRACK_UNSTABLE", "AFL_QUIET", "AFL_RANDOM_ALLOC_CANARY",
|
||||||
"AFL_REAL_PATH", "AFL_SHUFFLE_QUEUE", "AFL_SKIP_BIN_CHECK",
|
"AFL_REAL_PATH", "AFL_SHA1_FILENAMES", "AFL_SHUFFLE_QUEUE",
|
||||||
"AFL_SKIP_CPUFREQ", "AFL_SKIP_CRASHES", "AFL_SKIP_OSSFUZZ", "AFL_STATSD",
|
"AFL_SKIP_BIN_CHECK", "AFL_SKIP_CPUFREQ", "AFL_SKIP_CRASHES",
|
||||||
"AFL_STATSD_HOST", "AFL_STATSD_PORT", "AFL_STATSD_TAGS_FLAVOR",
|
"AFL_SKIP_OSSFUZZ", "AFL_STATSD", "AFL_STATSD_HOST", "AFL_STATSD_PORT",
|
||||||
"AFL_SYNC_TIME", "AFL_TESTCACHE_SIZE", "AFL_TESTCACHE_ENTRIES",
|
"AFL_STATSD_TAGS_FLAVOR", "AFL_SYNC_TIME", "AFL_TESTCACHE_SIZE",
|
||||||
"AFL_TMIN_EXACT", "AFL_TMPDIR", "AFL_TOKEN_FILE", "AFL_TRACE_PC",
|
"AFL_TESTCACHE_ENTRIES", "AFL_TMIN_EXACT", "AFL_TMPDIR", "AFL_TOKEN_FILE",
|
||||||
"AFL_USE_ASAN", "AFL_USE_MSAN", "AFL_USE_TRACE_PC", "AFL_USE_UBSAN",
|
"AFL_TRACE_PC", "AFL_USE_ASAN", "AFL_USE_MSAN", "AFL_USE_TRACE_PC",
|
||||||
"AFL_USE_TSAN", "AFL_USE_CFISAN", "AFL_USE_LSAN", "AFL_WINE_PATH",
|
"AFL_USE_UBSAN", "AFL_USE_TSAN", "AFL_USE_CFISAN", "AFL_USE_LSAN",
|
||||||
"AFL_NO_SNAPSHOT", "AFL_EXPAND_HAVOC_NOW", "AFL_USE_FASAN", "AFL_USE_QASAN",
|
"AFL_WINE_PATH", "AFL_NO_SNAPSHOT", "AFL_EXPAND_HAVOC_NOW", "AFL_USE_FASAN",
|
||||||
"AFL_PRINT_FILENAMES", "AFL_PIZZA_MODE", NULL
|
"AFL_USE_QASAN", "AFL_PRINT_FILENAMES", "AFL_PIZZA_MODE", NULL
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>>
|
Dominik Maier <mail@dmnk.co>>
|
||||||
|
|
||||||
@ -188,6 +188,8 @@ typedef struct afl_forkserver {
|
|||||||
|
|
||||||
u8 persistent_mode;
|
u8 persistent_mode;
|
||||||
|
|
||||||
|
u32 max_length;
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
nyx_plugin_handler_t *nyx_handlers;
|
nyx_plugin_handler_t *nyx_handlers;
|
||||||
char *out_dir_path; /* path to the output directory */
|
char *out_dir_path; /* path to the output directory */
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>,
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
Andrea Fioraldi <andreafioraldi@gmail.com>,
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -341,7 +341,7 @@ llvmGetPassPluginInfo() {
|
|||||||
using OptimizationLevel = typename PassBuilder::OptimizationLevel;
|
using OptimizationLevel = typename PassBuilder::OptimizationLevel;
|
||||||
#endif
|
#endif
|
||||||
#if LLVM_VERSION_MAJOR >= 15
|
#if LLVM_VERSION_MAJOR >= 15
|
||||||
PB.registerFullLinkTimeOptimizationEarlyEPCallback(
|
PB.registerFullLinkTimeOptimizationLastEPCallback(
|
||||||
#else
|
#else
|
||||||
PB.registerOptimizerLastEPCallback(
|
PB.registerOptimizerLastEPCallback(
|
||||||
#endif
|
#endif
|
||||||
@ -486,7 +486,7 @@ bool ModuleSanitizerCoverageLTO::instrumentModule(
|
|||||||
if ((ptr = getenv("AFL_LLVM_DOCUMENT_IDS")) != NULL) {
|
if ((ptr = getenv("AFL_LLVM_DOCUMENT_IDS")) != NULL) {
|
||||||
|
|
||||||
dFile.open(ptr, std::ofstream::out | std::ofstream::app);
|
dFile.open(ptr, std::ofstream::out | std::ofstream::app);
|
||||||
if (dFile.is_open()) WARNF("Cannot access document file %s", ptr);
|
if (!dFile.is_open()) WARNF("Cannot access document file %s", ptr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ class ModuleSanitizerCoverageAFL
|
|||||||
|
|
||||||
SanitizerCoverageOptions Options;
|
SanitizerCoverageOptions Options;
|
||||||
|
|
||||||
uint32_t instr = 0, selects = 0, unhandled = 0;
|
uint32_t instr = 0, selects = 0, unhandled = 0, dump_cc = 0;
|
||||||
GlobalVariable *AFLMapPtr = NULL;
|
GlobalVariable *AFLMapPtr = NULL;
|
||||||
ConstantInt *One = NULL;
|
ConstantInt *One = NULL;
|
||||||
ConstantInt *Zero = NULL;
|
ConstantInt *Zero = NULL;
|
||||||
@ -330,6 +330,8 @@ bool ModuleSanitizerCoverageAFL::instrumentModule(
|
|||||||
|
|
||||||
if (getenv("AFL_DEBUG")) { debug = 1; }
|
if (getenv("AFL_DEBUG")) { debug = 1; }
|
||||||
|
|
||||||
|
if (getenv("AFL_DUMP_CYCLOMATIC_COMPLEXITY")) { dump_cc = 1; }
|
||||||
|
|
||||||
if ((isatty(2) && !getenv("AFL_QUIET")) || debug) {
|
if ((isatty(2) && !getenv("AFL_QUIET")) || debug) {
|
||||||
|
|
||||||
SAYF(cCYA "SanitizerCoveragePCGUARD" VERSION cRST "\n");
|
SAYF(cCYA "SanitizerCoveragePCGUARD" VERSION cRST "\n");
|
||||||
@ -638,6 +640,8 @@ void ModuleSanitizerCoverageAFL::instrumentFunction(
|
|||||||
// InjectTraceForCmp(F, CmpTraceTargets);
|
// InjectTraceForCmp(F, CmpTraceTargets);
|
||||||
// InjectTraceForSwitch(F, SwitchTraceTargets);
|
// InjectTraceForSwitch(F, SwitchTraceTargets);
|
||||||
|
|
||||||
|
if (dump_cc) { calcCyclomaticComplexity(&F); }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalVariable *ModuleSanitizerCoverageAFL::CreateFunctionLocalArrayInSection(
|
GlobalVariable *ModuleSanitizerCoverageAFL::CreateFunctionLocalArrayInSection(
|
||||||
|
@ -26,6 +26,51 @@ static std::list<std::string> allowListFunctions;
|
|||||||
static std::list<std::string> denyListFiles;
|
static std::list<std::string> denyListFiles;
|
||||||
static std::list<std::string> denyListFunctions;
|
static std::list<std::string> denyListFunctions;
|
||||||
|
|
||||||
|
unsigned int calcCyclomaticComplexity(llvm::Function *F) {
|
||||||
|
|
||||||
|
unsigned int numBlocks = 0;
|
||||||
|
unsigned int numEdges = 0;
|
||||||
|
unsigned int numCalls = 0;
|
||||||
|
|
||||||
|
// Iterate through each basic block in the function
|
||||||
|
for (BasicBlock &BB : *F) {
|
||||||
|
|
||||||
|
// count all nodes == basic blocks
|
||||||
|
numBlocks++;
|
||||||
|
// Count the number of successors (outgoing edges)
|
||||||
|
for (BasicBlock *Succ : successors(&BB)) {
|
||||||
|
|
||||||
|
// count edges for CC
|
||||||
|
numEdges++;
|
||||||
|
(void)(Succ);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Instruction &I : BB) {
|
||||||
|
|
||||||
|
// every call is also an edge, so we need to count the calls too
|
||||||
|
if (isa<CallInst>(&I) || isa<InvokeInst>(&I)) { numCalls++; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cyclomatic Complexity V(G) = E - N + 2P
|
||||||
|
// For a single function, P (number of connected components) is 1
|
||||||
|
// Calls are considered to be an edge
|
||||||
|
unsigned int CC = 2 + numCalls + numEdges - numBlocks;
|
||||||
|
|
||||||
|
// if (debug) {
|
||||||
|
|
||||||
|
fprintf(stderr, "CyclomaticComplexity for %s: %u\n",
|
||||||
|
F->getName().str().c_str(), CC);
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
return CC;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
char *getBBName(const llvm::BasicBlock *BB) {
|
char *getBBName(const llvm::BasicBlock *BB) {
|
||||||
|
|
||||||
static char *name;
|
static char *name;
|
||||||
@ -91,7 +136,11 @@ bool isIgnoreFunction(const llvm::Function *F) {
|
|||||||
|
|
||||||
for (auto const &ignoreListFunc : ignoreList) {
|
for (auto const &ignoreListFunc : ignoreList) {
|
||||||
|
|
||||||
|
#if LLVM_VERSION_MAJOR >= 19
|
||||||
|
if (F->getName().starts_with(ignoreListFunc)) { return true; }
|
||||||
|
#else
|
||||||
if (F->getName().startswith(ignoreListFunc)) { return true; }
|
if (F->getName().startswith(ignoreListFunc)) { return true; }
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ void initInstrumentList();
|
|||||||
bool isInInstrumentList(llvm::Function *F, std::string Filename);
|
bool isInInstrumentList(llvm::Function *F, std::string Filename);
|
||||||
unsigned long long int calculateCollisions(uint32_t edges);
|
unsigned long long int calculateCollisions(uint32_t edges);
|
||||||
void scanForDangerousFunctions(llvm::Module *M);
|
void scanForDangerousFunctions(llvm::Module *M);
|
||||||
|
unsigned int calcCyclomaticComplexity(llvm::Function *F);
|
||||||
|
|
||||||
#ifndef IS_EXTERN
|
#ifndef IS_EXTERN
|
||||||
#define IS_EXTERN
|
#define IS_EXTERN
|
||||||
|
@ -54,6 +54,12 @@
|
|||||||
#define nullptr 0
|
#define nullptr 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if LLVM_MAJOR >= 19
|
||||||
|
#define STARTSWITH starts_with
|
||||||
|
#else
|
||||||
|
#define STARTSWITH startswith
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include "afl-llvm-common.h"
|
#include "afl-llvm-common.h"
|
||||||
|
|
||||||
@ -230,38 +236,38 @@ bool CompareTransform::transformCmps(Module &M, const bool processStrcmp,
|
|||||||
if (callInst->getCallingConv() != llvm::CallingConv::C) continue;
|
if (callInst->getCallingConv() != llvm::CallingConv::C) continue;
|
||||||
StringRef FuncName = Callee->getName();
|
StringRef FuncName = Callee->getName();
|
||||||
isStrcmp &=
|
isStrcmp &=
|
||||||
(!FuncName.compare("strcmp") || !FuncName.compare("xmlStrcmp") ||
|
(!FuncName.compare("strcmp") /*|| !FuncName.compare("xmlStrcmp") ||
|
||||||
!FuncName.compare("xmlStrEqual") ||
|
!FuncName.compare("xmlStrEqual") ||
|
||||||
!FuncName.compare("curl_strequal") ||
|
!FuncName.compare("curl_strequal") ||
|
||||||
!FuncName.compare("strcsequal") ||
|
!FuncName.compare("strcsequal") ||
|
||||||
!FuncName.compare("g_strcmp0"));
|
!FuncName.compare("g_strcmp0")*/);
|
||||||
isMemcmp &=
|
isMemcmp &=
|
||||||
(!FuncName.compare("memcmp") || !FuncName.compare("bcmp") ||
|
(!FuncName.compare("memcmp") || !FuncName.compare("bcmp") ||
|
||||||
!FuncName.compare("CRYPTO_memcmp") ||
|
!FuncName.compare("CRYPTO_memcmp") ||
|
||||||
!FuncName.compare("OPENSSL_memcmp") ||
|
!FuncName.compare("OPENSSL_memcmp") ||
|
||||||
!FuncName.compare("memcmp_const_time") ||
|
!FuncName.compare("memcmp_const_time") ||
|
||||||
!FuncName.compare("memcmpct"));
|
!FuncName.compare("memcmpct"));
|
||||||
isStrncmp &= (!FuncName.compare("strncmp") ||
|
isStrncmp &= (!FuncName.compare("strncmp")/* ||
|
||||||
!FuncName.compare("curl_strnequal") ||
|
!FuncName.compare("curl_strnequal") ||
|
||||||
!FuncName.compare("xmlStrncmp"));
|
!FuncName.compare("xmlStrncmp")*/);
|
||||||
isStrcasecmp &= (!FuncName.compare("strcasecmp") ||
|
isStrcasecmp &= (!FuncName.compare("strcasecmp") ||
|
||||||
!FuncName.compare("stricmp") ||
|
!FuncName.compare("stricmp") ||
|
||||||
!FuncName.compare("ap_cstr_casecmp") ||
|
!FuncName.compare("ap_cstr_casecmp") ||
|
||||||
!FuncName.compare("OPENSSL_strcasecmp") ||
|
!FuncName.compare("OPENSSL_strcasecmp") ||
|
||||||
!FuncName.compare("xmlStrcasecmp") ||
|
/*!FuncName.compare("xmlStrcasecmp") ||
|
||||||
!FuncName.compare("g_strcasecmp") ||
|
!FuncName.compare("g_strcasecmp") ||
|
||||||
!FuncName.compare("g_ascii_strcasecmp") ||
|
!FuncName.compare("g_ascii_strcasecmp") ||
|
||||||
!FuncName.compare("Curl_strcasecompare") ||
|
!FuncName.compare("Curl_strcasecompare") ||
|
||||||
!FuncName.compare("Curl_safe_strcasecompare") ||
|
!FuncName.compare("Curl_safe_strcasecompare") ||*/
|
||||||
!FuncName.compare("cmsstrcasecmp"));
|
!FuncName.compare("cmsstrcasecmp"));
|
||||||
isStrncasecmp &= (!FuncName.compare("strncasecmp") ||
|
isStrncasecmp &= (!FuncName.compare("strncasecmp") ||
|
||||||
!FuncName.compare("strnicmp") ||
|
!FuncName.compare("strnicmp") ||
|
||||||
!FuncName.compare("ap_cstr_casecmpn") ||
|
!FuncName.compare("ap_cstr_casecmpn") ||
|
||||||
!FuncName.compare("OPENSSL_strncasecmp") ||
|
!FuncName.compare("OPENSSL_strncasecmp") /*||
|
||||||
!FuncName.compare("xmlStrncasecmp") ||
|
!FuncName.compare("xmlStrncasecmp") ||
|
||||||
!FuncName.compare("g_ascii_strncasecmp") ||
|
!FuncName.compare("g_ascii_strncasecmp") ||
|
||||||
!FuncName.compare("Curl_strncasecompare") ||
|
!FuncName.compare("Curl_strncasecompare") ||
|
||||||
!FuncName.compare("g_strncasecmp"));
|
!FuncName.compare("g_strncasecmp")*/);
|
||||||
isIntMemcpy &= !FuncName.compare("llvm.memcpy.p0i8.p0i8.i64");
|
isIntMemcpy &= !FuncName.compare("llvm.memcpy.p0i8.p0i8.i64");
|
||||||
|
|
||||||
if (!isStrcmp && !isMemcmp && !isStrncmp && !isStrcasecmp &&
|
if (!isStrcmp && !isMemcmp && !isStrncmp && !isStrcasecmp &&
|
||||||
@ -465,8 +471,20 @@ bool CompareTransform::transformCmps(Module &M, const bool processStrcmp,
|
|||||||
bool isCaseInsensitive = false;
|
bool isCaseInsensitive = false;
|
||||||
bool needs_null = false;
|
bool needs_null = false;
|
||||||
bool success_is_one = false;
|
bool success_is_one = false;
|
||||||
|
bool nullCheck = false;
|
||||||
Function *Callee = callInst->getCalledFunction();
|
Function *Callee = callInst->getCalledFunction();
|
||||||
|
|
||||||
|
/*
|
||||||
|
fprintf(stderr, "%s - %s - %s\n",
|
||||||
|
callInst->getParent()
|
||||||
|
->getParent()
|
||||||
|
->getParent()
|
||||||
|
->getName()
|
||||||
|
.str()
|
||||||
|
.c_str(),
|
||||||
|
callInst->getParent()->getParent()->getName().str().c_str(),
|
||||||
|
Callee ? Callee->getName().str().c_str() : "NULL");*/
|
||||||
|
|
||||||
if (Callee) {
|
if (Callee) {
|
||||||
|
|
||||||
if (!Callee->getName().compare("memcmp") ||
|
if (!Callee->getName().compare("memcmp") ||
|
||||||
@ -520,6 +538,11 @@ bool CompareTransform::transformCmps(Module &M, const bool processStrcmp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!isSizedcmp) needs_null = true;
|
if (!isSizedcmp) needs_null = true;
|
||||||
|
if (Callee->getName().STARTSWITH("g_") ||
|
||||||
|
Callee->getName().STARTSWITH("curl_") ||
|
||||||
|
Callee->getName().STARTSWITH("Curl_") ||
|
||||||
|
Callee->getName().STARTSWITH("xml"))
|
||||||
|
nullCheck = true;
|
||||||
|
|
||||||
Value *sizedValue = isSizedcmp ? callInst->getArgOperand(2) : NULL;
|
Value *sizedValue = isSizedcmp ? callInst->getArgOperand(2) : NULL;
|
||||||
bool isConstSized = sizedValue && isa<ConstantInt>(sizedValue);
|
bool isConstSized = sizedValue && isa<ConstantInt>(sizedValue);
|
||||||
@ -604,8 +627,10 @@ bool CompareTransform::transformCmps(Module &M, const bool processStrcmp,
|
|||||||
/* split before the call instruction */
|
/* split before the call instruction */
|
||||||
BasicBlock *bb = callInst->getParent();
|
BasicBlock *bb = callInst->getParent();
|
||||||
BasicBlock *end_bb = bb->splitBasicBlock(BasicBlock::iterator(callInst));
|
BasicBlock *end_bb = bb->splitBasicBlock(BasicBlock::iterator(callInst));
|
||||||
|
|
||||||
BasicBlock *next_lenchk_bb = NULL;
|
BasicBlock *next_lenchk_bb = NULL;
|
||||||
|
|
||||||
|
if (nullCheck) { fprintf(stderr, "TODO: null check\n"); }
|
||||||
|
|
||||||
if (isSizedcmp && !isConstSized) {
|
if (isSizedcmp && !isConstSized) {
|
||||||
|
|
||||||
next_lenchk_bb =
|
next_lenchk_bb =
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2016 laf-intel
|
* Copyright 2016 laf-intel
|
||||||
* extended for floating point by Heiko Eißfeldt
|
* extended for floating point by Heiko Eissfeldt
|
||||||
* adapted to new pass manager by Heiko Eißfeldt
|
* adapted to new pass manager by Heiko Eissfeldt
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -266,8 +266,11 @@ bool SplitComparesTransform::simplifyFPCompares(Module &M) {
|
|||||||
|
|
||||||
/* this is probably not needed but we do it anyway */
|
/* this is probably not needed but we do it anyway */
|
||||||
if (TyOp0 != TyOp1) { continue; }
|
if (TyOp0 != TyOp1) { continue; }
|
||||||
|
|
||||||
if (TyOp0->isArrayTy() || TyOp0->isVectorTy()) { continue; }
|
if (TyOp0->isArrayTy() || TyOp0->isVectorTy()) { continue; }
|
||||||
|
int constants = 0;
|
||||||
|
if (llvm::isa<llvm::Constant>(op0)) { ++constants; }
|
||||||
|
if (llvm::isa<llvm::Constant>(op1)) { ++constants; }
|
||||||
|
if (constants != 1) { continue; }
|
||||||
|
|
||||||
fcomps.push_back(selectcmpInst);
|
fcomps.push_back(selectcmpInst);
|
||||||
|
|
||||||
@ -1778,7 +1781,13 @@ bool SplitComparesTransform::runOnModule(Module &M) {
|
|||||||
|
|
||||||
auto op0 = CI->getOperand(0);
|
auto op0 = CI->getOperand(0);
|
||||||
auto op1 = CI->getOperand(1);
|
auto op1 = CI->getOperand(1);
|
||||||
|
// has to valid operands
|
||||||
if (!op0 || !op1) { continue; }
|
if (!op0 || !op1) { continue; }
|
||||||
|
// has exactly one constant and one variable
|
||||||
|
int constants = 0;
|
||||||
|
if (dyn_cast<ConstantInt>(op0)) { ++constants; }
|
||||||
|
if (dyn_cast<ConstantInt>(op1)) { ++constants; }
|
||||||
|
if (constants != 1) { continue; }
|
||||||
|
|
||||||
auto iTy1 = dyn_cast<IntegerType>(op0->getType());
|
auto iTy1 = dyn_cast<IntegerType>(op0->getType());
|
||||||
if (iTy1 && isa<IntegerType>(op1->getType())) {
|
if (iTy1 && isa<IntegerType>(op1->getType())) {
|
||||||
|
@ -1 +1 @@
|
|||||||
40033af00c
|
a6f0632a65
|
||||||
|
@ -202,6 +202,8 @@ QEMU_CONF_FLAGS=" \
|
|||||||
--disable-xfsctl \
|
--disable-xfsctl \
|
||||||
--target-list="${CPU_TARGET}-linux-user" \
|
--target-list="${CPU_TARGET}-linux-user" \
|
||||||
--without-default-devices \
|
--without-default-devices \
|
||||||
|
--extra-cflags=-Wno-int-conversion \
|
||||||
|
--disable-werror \
|
||||||
"
|
"
|
||||||
|
|
||||||
if [ -n "${CROSS_PREFIX}" ]; then
|
if [ -n "${CROSS_PREFIX}" ]; then
|
||||||
@ -243,7 +245,6 @@ if [ "$DEBUG" = "1" ]; then
|
|||||||
--enable-debug-stack-usage \
|
--enable-debug-stack-usage \
|
||||||
--enable-debug-tcg \
|
--enable-debug-tcg \
|
||||||
--enable-qom-cast-debug \
|
--enable-qom-cast-debug \
|
||||||
--enable-werror \
|
|
||||||
"
|
"
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -254,7 +255,6 @@ else
|
|||||||
--disable-debug-tcg \
|
--disable-debug-tcg \
|
||||||
--disable-qom-cast-debug \
|
--disable-qom-cast-debug \
|
||||||
--disable-stack-protector \
|
--disable-stack-protector \
|
||||||
--disable-werror \
|
|
||||||
--disable-docs \
|
--disable-docs \
|
||||||
"
|
"
|
||||||
|
|
||||||
|
Submodule qemu_mode/qemuafl updated: 40033af00c...a6f0632a65
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
|
97
src/afl-cc.c
97
src/afl-cc.c
@ -17,6 +17,10 @@
|
|||||||
|
|
||||||
#define AFL_MAIN
|
#define AFL_MAIN
|
||||||
|
|
||||||
|
#ifndef _GNU_SOURCE
|
||||||
|
#define _GNU_SOURCE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
@ -32,7 +36,9 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
#if (LLVM_MAJOR - 0 == 0)
|
#if (LLVM_MAJOR - 0 == 0)
|
||||||
#undef LLVM_MAJOR
|
#undef LLVM_MAJOR
|
||||||
@ -464,6 +470,8 @@ u8 *find_object(aflcc_state_t *aflcc, u8 *obj) {
|
|||||||
*slash = 0;
|
*slash = 0;
|
||||||
tmp = alloc_printf("%s/%s", exepath, obj);
|
tmp = alloc_printf("%s/%s", exepath, obj);
|
||||||
|
|
||||||
|
if (aflcc->debug) DEBUGF("Trying %s\n", tmp);
|
||||||
|
|
||||||
if (!access(tmp, R_OK)) { return tmp; }
|
if (!access(tmp, R_OK)) { return tmp; }
|
||||||
|
|
||||||
ck_free(tmp);
|
ck_free(tmp);
|
||||||
@ -517,8 +525,8 @@ void find_built_deps(aflcc_state_t *aflcc) {
|
|||||||
|
|
||||||
char *ptr = NULL;
|
char *ptr = NULL;
|
||||||
|
|
||||||
#if defined(__x86_64__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
if ((ptr = find_object(aflcc, "as")) != NULL) {
|
if ((ptr = find_object(aflcc, "afl-as")) != NULL) {
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
// on OSX clang masquerades as GCC
|
// on OSX clang masquerades as GCC
|
||||||
@ -1261,13 +1269,8 @@ void mode_final_checkout(aflcc_state_t *aflcc, int argc, char **argv) {
|
|||||||
aflcc->instrument_mode == INSTRUMENT_PCGUARD) {
|
aflcc->instrument_mode == INSTRUMENT_PCGUARD) {
|
||||||
|
|
||||||
aflcc->lto_mode = 1;
|
aflcc->lto_mode = 1;
|
||||||
// force CFG
|
|
||||||
// if (!aflcc->instrument_mode) {
|
|
||||||
|
|
||||||
aflcc->instrument_mode = INSTRUMENT_PCGUARD;
|
aflcc->instrument_mode = INSTRUMENT_PCGUARD;
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
} else if (aflcc->instrument_mode == INSTRUMENT_CLASSIC) {
|
} else if (aflcc->instrument_mode == INSTRUMENT_CLASSIC) {
|
||||||
|
|
||||||
aflcc->lto_mode = 1;
|
aflcc->lto_mode = 1;
|
||||||
@ -1583,8 +1586,10 @@ void add_defs_persistent_mode(aflcc_state_t *aflcc) {
|
|||||||
insert_param(aflcc,
|
insert_param(aflcc,
|
||||||
"-D__AFL_FUZZ_INIT()="
|
"-D__AFL_FUZZ_INIT()="
|
||||||
"int __afl_sharedmem_fuzzing = 1;"
|
"int __afl_sharedmem_fuzzing = 1;"
|
||||||
"extern unsigned int *__afl_fuzz_len;"
|
"extern __attribute__((visibility(\"default\"))) "
|
||||||
"extern unsigned char *__afl_fuzz_ptr;"
|
"unsigned int *__afl_fuzz_len;"
|
||||||
|
"extern __attribute__((visibility(\"default\"))) "
|
||||||
|
"unsigned char *__afl_fuzz_ptr;"
|
||||||
"unsigned char __afl_fuzz_alt[1048576];"
|
"unsigned char __afl_fuzz_alt[1048576];"
|
||||||
"unsigned char *__afl_fuzz_alt_ptr = __afl_fuzz_alt;");
|
"unsigned char *__afl_fuzz_alt_ptr = __afl_fuzz_alt;");
|
||||||
|
|
||||||
@ -1906,7 +1911,13 @@ void add_sanitizers(aflcc_state_t *aflcc, char **envp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
add_defs_fortify(aflcc, 0);
|
add_defs_fortify(aflcc, 0);
|
||||||
if (!aflcc->have_asan) { insert_param(aflcc, "-fsanitize=address"); }
|
if (!aflcc->have_asan) {
|
||||||
|
|
||||||
|
insert_param(aflcc, "-fsanitize=address");
|
||||||
|
insert_param(aflcc, "-fno-common");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
aflcc->have_asan = 1;
|
aflcc->have_asan = 1;
|
||||||
|
|
||||||
} else if (getenv("AFL_USE_MSAN") || aflcc->have_msan) {
|
} else if (getenv("AFL_USE_MSAN") || aflcc->have_msan) {
|
||||||
@ -2355,8 +2366,7 @@ static void add_aflpplib(aflcc_state_t *aflcc) {
|
|||||||
insert_param(aflcc, afllib);
|
insert_param(aflcc, afllib);
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
insert_param(aflcc, "-Wl,-undefined");
|
insert_param(aflcc, "-Wl,-undefined,dynamic_lookup");
|
||||||
insert_param(aflcc, "dynamic_lookup");
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -2473,13 +2483,60 @@ void add_runtime(aflcc_state_t *aflcc) {
|
|||||||
*/
|
*/
|
||||||
void add_assembler(aflcc_state_t *aflcc) {
|
void add_assembler(aflcc_state_t *aflcc) {
|
||||||
|
|
||||||
u8 *afl_as = find_object(aflcc, "as");
|
u8 *afl_as = find_object(aflcc, "afl-as");
|
||||||
|
|
||||||
if (!afl_as) FATAL("Cannot find 'as' (symlink to 'afl-as').");
|
if (!afl_as) FATAL("Cannot find 'afl-as'.");
|
||||||
|
|
||||||
u8 *slash = strrchr(afl_as, '/');
|
u8 *slash = strrchr(afl_as, '/');
|
||||||
if (slash) *slash = 0;
|
if (slash) *slash = 0;
|
||||||
|
|
||||||
|
// Search for 'as' may be unreliable in some cases (see #2058)
|
||||||
|
// so use 'afl-as' instead, because 'as' is usually a symbolic link,
|
||||||
|
// or can be a renamed copy of 'afl-as' created in the same dir.
|
||||||
|
// Now we should verify if the compiler can find the 'as' we need.
|
||||||
|
|
||||||
|
#define AFL_AS_ERR "(should be a symlink or copy of 'afl-as')"
|
||||||
|
|
||||||
|
u8 *afl_as_dup = alloc_printf("%s/as", afl_as);
|
||||||
|
|
||||||
|
int fd = open(afl_as_dup, O_RDONLY);
|
||||||
|
if (fd < 0) { PFATAL("Unable to open '%s' " AFL_AS_ERR, afl_as_dup); }
|
||||||
|
|
||||||
|
struct stat st;
|
||||||
|
if (fstat(fd, &st) < 0) {
|
||||||
|
|
||||||
|
PFATAL("Unable to fstat '%s' " AFL_AS_ERR, afl_as_dup);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 f_len = st.st_size;
|
||||||
|
|
||||||
|
u8 *f_data = mmap(0, f_len, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||||
|
if (f_data == MAP_FAILED) {
|
||||||
|
|
||||||
|
PFATAL("Unable to mmap file '%s' " AFL_AS_ERR, afl_as_dup);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
// "AFL_AS" is a const str passed to getenv in afl-as.c
|
||||||
|
if (!memmem(f_data, f_len, "AFL_AS", strlen("AFL_AS") + 1)) {
|
||||||
|
|
||||||
|
FATAL(
|
||||||
|
"Looks like '%s' is not a valid symlink or copy of '%s/afl-as'. "
|
||||||
|
"It is a prerequisite to override system-wide 'as' for "
|
||||||
|
"instrumentation.",
|
||||||
|
afl_as_dup, afl_as);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (munmap(f_data, f_len)) { PFATAL("unmap() failed"); }
|
||||||
|
|
||||||
|
ck_free(afl_as_dup);
|
||||||
|
|
||||||
|
#undef AFL_AS_ERR
|
||||||
|
|
||||||
insert_param(aflcc, "-B");
|
insert_param(aflcc, "-B");
|
||||||
insert_param(aflcc, afl_as);
|
insert_param(aflcc, afl_as);
|
||||||
|
|
||||||
@ -2736,11 +2793,11 @@ static void maybe_usage(aflcc_state_t *aflcc, int argc, char **argv) {
|
|||||||
"MODES: NCC PERSIST DICT LAF "
|
"MODES: NCC PERSIST DICT LAF "
|
||||||
"CMPLOG SELECT\n"
|
"CMPLOG SELECT\n"
|
||||||
" [LLVM] LLVM: %s%s\n"
|
" [LLVM] LLVM: %s%s\n"
|
||||||
" PCGUARD %s yes yes module yes yes "
|
" PCGUARD %s yes yes module yes yes "
|
||||||
"yes\n"
|
"yes\n"
|
||||||
" NATIVE AVAILABLE no yes no no "
|
" NATIVE AVAILABLE no yes no no "
|
||||||
"part. yes\n"
|
"part. yes\n"
|
||||||
" CLASSIC %s no yes module yes yes "
|
" CLASSIC %s no yes module yes yes "
|
||||||
"yes\n"
|
"yes\n"
|
||||||
" - NORMAL\n"
|
" - NORMAL\n"
|
||||||
" - CALLER\n"
|
" - CALLER\n"
|
||||||
@ -2757,10 +2814,10 @@ static void maybe_usage(aflcc_state_t *aflcc, int argc, char **argv) {
|
|||||||
" [GCC/CLANG] simple gcc/clang: %s%s\n"
|
" [GCC/CLANG] simple gcc/clang: %s%s\n"
|
||||||
" CLASSIC DEFAULT no no no no no "
|
" CLASSIC DEFAULT no no no no no "
|
||||||
"no\n\n",
|
"no\n\n",
|
||||||
aflcc->have_llvm ? "AVAILABLE" : "unavailable!",
|
aflcc->have_llvm ? "AVAILABLE " : "unavailable!",
|
||||||
aflcc->compiler_mode == LLVM ? " [SELECTED]" : "",
|
aflcc->compiler_mode == LLVM ? " [SELECTED]" : "",
|
||||||
aflcc->have_llvm ? "AVAILABLE" : "unavailable!",
|
aflcc->have_llvm ? "AVAILABLE " : "unavailable!",
|
||||||
aflcc->have_llvm ? "AVAILABLE" : "unavailable!",
|
aflcc->have_llvm ? "AVAILABLE " : "unavailable!",
|
||||||
aflcc->have_lto ? "AVAILABLE" : "unavailable!",
|
aflcc->have_lto ? "AVAILABLE" : "unavailable!",
|
||||||
aflcc->compiler_mode == LTO ? " [SELECTED]" : "",
|
aflcc->compiler_mode == LTO ? " [SELECTED]" : "",
|
||||||
aflcc->have_gcc_plugin ? "AVAILABLE" : "unavailable!",
|
aflcc->have_gcc_plugin ? "AVAILABLE" : "unavailable!",
|
||||||
@ -2786,7 +2843,7 @@ static void maybe_usage(aflcc_state_t *aflcc, int argc, char **argv) {
|
|||||||
" The best is LTO but it often needs RANLIB and AR settings outside "
|
" The best is LTO but it often needs RANLIB and AR settings outside "
|
||||||
"of afl-cc.\n\n");
|
"of afl-cc.\n\n");
|
||||||
|
|
||||||
#if LLVM_MAJOR > 10 || (LLVM_MAJOR == 10 && LLVM_MINOR > 0)
|
#if LLVM_MAJOR >= 11 || (LLVM_MAJOR == 10 && LLVM_MINOR > 0)
|
||||||
#define NATIVE_MSG \
|
#define NATIVE_MSG \
|
||||||
" LLVM-NATIVE: use llvm's native PCGUARD instrumentation (less " \
|
" LLVM-NATIVE: use llvm's native PCGUARD instrumentation (less " \
|
||||||
"performant)\n"
|
"performant)\n"
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
@ -59,27 +59,6 @@ u8 last_intr = 0;
|
|||||||
#define AFL_PATH "/usr/local/lib/afl/"
|
#define AFL_PATH "/usr/local/lib/afl/"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* - Some BSD (i.e.: FreeBSD) offer the FAST clock source as
|
|
||||||
* equivalent to Linux COARSE clock source. Aliasing COARSE to
|
|
||||||
* FAST on such systems when COARSE is not already defined.
|
|
||||||
* - macOS has no support of CLOCK_MONOTONIC_COARSE clock type.
|
|
||||||
*/
|
|
||||||
#if defined(OS_DARWIN) || defined(OS_SUNOS) || defined(__APPLE__) || \
|
|
||||||
defined(__sun) || defined(__NetBSD__)
|
|
||||||
#define CLOCK_MONOTONIC_COARSE CLOCK_MONOTONIC
|
|
||||||
#elif defined(OS_FREEBSD)
|
|
||||||
#define CLOCK_MONOTONIC_COARSE CLOCK_MONOTONIC_FAST
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Convert seconds to milliseconds. */
|
|
||||||
#define SEC_TO_MS(sec) ((sec) * 1000)
|
|
||||||
/* Convert seconds to microseconds. */
|
|
||||||
#define SEC_TO_US(sec) ((sec) * 1000000)
|
|
||||||
/* Convert nanoseconds to milliseconds. */
|
|
||||||
#define NS_TO_MS(ns) ((ns) / 1000000)
|
|
||||||
/* Convert nanoseconds to microseconds. */
|
|
||||||
#define NS_TO_US(ns) ((ns) / 1000)
|
|
||||||
|
|
||||||
void *afl_memmem(const void *haystack, size_t haystacklen, const void *needle,
|
void *afl_memmem(const void *haystack, size_t haystacklen, const void *needle,
|
||||||
size_t needlelen) {
|
size_t needlelen) {
|
||||||
|
|
||||||
@ -108,9 +87,10 @@ void set_sanitizer_defaults() {
|
|||||||
u8 *have_lsan_options = getenv("LSAN_OPTIONS");
|
u8 *have_lsan_options = getenv("LSAN_OPTIONS");
|
||||||
u8 have_san_options = 0;
|
u8 have_san_options = 0;
|
||||||
u8 default_options[1024] =
|
u8 default_options[1024] =
|
||||||
"detect_odr_violation=0:abort_on_error=1:symbolize=0:allocator_may_"
|
"detect_odr_violation=0:abort_on_error=1:symbolize=0:"
|
||||||
"return_null=1:handle_segv=0:handle_sigbus=0:handle_abort=0:handle_"
|
"allocator_may_return_null=1:handle_segv=0:handle_sigbus=0:"
|
||||||
"sigfpe=0:handle_sigill=0:";
|
"handle_abort=0:handle_sigfpe=0:handle_sigill=0:"
|
||||||
|
"detect_stack_use_after_return=0:check_initialization_order=0:";
|
||||||
|
|
||||||
if (have_asan_options || have_ubsan_options || have_msan_options ||
|
if (have_asan_options || have_ubsan_options || have_msan_options ||
|
||||||
have_lsan_options) {
|
have_lsan_options) {
|
||||||
@ -506,7 +486,7 @@ u8 *find_afl_binary(u8 *own_loc, u8 *fname) {
|
|||||||
|
|
||||||
if ((tmp = strrchr(fname, '.'))) {
|
if ((tmp = strrchr(fname, '.'))) {
|
||||||
|
|
||||||
if (!strcasecmp(tmp, ".so") || !strcasecmp(tmp, ".dylib")) { perm = R_OK; }
|
if (!strcasecmp(tmp, ".bin") || !strcasecmp(tmp, ".so") || !strcasecmp(tmp, ".dylib")) { perm = R_OK; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -996,33 +976,25 @@ void read_bitmap(u8 *fname, u8 *map, size_t len) {
|
|||||||
|
|
||||||
inline u64 get_cur_time(void) {
|
inline u64 get_cur_time(void) {
|
||||||
|
|
||||||
struct timespec ts;
|
struct timeval tv;
|
||||||
int rc = clock_gettime(CLOCK_MONOTONIC_COARSE, &ts);
|
struct timezone tz;
|
||||||
if (rc == -1) {
|
|
||||||
|
|
||||||
PFATAL("Failed to obtain timestamp (errno = %i: %s)\n", errno,
|
gettimeofday(&tv, &tz);
|
||||||
strerror(errno));
|
|
||||||
|
|
||||||
}
|
return (tv.tv_sec * 1000ULL) + (tv.tv_usec / 1000);
|
||||||
|
|
||||||
return SEC_TO_MS((uint64_t)ts.tv_sec) + NS_TO_MS((uint64_t)ts.tv_nsec);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get unix time in microseconds */
|
/* Get unix time in microseconds */
|
||||||
|
|
||||||
u64 get_cur_time_us(void) {
|
inline u64 get_cur_time_us(void) {
|
||||||
|
|
||||||
struct timespec ts;
|
struct timeval tv;
|
||||||
int rc = clock_gettime(CLOCK_MONOTONIC_COARSE, &ts);
|
struct timezone tz;
|
||||||
if (rc == -1) {
|
|
||||||
|
|
||||||
PFATAL("Failed to obtain timestamp (errno = %i: %s)\n", errno,
|
gettimeofday(&tv, &tz);
|
||||||
strerror(errno));
|
|
||||||
|
|
||||||
}
|
return (tv.tv_sec * 1000000ULL) + tv.tv_usec;
|
||||||
|
|
||||||
return SEC_TO_US((uint64_t)ts.tv_sec) + NS_TO_US((uint64_t)ts.tv_nsec);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com> and
|
Andrea Fioraldi <andreafioraldi@gmail.com> and
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
@ -27,6 +27,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#ifdef AFL_PERSISTENT_RECORD
|
||||||
|
#include "afl-fuzz.h"
|
||||||
|
#endif
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
@ -575,7 +578,8 @@ void afl_fsrv_start(afl_forkserver_t *fsrv, char **argv,
|
|||||||
void *nyx_config = fsrv->nyx_handlers->nyx_config_load(fsrv->target_path);
|
void *nyx_config = fsrv->nyx_handlers->nyx_config_load(fsrv->target_path);
|
||||||
|
|
||||||
fsrv->nyx_handlers->nyx_config_set_workdir_path(nyx_config, workdir_path);
|
fsrv->nyx_handlers->nyx_config_set_workdir_path(nyx_config, workdir_path);
|
||||||
fsrv->nyx_handlers->nyx_config_set_input_buffer_size(nyx_config, MAX_FILE);
|
fsrv->nyx_handlers->nyx_config_set_input_buffer_size(nyx_config,
|
||||||
|
fsrv->max_length);
|
||||||
fsrv->nyx_handlers->nyx_config_set_input_buffer_write_protection(nyx_config,
|
fsrv->nyx_handlers->nyx_config_set_input_buffer_write_protection(nyx_config,
|
||||||
true);
|
true);
|
||||||
|
|
||||||
@ -2078,10 +2082,13 @@ store_persistent_record: {
|
|||||||
u32 len = fsrv->persistent_record_len[entry];
|
u32 len = fsrv->persistent_record_len[entry];
|
||||||
if (likely(len && data)) {
|
if (likely(len && data)) {
|
||||||
|
|
||||||
snprintf(fn, sizeof(fn), persistent_out_fmt, fsrv->persistent_record_dir,
|
snprintf(
|
||||||
fsrv->persistent_record_cnt, writecnt++,
|
fn, sizeof(fn), persistent_out_fmt, fsrv->persistent_record_dir,
|
||||||
afl->file_extension ? "." : "",
|
fsrv->persistent_record_cnt, writecnt++,
|
||||||
afl->file_extension ? (const char *)afl->file_extension : "");
|
((afl_state_t *)(fsrv->afl_ptr))->file_extension ? "." : "",
|
||||||
|
((afl_state_t *)(fsrv->afl_ptr))->file_extension
|
||||||
|
? (const char *)((afl_state_t *)(fsrv->afl_ptr))->file_extension
|
||||||
|
: "");
|
||||||
int fd = open(fn, O_CREAT | O_TRUNC | O_WRONLY, 0644);
|
int fd = open(fn, O_CREAT | O_TRUNC | O_WRONLY, 0644);
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
@ -527,12 +527,24 @@ save_if_interesting(afl_state_t *afl, void *mem, u32 len, u8 fault) {
|
|||||||
|
|
||||||
#ifndef SIMPLE_FILES
|
#ifndef SIMPLE_FILES
|
||||||
|
|
||||||
queue_fn = alloc_printf(
|
if (!afl->afl_env.afl_sha1_filenames) {
|
||||||
"%s/queue/id:%06u,%s%s%s", afl->out_dir, afl->queued_items,
|
|
||||||
describe_op(afl, new_bits + is_timeout,
|
queue_fn = alloc_printf(
|
||||||
NAME_MAX - strlen("id:000000,")),
|
"%s/queue/id:%06u,%s%s%s", afl->out_dir, afl->queued_items,
|
||||||
afl->file_extension ? "." : "",
|
describe_op(afl, new_bits + is_timeout,
|
||||||
afl->file_extension ? (const char *)afl->file_extension : "");
|
NAME_MAX - strlen("id:000000,")),
|
||||||
|
afl->file_extension ? "." : "",
|
||||||
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
const char *hex = sha1_hex(mem, len);
|
||||||
|
queue_fn = alloc_printf(
|
||||||
|
"%s/queue/%s%s%s", afl->out_dir, hex, afl->file_extension ? "." : "",
|
||||||
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
ck_free((char *)hex);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@ -542,10 +554,14 @@ save_if_interesting(afl_state_t *afl, void *mem, u32 len, u8 fault) {
|
|||||||
afl->file_extension ? (const char *)afl->file_extension : "");
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
|
||||||
#endif /* ^!SIMPLE_FILES */
|
#endif /* ^!SIMPLE_FILES */
|
||||||
fd = open(queue_fn, O_WRONLY | O_CREAT | O_EXCL, DEFAULT_PERMISSION);
|
fd = permissive_create(afl, queue_fn);
|
||||||
if (unlikely(fd < 0)) { PFATAL("Unable to create '%s'", queue_fn); }
|
if (likely(fd >= 0)) {
|
||||||
ck_write(fd, mem, len, queue_fn);
|
|
||||||
close(fd);
|
ck_write(fd, mem, len, queue_fn);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
add_to_queue(afl, queue_fn, len, 0);
|
add_to_queue(afl, queue_fn, len, 0);
|
||||||
|
|
||||||
if (unlikely(afl->fuzz_mode) &&
|
if (unlikely(afl->fuzz_mode) &&
|
||||||
@ -743,11 +759,23 @@ save_if_interesting(afl_state_t *afl, void *mem, u32 len, u8 fault) {
|
|||||||
|
|
||||||
#ifndef SIMPLE_FILES
|
#ifndef SIMPLE_FILES
|
||||||
|
|
||||||
snprintf(fn, PATH_MAX, "%s/hangs/id:%06llu,%s%s%s", afl->out_dir,
|
if (!afl->afl_env.afl_sha1_filenames) {
|
||||||
afl->saved_hangs,
|
|
||||||
describe_op(afl, 0, NAME_MAX - strlen("id:000000,")),
|
snprintf(fn, PATH_MAX, "%s/hangs/id:%06llu,%s%s%s", afl->out_dir,
|
||||||
afl->file_extension ? "." : "",
|
afl->saved_hangs,
|
||||||
afl->file_extension ? (const char *)afl->file_extension : "");
|
describe_op(afl, 0, NAME_MAX - strlen("id:000000,")),
|
||||||
|
afl->file_extension ? "." : "",
|
||||||
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
const char *hex = sha1_hex(mem, len);
|
||||||
|
snprintf(fn, PATH_MAX, "%s/hangs/%s%s%s", afl->out_dir, hex,
|
||||||
|
afl->file_extension ? "." : "",
|
||||||
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
ck_free((char *)hex);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@ -799,11 +827,23 @@ save_if_interesting(afl_state_t *afl, void *mem, u32 len, u8 fault) {
|
|||||||
|
|
||||||
#ifndef SIMPLE_FILES
|
#ifndef SIMPLE_FILES
|
||||||
|
|
||||||
snprintf(fn, PATH_MAX, "%s/crashes/id:%06llu,sig:%02u,%s%s%s",
|
if (!afl->afl_env.afl_sha1_filenames) {
|
||||||
afl->out_dir, afl->saved_crashes, afl->fsrv.last_kill_signal,
|
|
||||||
describe_op(afl, 0, NAME_MAX - strlen("id:000000,sig:00,")),
|
snprintf(fn, PATH_MAX, "%s/crashes/id:%06llu,sig:%02u,%s%s%s",
|
||||||
afl->file_extension ? "." : "",
|
afl->out_dir, afl->saved_crashes, afl->fsrv.last_kill_signal,
|
||||||
afl->file_extension ? (const char *)afl->file_extension : "");
|
describe_op(afl, 0, NAME_MAX - strlen("id:000000,sig:00,")),
|
||||||
|
afl->file_extension ? "." : "",
|
||||||
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
const char *hex = sha1_hex(mem, len);
|
||||||
|
snprintf(fn, PATH_MAX, "%s/crashes/%s%s%s", afl->out_dir, hex,
|
||||||
|
afl->file_extension ? "." : "",
|
||||||
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
ck_free((char *)hex);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@ -873,10 +913,13 @@ save_if_interesting(afl_state_t *afl, void *mem, u32 len, u8 fault) {
|
|||||||
/* If we're here, we apparently want to save the crash or hang
|
/* If we're here, we apparently want to save the crash or hang
|
||||||
test case, too. */
|
test case, too. */
|
||||||
|
|
||||||
fd = open(fn, O_WRONLY | O_CREAT | O_EXCL, DEFAULT_PERMISSION);
|
fd = permissive_create(afl, fn);
|
||||||
if (unlikely(fd < 0)) { PFATAL("Unable to create '%s'", fn); }
|
if (fd >= 0) {
|
||||||
ck_write(fd, mem, len, fn);
|
|
||||||
close(fd);
|
ck_write(fd, mem, len, fn);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if (afl->fsrv.nyx_mode && fault == FSRV_RUN_CRASH) {
|
if (afl->fsrv.nyx_mode && fault == FSRV_RUN_CRASH) {
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
||||||
|
|
||||||
Now maintained by by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
@ -459,6 +459,24 @@ void bind_to_free_cpu(afl_state_t *afl) {
|
|||||||
|
|
||||||
#endif /* HAVE_AFFINITY */
|
#endif /* HAVE_AFFINITY */
|
||||||
|
|
||||||
|
/* transforms spaces in a string to underscores (inplace) */
|
||||||
|
|
||||||
|
static void no_spaces(u8 *string) {
|
||||||
|
|
||||||
|
if (string) {
|
||||||
|
|
||||||
|
u8 *ptr = string;
|
||||||
|
while (*ptr != 0) {
|
||||||
|
|
||||||
|
if (*ptr == ' ') { *ptr = '_'; }
|
||||||
|
++ptr;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* Shuffle an array of pointers. Might be slightly biased. */
|
/* Shuffle an array of pointers. Might be slightly biased. */
|
||||||
|
|
||||||
static void shuffle_ptrs(afl_state_t *afl, void **ptrs, u32 cnt) {
|
static void shuffle_ptrs(afl_state_t *afl, void **ptrs, u32 cnt) {
|
||||||
@ -559,6 +577,8 @@ void read_foreign_testcases(afl_state_t *afl, int first) {
|
|||||||
afl->stage_cur = 0;
|
afl->stage_cur = 0;
|
||||||
afl->stage_max = 0;
|
afl->stage_max = 0;
|
||||||
|
|
||||||
|
show_stats(afl);
|
||||||
|
|
||||||
for (i = 0; i < (u32)nl_cnt; ++i) {
|
for (i = 0; i < (u32)nl_cnt; ++i) {
|
||||||
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
@ -637,7 +657,12 @@ void read_foreign_testcases(afl_state_t *afl, int first) {
|
|||||||
munmap(mem, st.st_size);
|
munmap(mem, st.st_size);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
if (st.st_mtime > mtime_max) mtime_max = st.st_mtime;
|
if (st.st_mtime > mtime_max) {
|
||||||
|
|
||||||
|
mtime_max = st.st_mtime;
|
||||||
|
show_stats(afl);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -914,6 +939,14 @@ void perform_dry_run(afl_state_t *afl) {
|
|||||||
|
|
||||||
res = calibrate_case(afl, q, use_mem, 0, 1);
|
res = calibrate_case(afl, q, use_mem, 0, 1);
|
||||||
|
|
||||||
|
/* For AFLFast schedules we update the queue entry */
|
||||||
|
if (unlikely(afl->schedule >= FAST && afl->schedule <= RARE) &&
|
||||||
|
likely(q->exec_cksum)) {
|
||||||
|
|
||||||
|
q->n_fuzz_entry = q->exec_cksum % N_FUZZ_SIZE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (afl->stop_soon) { return; }
|
if (afl->stop_soon) { return; }
|
||||||
|
|
||||||
if (res == afl->crash_mode || res == FSRV_RUN_NOBITS) {
|
if (res == afl->crash_mode || res == FSRV_RUN_NOBITS) {
|
||||||
@ -1157,14 +1190,27 @@ void perform_dry_run(afl_state_t *afl) {
|
|||||||
|
|
||||||
#ifndef SIMPLE_FILES
|
#ifndef SIMPLE_FILES
|
||||||
|
|
||||||
snprintf(
|
if (!afl->afl_env.afl_sha1_filenames) {
|
||||||
crash_fn, PATH_MAX, "%s/crashes/id:%06llu,sig:%02u,%s%s%s%s",
|
|
||||||
afl->out_dir, afl->saved_crashes, afl->fsrv.last_kill_signal,
|
snprintf(
|
||||||
describe_op(
|
crash_fn, PATH_MAX, "%s/crashes/id:%06llu,sig:%02u,%s%s%s%s",
|
||||||
afl, 0,
|
afl->out_dir, afl->saved_crashes, afl->fsrv.last_kill_signal,
|
||||||
NAME_MAX - strlen("id:000000,sig:00,") - strlen(use_name)),
|
describe_op(
|
||||||
use_name, afl->file_extension ? "." : "",
|
afl, 0,
|
||||||
afl->file_extension ? (const char *)afl->file_extension : "");
|
NAME_MAX - strlen("id:000000,sig:00,") - strlen(use_name)),
|
||||||
|
use_name, afl->file_extension ? "." : "",
|
||||||
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
const char *hex = sha1_hex(use_mem, read_len);
|
||||||
|
snprintf(
|
||||||
|
crash_fn, PATH_MAX, "%s/crashes/%s%s%s", afl->out_dir, hex,
|
||||||
|
afl->file_extension ? "." : "",
|
||||||
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
ck_free((char *)hex);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@ -1376,11 +1422,11 @@ void perform_dry_run(afl_state_t *afl) {
|
|||||||
static void link_or_copy(u8 *old_path, u8 *new_path) {
|
static void link_or_copy(u8 *old_path, u8 *new_path) {
|
||||||
|
|
||||||
s32 i = link(old_path, new_path);
|
s32 i = link(old_path, new_path);
|
||||||
|
if (!i) { return; }
|
||||||
|
|
||||||
s32 sfd, dfd;
|
s32 sfd, dfd;
|
||||||
u8 *tmp;
|
u8 *tmp;
|
||||||
|
|
||||||
if (!i) { return; }
|
|
||||||
|
|
||||||
sfd = open(old_path, O_RDONLY);
|
sfd = open(old_path, O_RDONLY);
|
||||||
if (sfd < 0) { PFATAL("Unable to open '%s'", old_path); }
|
if (sfd < 0) { PFATAL("Unable to open '%s'", old_path); }
|
||||||
|
|
||||||
@ -1485,10 +1531,26 @@ void pivot_inputs(afl_state_t *afl) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nfn = alloc_printf(
|
if (!afl->afl_env.afl_sha1_filenames) {
|
||||||
"%s/queue/id:%06u,time:0,execs:%llu,orig:%s%s%s", afl->out_dir, id,
|
|
||||||
afl->fsrv.total_execs, use_name, afl->file_extension ? "." : "",
|
nfn = alloc_printf(
|
||||||
afl->file_extension ? (const char *)afl->file_extension : "");
|
"%s/queue/id:%06u,time:0,execs:%llu,orig:%s%s%s", afl->out_dir, id,
|
||||||
|
afl->fsrv.total_execs, use_name, afl->file_extension ? "." : "",
|
||||||
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
const char *hex = sha1_hex_for_file(q->fname, q->len);
|
||||||
|
nfn = alloc_printf(
|
||||||
|
"%s/queue/%s%s%s", afl->out_dir, hex,
|
||||||
|
afl->file_extension ? "." : "",
|
||||||
|
afl->file_extension ? (const char *)afl->file_extension : "");
|
||||||
|
ck_free((char *)hex);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 *pos = strrchr(nfn, '/');
|
||||||
|
no_spaces(pos + 30);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@ -1702,10 +1764,11 @@ double get_runnable_processes(void) {
|
|||||||
|
|
||||||
void nuke_resume_dir(afl_state_t *afl) {
|
void nuke_resume_dir(afl_state_t *afl) {
|
||||||
|
|
||||||
u8 *fn;
|
u8 *const case_prefix = afl->afl_env.afl_sha1_filenames ? "" : CASE_PREFIX;
|
||||||
|
u8 *fn;
|
||||||
|
|
||||||
fn = alloc_printf("%s/_resume/.state/deterministic_done", afl->out_dir);
|
fn = alloc_printf("%s/_resume/.state/deterministic_done", afl->out_dir);
|
||||||
if (delete_files(fn, CASE_PREFIX)) { goto dir_cleanup_failed; }
|
if (delete_files(fn, case_prefix)) { goto dir_cleanup_failed; }
|
||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
fn = alloc_printf("%s/_resume/.state/auto_extras", afl->out_dir);
|
fn = alloc_printf("%s/_resume/.state/auto_extras", afl->out_dir);
|
||||||
@ -1713,11 +1776,11 @@ void nuke_resume_dir(afl_state_t *afl) {
|
|||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
fn = alloc_printf("%s/_resume/.state/redundant_edges", afl->out_dir);
|
fn = alloc_printf("%s/_resume/.state/redundant_edges", afl->out_dir);
|
||||||
if (delete_files(fn, CASE_PREFIX)) { goto dir_cleanup_failed; }
|
if (delete_files(fn, case_prefix)) { goto dir_cleanup_failed; }
|
||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
fn = alloc_printf("%s/_resume/.state/variable_behavior", afl->out_dir);
|
fn = alloc_printf("%s/_resume/.state/variable_behavior", afl->out_dir);
|
||||||
if (delete_files(fn, CASE_PREFIX)) { goto dir_cleanup_failed; }
|
if (delete_files(fn, case_prefix)) { goto dir_cleanup_failed; }
|
||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
fn = alloc_printf("%s/_resume/.state", afl->out_dir);
|
fn = alloc_printf("%s/_resume/.state", afl->out_dir);
|
||||||
@ -1725,7 +1788,7 @@ void nuke_resume_dir(afl_state_t *afl) {
|
|||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
fn = alloc_printf("%s/_resume", afl->out_dir);
|
fn = alloc_printf("%s/_resume", afl->out_dir);
|
||||||
if (delete_files(fn, CASE_PREFIX)) { goto dir_cleanup_failed; }
|
if (delete_files(fn, case_prefix)) { goto dir_cleanup_failed; }
|
||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -1742,8 +1805,9 @@ dir_cleanup_failed:
|
|||||||
|
|
||||||
static void handle_existing_out_dir(afl_state_t *afl) {
|
static void handle_existing_out_dir(afl_state_t *afl) {
|
||||||
|
|
||||||
FILE *f;
|
u8 *const case_prefix = afl->afl_env.afl_sha1_filenames ? "" : CASE_PREFIX;
|
||||||
u8 *fn = alloc_printf("%s/fuzzer_stats", afl->out_dir);
|
FILE *f;
|
||||||
|
u8 *fn = alloc_printf("%s/fuzzer_stats", afl->out_dir);
|
||||||
|
|
||||||
/* See if the output directory is locked. If yes, bail out. If not,
|
/* See if the output directory is locked. If yes, bail out. If not,
|
||||||
create a lock that will persist for the lifetime of the process
|
create a lock that will persist for the lifetime of the process
|
||||||
@ -1865,7 +1929,7 @@ static void handle_existing_out_dir(afl_state_t *afl) {
|
|||||||
/* Next, we need to clean up <afl->out_dir>/queue/.state/ subdirectories: */
|
/* Next, we need to clean up <afl->out_dir>/queue/.state/ subdirectories: */
|
||||||
|
|
||||||
fn = alloc_printf("%s/queue/.state/deterministic_done", afl->out_dir);
|
fn = alloc_printf("%s/queue/.state/deterministic_done", afl->out_dir);
|
||||||
if (delete_files(fn, CASE_PREFIX)) { goto dir_cleanup_failed; }
|
if (delete_files(fn, case_prefix)) { goto dir_cleanup_failed; }
|
||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
fn = alloc_printf("%s/queue/.state/auto_extras", afl->out_dir);
|
fn = alloc_printf("%s/queue/.state/auto_extras", afl->out_dir);
|
||||||
@ -1873,11 +1937,11 @@ static void handle_existing_out_dir(afl_state_t *afl) {
|
|||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
fn = alloc_printf("%s/queue/.state/redundant_edges", afl->out_dir);
|
fn = alloc_printf("%s/queue/.state/redundant_edges", afl->out_dir);
|
||||||
if (delete_files(fn, CASE_PREFIX)) { goto dir_cleanup_failed; }
|
if (delete_files(fn, case_prefix)) { goto dir_cleanup_failed; }
|
||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
fn = alloc_printf("%s/queue/.state/variable_behavior", afl->out_dir);
|
fn = alloc_printf("%s/queue/.state/variable_behavior", afl->out_dir);
|
||||||
if (delete_files(fn, CASE_PREFIX)) { goto dir_cleanup_failed; }
|
if (delete_files(fn, case_prefix)) { goto dir_cleanup_failed; }
|
||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
/* Then, get rid of the .state subdirectory itself (should be empty by now)
|
/* Then, get rid of the .state subdirectory itself (should be empty by now)
|
||||||
@ -1888,7 +1952,7 @@ static void handle_existing_out_dir(afl_state_t *afl) {
|
|||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
fn = alloc_printf("%s/queue", afl->out_dir);
|
fn = alloc_printf("%s/queue", afl->out_dir);
|
||||||
if (delete_files(fn, CASE_PREFIX)) { goto dir_cleanup_failed; }
|
if (delete_files(fn, case_prefix)) { goto dir_cleanup_failed; }
|
||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
/* All right, let's do <afl->out_dir>/crashes/id:* and
|
/* All right, let's do <afl->out_dir>/crashes/id:* and
|
||||||
@ -1935,7 +1999,7 @@ static void handle_existing_out_dir(afl_state_t *afl) {
|
|||||||
#ifdef AFL_PERSISTENT_RECORD
|
#ifdef AFL_PERSISTENT_RECORD
|
||||||
delete_files(fn, RECORD_PREFIX);
|
delete_files(fn, RECORD_PREFIX);
|
||||||
#endif
|
#endif
|
||||||
if (delete_files(fn, CASE_PREFIX)) { goto dir_cleanup_failed; }
|
if (delete_files(fn, case_prefix)) { goto dir_cleanup_failed; }
|
||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
fn = alloc_printf("%s/hangs", afl->out_dir);
|
fn = alloc_printf("%s/hangs", afl->out_dir);
|
||||||
@ -1970,7 +2034,7 @@ static void handle_existing_out_dir(afl_state_t *afl) {
|
|||||||
#ifdef AFL_PERSISTENT_RECORD
|
#ifdef AFL_PERSISTENT_RECORD
|
||||||
delete_files(fn, RECORD_PREFIX);
|
delete_files(fn, RECORD_PREFIX);
|
||||||
#endif
|
#endif
|
||||||
if (delete_files(fn, CASE_PREFIX)) { goto dir_cleanup_failed; }
|
if (delete_files(fn, case_prefix)) { goto dir_cleanup_failed; }
|
||||||
ck_free(fn);
|
ck_free(fn);
|
||||||
|
|
||||||
/* And now, for some finishing touches. */
|
/* And now, for some finishing touches. */
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Shengtuo Hu
|
Originally written by Shengtuo Hu
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
@ -26,6 +26,7 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <xgboost/c_api.h>
|
||||||
|
|
||||||
#ifdef _STANDALONE_MODULE
|
#ifdef _STANDALONE_MODULE
|
||||||
void minimize_bits(afl_state_t *afl, u8 *dst, u8 *src) {
|
void minimize_bits(afl_state_t *afl, u8 *dst, u8 *src) {
|
||||||
@ -117,7 +118,7 @@ void create_alias_table(afl_state_t *afl) {
|
|||||||
|
|
||||||
double avg_exec_us = 0.0;
|
double avg_exec_us = 0.0;
|
||||||
double avg_bitmap_size = 0.0;
|
double avg_bitmap_size = 0.0;
|
||||||
double avg_top_size = 0.0;
|
double avg_len = 0.0;
|
||||||
u32 active = 0;
|
u32 active = 0;
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
@ -128,8 +129,8 @@ void create_alias_table(afl_state_t *afl) {
|
|||||||
if (likely(!q->disabled)) {
|
if (likely(!q->disabled)) {
|
||||||
|
|
||||||
avg_exec_us += q->exec_us;
|
avg_exec_us += q->exec_us;
|
||||||
avg_bitmap_size += log(q->bitmap_size);
|
avg_bitmap_size += q->bitmap_size;
|
||||||
avg_top_size += q->tc_ref;
|
avg_len += q->len;
|
||||||
++active;
|
++active;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -138,7 +139,10 @@ void create_alias_table(afl_state_t *afl) {
|
|||||||
|
|
||||||
avg_exec_us /= active;
|
avg_exec_us /= active;
|
||||||
avg_bitmap_size /= active;
|
avg_bitmap_size /= active;
|
||||||
avg_top_size /= active;
|
avg_len /= active;
|
||||||
|
|
||||||
|
float *table = malloc((active + 1) * 3 * sizeof(float));
|
||||||
|
float *pentry = table;
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
|
|
||||||
@ -146,29 +150,52 @@ void create_alias_table(afl_state_t *afl) {
|
|||||||
|
|
||||||
if (likely(!q->disabled)) {
|
if (likely(!q->disabled)) {
|
||||||
|
|
||||||
q->weight =
|
*pentry++ = q->len / avg_len;
|
||||||
compute_weight(afl, q, avg_exec_us, avg_bitmap_size, avg_top_size);
|
*pentry++ = q->exec_us / avg_exec_us;
|
||||||
|
*pentry++ = q->bitmap_size / avg_bitmap_size;
|
||||||
q->perf_score = calculate_score(afl, q);
|
q->perf_score = calculate_score(afl, q);
|
||||||
sum += q->weight;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(afl->schedule == MMOPT) && afl->queued_discovered) {
|
DMatrixHandle dtest;
|
||||||
|
BoosterHandle booster;
|
||||||
|
|
||||||
u32 cnt = afl->queued_discovered >= 5 ? 5 : afl->queued_discovered;
|
// Erstellen einer DMatrix aus dem Array
|
||||||
|
XGDMatrixCreateFromMat((float *)table, 3, active, -1, &dtest);
|
||||||
|
XGBoosterCreate(&dtest, 1, &booster);
|
||||||
|
u8* model = NULL;//find_afl_binary("/out", "model.bin");
|
||||||
|
if (!model) model = find_afl_binary("./", "model.bin");
|
||||||
|
if (!model) FATAL("mode.bin not found!");
|
||||||
|
if (XGBoosterLoadModel(booster, "./model.bin"))
|
||||||
|
FATAL("model load failed!");
|
||||||
|
|
||||||
|
bst_ulong out_len;
|
||||||
|
const float *predictions;
|
||||||
|
XGBoosterPredict(booster, dtest, 0, 0, 0, &out_len, &predictions);
|
||||||
|
|
||||||
for (i = n - cnt; i < n; i++) {
|
// Ausgabe der Vorhersagen
|
||||||
|
int count = 0;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
|
||||||
struct queue_entry *q = afl->queue_buf[i];
|
struct queue_entry *q = afl->queue_buf[i];
|
||||||
|
|
||||||
if (likely(!q->disabled)) { q->weight *= 2.0; }
|
if (likely(!q->disabled)) {
|
||||||
|
if (unlikely(afl->debug))
|
||||||
|
fprintf(stderr, "Prediction[%u] = %f\n", i, predictions[count]);
|
||||||
|
afl->queue_buf[i]->weight = predictions[count++];
|
||||||
|
sum += predictions[count++];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Freigeben der Ressourcen
|
||||||
|
XGBoosterFree(booster);
|
||||||
|
XGDMatrixFree(dtest);
|
||||||
|
free(table);
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
|
|
||||||
// weight is always 0 for disabled entries
|
// weight is always 0 for disabled entries
|
||||||
@ -370,9 +397,9 @@ void mark_as_redundant(afl_state_t *afl, struct queue_entry *q, u8 state) {
|
|||||||
|
|
||||||
s32 fd;
|
s32 fd;
|
||||||
|
|
||||||
fd = open(fn, O_WRONLY | O_CREAT | O_EXCL, DEFAULT_PERMISSION);
|
if (unlikely(afl->afl_env.afl_disable_redundant)) { q->disabled = 1; }
|
||||||
if (fd < 0) { PFATAL("Unable to create '%s'", fn); }
|
fd = permissive_create(afl, fn);
|
||||||
close(fd);
|
if (fd >= 0) { close(fd); }
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -1301,7 +1328,8 @@ inline u8 *queue_testcase_get(afl_state_t *afl, struct queue_entry *q) {
|
|||||||
static u32 do_once = 0; // because even threaded we would want this. WIP
|
static u32 do_once = 0; // because even threaded we would want this. WIP
|
||||||
|
|
||||||
while (unlikely(
|
while (unlikely(
|
||||||
afl->q_testcase_cache_size + len >= afl->q_testcase_max_cache_size ||
|
(afl->q_testcase_cache_size + len >= afl->q_testcase_max_cache_size &&
|
||||||
|
afl->q_testcase_cache_count > 1) ||
|
||||||
afl->q_testcase_cache_count >= afl->q_testcase_max_cache_entries - 1)) {
|
afl->q_testcase_cache_count >= afl->q_testcase_max_cache_entries - 1)) {
|
||||||
|
|
||||||
/* We want a max number of entries to the cache that we learn.
|
/* We want a max number of entries to the cache that we learn.
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
||||||
|
|
||||||
Now maintained by by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
@ -2764,15 +2764,15 @@ static u8 rtn_fuzz(afl_state_t *afl, u32 key, u8 *orig_buf, u8 *buf, u8 *cbuf,
|
|||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
u32 j;
|
u32 j;
|
||||||
struct cmp_header *hh = &afl->orig_cmp_map->headers[key];
|
struct cmp_header *hh = &afl->orig_cmp_map->headers[key];
|
||||||
fprintf(stderr, "RTN N hits=%u id=%u shape=%u attr=%u v0=", h->hits, h->id,
|
fprintf(stderr, "RTN N hits=%u shape=%u attr=%u v0=", h->hits, hshape,
|
||||||
hshape, h->attribute);
|
h->attribute);
|
||||||
for (j = 0; j < 8; j++)
|
for (j = 0; j < 8; j++)
|
||||||
fprintf(stderr, "%02x", o->v0[j]);
|
fprintf(stderr, "%02x", o->v0[j]);
|
||||||
fprintf(stderr, " v1=");
|
fprintf(stderr, " v1=");
|
||||||
for (j = 0; j < 8; j++)
|
for (j = 0; j < 8; j++)
|
||||||
fprintf(stderr, "%02x", o->v1[j]);
|
fprintf(stderr, "%02x", o->v1[j]);
|
||||||
fprintf(stderr, "\nRTN O hits=%u id=%u shape=%u attr=%u o0=", hh->hits,
|
fprintf(stderr, "\nRTN O hits=%u shape=%u attr=%u o0=", hh->hits, hshape,
|
||||||
hh->id, hshape, hh->attribute);
|
hh->attribute);
|
||||||
for (j = 0; j < 8; j++)
|
for (j = 0; j < 8; j++)
|
||||||
fprintf(stderr, "%02x", orig_o->v0[j]);
|
fprintf(stderr, "%02x", orig_o->v0[j]);
|
||||||
fprintf(stderr, " o1=");
|
fprintf(stderr, " o1=");
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com> and
|
Andrea Fioraldi <andreafioraldi@gmail.com> and
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
@ -606,6 +606,8 @@ u8 calibrate_case(afl_state_t *afl, struct queue_entry *q, u8 *use_mem,
|
|||||||
}
|
}
|
||||||
|
|
||||||
q->exec_us = diff_us / afl->stage_max;
|
q->exec_us = diff_us / afl->stage_max;
|
||||||
|
if (unlikely(!q->exec_us)) { q->exec_us = 1; }
|
||||||
|
|
||||||
q->bitmap_size = count_bytes(afl, afl->fsrv.trace_bits);
|
q->bitmap_size = count_bytes(afl, afl->fsrv.trace_bits);
|
||||||
q->handicap = handicap;
|
q->handicap = handicap;
|
||||||
q->cal_failed = 0;
|
q->cal_failed = 0;
|
||||||
@ -771,6 +773,8 @@ void sync_fuzzers(afl_state_t *afl) {
|
|||||||
afl->stage_cur = 0;
|
afl->stage_cur = 0;
|
||||||
afl->stage_max = 0;
|
afl->stage_max = 0;
|
||||||
|
|
||||||
|
show_stats(afl);
|
||||||
|
|
||||||
/* For every file queued by this fuzzer, parse ID and see if we have
|
/* For every file queued by this fuzzer, parse ID and see if we have
|
||||||
looked at it before; exec a test case if not. */
|
looked at it before; exec a test case if not. */
|
||||||
|
|
||||||
@ -829,8 +833,8 @@ void sync_fuzzers(afl_state_t *afl) {
|
|||||||
if (afl->stop_soon) { goto close_sync; }
|
if (afl->stop_soon) { goto close_sync; }
|
||||||
|
|
||||||
afl->syncing_party = sd_ent->d_name;
|
afl->syncing_party = sd_ent->d_name;
|
||||||
afl->queued_imported +=
|
afl->queued_imported += save_if_interesting(afl, mem, new_len, fault);
|
||||||
save_if_interesting(afl, mem, new_len, fault);
|
show_stats(afl);
|
||||||
afl->syncing_party = 0;
|
afl->syncing_party = 0;
|
||||||
|
|
||||||
munmap(mem, st.st_size);
|
munmap(mem, st.st_size);
|
||||||
@ -1026,6 +1030,68 @@ u8 trim_case(afl_state_t *afl, struct queue_entry *q, u8 *in_buf) {
|
|||||||
|
|
||||||
if (needs_write) {
|
if (needs_write) {
|
||||||
|
|
||||||
|
// run afl_custom_post_process
|
||||||
|
|
||||||
|
if (unlikely(afl->custom_mutators_count) &&
|
||||||
|
likely(!afl->afl_env.afl_post_process_keep_original)) {
|
||||||
|
|
||||||
|
ssize_t new_size = q->len;
|
||||||
|
u8 *new_mem = in_buf;
|
||||||
|
u8 *new_buf = NULL;
|
||||||
|
|
||||||
|
LIST_FOREACH(&afl->custom_mutator_list, struct custom_mutator, {
|
||||||
|
|
||||||
|
if (el->afl_custom_post_process) {
|
||||||
|
|
||||||
|
new_size = el->afl_custom_post_process(el->data, new_mem, new_size,
|
||||||
|
&new_buf);
|
||||||
|
|
||||||
|
if (unlikely(!new_buf || new_size <= 0)) {
|
||||||
|
|
||||||
|
new_size = 0;
|
||||||
|
new_buf = new_mem;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
new_mem = new_buf;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
if (unlikely(!new_size)) {
|
||||||
|
|
||||||
|
new_size = q->len;
|
||||||
|
new_mem = in_buf;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unlikely(new_size < afl->min_length)) {
|
||||||
|
|
||||||
|
new_size = afl->min_length;
|
||||||
|
|
||||||
|
} else if (unlikely(new_size > afl->max_length)) {
|
||||||
|
|
||||||
|
new_size = afl->max_length;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
q->len = new_size;
|
||||||
|
|
||||||
|
if (new_mem != in_buf && new_mem != NULL) {
|
||||||
|
|
||||||
|
new_buf = afl_realloc(AFL_BUF_PARAM(out_scratch), new_size);
|
||||||
|
if (unlikely(!new_buf)) { PFATAL("alloc"); }
|
||||||
|
memcpy(new_buf, new_mem, new_size);
|
||||||
|
|
||||||
|
in_buf = new_buf;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
s32 fd;
|
s32 fd;
|
||||||
|
|
||||||
if (unlikely(afl->no_unlink)) {
|
if (unlikely(afl->no_unlink)) {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
@ -293,6 +293,16 @@ void read_afl_environment(afl_state_t *afl, char **envp) {
|
|||||||
afl->afl_env.afl_cmplog_only_new =
|
afl->afl_env.afl_cmplog_only_new =
|
||||||
get_afl_env(afl_environment_variables[i]) ? 1 : 0;
|
get_afl_env(afl_environment_variables[i]) ? 1 : 0;
|
||||||
|
|
||||||
|
} else if (!strncmp(env, "AFL_DISABLE_REDUNDANT",
|
||||||
|
|
||||||
|
afl_environment_variable_len) ||
|
||||||
|
!strncmp(env, "AFL_NO_REDUNDANT",
|
||||||
|
|
||||||
|
afl_environment_variable_len)) {
|
||||||
|
|
||||||
|
afl->afl_env.afl_disable_redundant =
|
||||||
|
get_afl_env(afl_environment_variables[i]) ? 1 : 0;
|
||||||
|
|
||||||
} else if (!strncmp(env, "AFL_NO_STARTUP_CALIBRATION",
|
} else if (!strncmp(env, "AFL_NO_STARTUP_CALIBRATION",
|
||||||
|
|
||||||
afl_environment_variable_len)) {
|
afl_environment_variable_len)) {
|
||||||
@ -619,6 +629,13 @@ void read_afl_environment(afl_state_t *afl, char **envp) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else if (!strncmp(env, "AFL_SHA1_FILENAMES",
|
||||||
|
|
||||||
|
afl_environment_variable_len)) {
|
||||||
|
|
||||||
|
afl->afl_env.afl_sha1_filenames =
|
||||||
|
get_afl_env(afl_environment_variables[i]) ? 1 : 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -5,8 +5,9 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Dominik Meier <mail@dmnk.co>,
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>, and
|
||||||
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
Copyright 2019-2024 AFLplusplus Project. All rights reserved.
|
Copyright 2019-2024 AFLplusplus Project. All rights reserved.
|
||||||
@ -320,8 +321,10 @@ void write_stats_file(afl_state_t *afl, u32 t_bytes, double bitmap_cvg,
|
|||||||
#ifndef __HAIKU__
|
#ifndef __HAIKU__
|
||||||
if (getrusage(RUSAGE_CHILDREN, &rus)) { rus.ru_maxrss = 0; }
|
if (getrusage(RUSAGE_CHILDREN, &rus)) { rus.ru_maxrss = 0; }
|
||||||
#endif
|
#endif
|
||||||
u64 runtime = afl->prev_run_time + cur_time - afl->start_time;
|
u64 runtime_ms = afl->prev_run_time + cur_time - afl->start_time;
|
||||||
if (!runtime) { runtime = 1; }
|
u64 overhead_ms =
|
||||||
|
(afl->calibration_time_us + afl->sync_time_us + afl->trim_time_us) / 1000;
|
||||||
|
if (!runtime_ms) { runtime_ms = 1; }
|
||||||
|
|
||||||
fprintf(
|
fprintf(
|
||||||
f,
|
f,
|
||||||
@ -374,20 +377,17 @@ void write_stats_file(afl_state_t *afl, u32 t_bytes, double bitmap_cvg,
|
|||||||
"target_mode : %s%s%s%s%s%s%s%s%s%s\n"
|
"target_mode : %s%s%s%s%s%s%s%s%s%s\n"
|
||||||
"command_line : %s\n",
|
"command_line : %s\n",
|
||||||
(afl->start_time /*- afl->prev_run_time*/) / 1000, cur_time / 1000,
|
(afl->start_time /*- afl->prev_run_time*/) / 1000, cur_time / 1000,
|
||||||
runtime / 1000, (u32)getpid(),
|
runtime_ms / 1000, (u32)getpid(),
|
||||||
afl->queue_cycle ? (afl->queue_cycle - 1) : 0, afl->cycles_wo_finds,
|
afl->queue_cycle ? (afl->queue_cycle - 1) : 0, afl->cycles_wo_finds,
|
||||||
afl->longest_find_time > cur_time - afl->last_find_time
|
afl->longest_find_time > cur_time - afl->last_find_time
|
||||||
? afl->longest_find_time / 1000
|
? afl->longest_find_time / 1000
|
||||||
: ((afl->start_time == 0 || afl->last_find_time == 0)
|
: ((afl->start_time == 0 || afl->last_find_time == 0)
|
||||||
? 0
|
? 0
|
||||||
: (cur_time - afl->last_find_time) / 1000),
|
: (cur_time - afl->last_find_time) / 1000),
|
||||||
(runtime -
|
(runtime_ms - MIN(runtime_ms, overhead_ms)) / 1000,
|
||||||
(afl->calibration_time_us + afl->sync_time_us + afl->trim_time_us) /
|
|
||||||
1000) /
|
|
||||||
1000,
|
|
||||||
afl->calibration_time_us / 1000000, afl->sync_time_us / 1000000,
|
afl->calibration_time_us / 1000000, afl->sync_time_us / 1000000,
|
||||||
afl->trim_time_us / 1000000, afl->fsrv.total_execs,
|
afl->trim_time_us / 1000000, afl->fsrv.total_execs,
|
||||||
afl->fsrv.total_execs / ((double)(runtime) / 1000),
|
afl->fsrv.total_execs / ((double)(runtime_ms) / 1000),
|
||||||
afl->last_avg_execs_saved, afl->queued_items, afl->queued_favored,
|
afl->last_avg_execs_saved, afl->queued_items, afl->queued_favored,
|
||||||
afl->queued_discovered, afl->queued_imported, afl->queued_variable,
|
afl->queued_discovered, afl->queued_imported, afl->queued_variable,
|
||||||
afl->max_depth, afl->current_entry, afl->pending_favored,
|
afl->max_depth, afl->current_entry, afl->pending_favored,
|
||||||
@ -631,9 +631,10 @@ void show_stats_normal(afl_state_t *afl) {
|
|||||||
|
|
||||||
cur_ms = get_cur_time();
|
cur_ms = get_cur_time();
|
||||||
|
|
||||||
if (afl->most_time_key) {
|
if (afl->most_time_key && afl->queue_cycle) {
|
||||||
|
|
||||||
if (afl->most_time * 1000 < cur_ms - afl->start_time) {
|
if (afl->most_time * 1000 + afl->sync_time_us / 1000 <
|
||||||
|
cur_ms - afl->start_time) {
|
||||||
|
|
||||||
afl->most_time_key = 2;
|
afl->most_time_key = 2;
|
||||||
afl->stop_soon = 2;
|
afl->stop_soon = 2;
|
||||||
@ -642,7 +643,7 @@ void show_stats_normal(afl_state_t *afl) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (afl->most_execs_key == 1) {
|
if (afl->most_execs_key == 1 && afl->queue_cycle) {
|
||||||
|
|
||||||
if (afl->most_execs <= afl->fsrv.total_execs) {
|
if (afl->most_execs <= afl->fsrv.total_execs) {
|
||||||
|
|
||||||
@ -1330,7 +1331,9 @@ void show_stats_normal(afl_state_t *afl) {
|
|||||||
|
|
||||||
sprintf(tmp, "disabled, ");
|
sprintf(tmp, "disabled, ");
|
||||||
|
|
||||||
} else if (unlikely(!afl->bytes_trim_out)) {
|
} else if (unlikely(!afl->bytes_trim_out ||
|
||||||
|
|
||||||
|
afl->bytes_trim_in <= afl->bytes_trim_out)) {
|
||||||
|
|
||||||
sprintf(tmp, "n/a, ");
|
sprintf(tmp, "n/a, ");
|
||||||
|
|
||||||
@ -1347,7 +1350,9 @@ void show_stats_normal(afl_state_t *afl) {
|
|||||||
|
|
||||||
strcat(tmp, "disabled");
|
strcat(tmp, "disabled");
|
||||||
|
|
||||||
} else if (unlikely(!afl->blocks_eff_total)) {
|
} else if (unlikely(!afl->blocks_eff_total ||
|
||||||
|
|
||||||
|
afl->blocks_eff_select >= afl->blocks_eff_total)) {
|
||||||
|
|
||||||
strcat(tmp, "n/a");
|
strcat(tmp, "n/a");
|
||||||
|
|
||||||
@ -1461,9 +1466,10 @@ void show_stats_pizza(afl_state_t *afl) {
|
|||||||
|
|
||||||
cur_ms = get_cur_time();
|
cur_ms = get_cur_time();
|
||||||
|
|
||||||
if (afl->most_time_key) {
|
if (afl->most_time_key && afl->queue_cycle) {
|
||||||
|
|
||||||
if (afl->most_time * 1000 < cur_ms - afl->start_time) {
|
if (afl->most_time * 1000 + afl->sync_time_us / 1000 <
|
||||||
|
cur_ms - afl->start_time) {
|
||||||
|
|
||||||
afl->most_time_key = 2;
|
afl->most_time_key = 2;
|
||||||
afl->stop_soon = 2;
|
afl->stop_soon = 2;
|
||||||
@ -1472,7 +1478,7 @@ void show_stats_pizza(afl_state_t *afl) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (afl->most_execs_key == 1) {
|
if (afl->most_execs_key == 1 && afl->queue_cycle) {
|
||||||
|
|
||||||
if (afl->most_execs <= afl->fsrv.total_execs) {
|
if (afl->most_execs <= afl->fsrv.total_execs) {
|
||||||
|
|
||||||
|
@ -264,6 +264,7 @@ static void usage(u8 *argv0, int more_help) {
|
|||||||
"AFL_CYCLE_SCHEDULES: after completing a cycle, switch to a different -p schedule\n"
|
"AFL_CYCLE_SCHEDULES: after completing a cycle, switch to a different -p schedule\n"
|
||||||
"AFL_DEBUG: extra debugging output for Python mode trimming\n"
|
"AFL_DEBUG: extra debugging output for Python mode trimming\n"
|
||||||
"AFL_DEBUG_CHILD: do not suppress stdout/stderr from target\n"
|
"AFL_DEBUG_CHILD: do not suppress stdout/stderr from target\n"
|
||||||
|
"AFL_DISABLE_REDUNDANT: disable any queue item that is redundant\n"
|
||||||
"AFL_DISABLE_TRIM: disable the trimming of test cases\n"
|
"AFL_DISABLE_TRIM: disable the trimming of test cases\n"
|
||||||
"AFL_DUMB_FORKSRV: use fork server without feedback from target\n"
|
"AFL_DUMB_FORKSRV: use fork server without feedback from target\n"
|
||||||
"AFL_EXIT_WHEN_DONE: exit when all inputs are run and no new finds are found\n"
|
"AFL_EXIT_WHEN_DONE: exit when all inputs are run and no new finds are found\n"
|
||||||
@ -1564,7 +1565,11 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
setenv("__AFL_OUT_DIR", afl->out_dir, 1);
|
setenv("__AFL_OUT_DIR", afl->out_dir, 1);
|
||||||
|
|
||||||
if (get_afl_env("AFL_DISABLE_TRIM")) { afl->disable_trim = 1; }
|
if (get_afl_env("AFL_DISABLE_TRIM") || get_afl_env("AFL_NO_TRIM")) {
|
||||||
|
|
||||||
|
afl->disable_trim = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (getenv("AFL_NO_UI") && getenv("AFL_FORCE_UI")) {
|
if (getenv("AFL_NO_UI") && getenv("AFL_FORCE_UI")) {
|
||||||
|
|
||||||
@ -1800,6 +1805,7 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
afl_realloc(AFL_BUF_PARAM(ex), min_alloc);
|
afl_realloc(AFL_BUF_PARAM(ex), min_alloc);
|
||||||
|
|
||||||
afl->fsrv.use_fauxsrv = afl->non_instrumented_mode == 1 || afl->no_forkserver;
|
afl->fsrv.use_fauxsrv = afl->non_instrumented_mode == 1 || afl->no_forkserver;
|
||||||
|
afl->fsrv.max_length = afl->max_length;
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if (!afl->fsrv.nyx_mode) {
|
if (!afl->fsrv.nyx_mode) {
|
||||||
@ -2588,13 +2594,6 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
sync_fuzzers(afl);
|
sync_fuzzers(afl);
|
||||||
|
|
||||||
if (!afl->queue_cycle && afl->afl_env.afl_import_first) {
|
|
||||||
|
|
||||||
// real start time, we reset, so this works correctly with -V
|
|
||||||
afl->start_time = get_cur_time();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
++afl->queue_cycle;
|
++afl->queue_cycle;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Originally written by Michal Zalewski
|
Originally written by Michal Zalewski
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
Written by Marc Heuse <mh@mh-sec.de> for AFL++
|
Written by Marc Heuse <mh@mh-sec.de> for AFL++
|
||||||
|
|
||||||
Maintained by Marc Heuse <mh@mh-sec.de>,
|
Maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de>
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de>
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
Dominik Maier <domenukk@gmail.com>
|
Dominik Maier <domenukk@gmail.com>
|
||||||
|
|
||||||
|
@ -95,3 +95,313 @@ inline u64 hash64(u8 *key, u32 len, u64 seed) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Public domain SHA1 implementation copied from:
|
||||||
|
// https://github.com/x42/liboauth/blob/7001b8256cd654952ec2515b055d2c5b243be600/src/sha1.c
|
||||||
|
|
||||||
|
/* This code is public-domain - it is based on libcrypt
|
||||||
|
* placed in the public domain by Wei Dai and other contributors.
|
||||||
|
*/
|
||||||
|
// gcc -Wall -DSHA1TEST -o sha1test sha1.c && ./sha1test
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef __BIG_ENDIAN__
|
||||||
|
#define SHA_BIG_ENDIAN
|
||||||
|
#elif defined __LITTLE_ENDIAN__
|
||||||
|
/* override */
|
||||||
|
#elif defined __BYTE_ORDER
|
||||||
|
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||||
|
#define SHA_BIG_ENDIAN
|
||||||
|
#endif
|
||||||
|
#else // ! defined __LITTLE_ENDIAN__
|
||||||
|
#include <endian.h> // machine/endian.h
|
||||||
|
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||||
|
#define SHA_BIG_ENDIAN
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
|
||||||
|
#define HASH_LENGTH 20
|
||||||
|
#define BLOCK_LENGTH 64
|
||||||
|
|
||||||
|
typedef struct sha1nfo {
|
||||||
|
|
||||||
|
uint32_t buffer[BLOCK_LENGTH / 4];
|
||||||
|
uint32_t state[HASH_LENGTH / 4];
|
||||||
|
uint32_t byteCount;
|
||||||
|
uint8_t bufferOffset;
|
||||||
|
uint8_t keyBuffer[BLOCK_LENGTH];
|
||||||
|
uint8_t innerHash[HASH_LENGTH];
|
||||||
|
|
||||||
|
} sha1nfo;
|
||||||
|
|
||||||
|
/* public API - prototypes - TODO: doxygen*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
void sha1_init(sha1nfo *s);
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
void sha1_writebyte(sha1nfo *s, uint8_t data);
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
void sha1_write(sha1nfo *s, const char *data, size_t len);
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
uint8_t *sha1_result(sha1nfo *s);
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
void sha1_initHmac(sha1nfo *s, const uint8_t *key, int keyLength);
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
uint8_t *sha1_resultHmac(sha1nfo *s);
|
||||||
|
|
||||||
|
/* code */
|
||||||
|
#define SHA1_K0 0x5a827999
|
||||||
|
#define SHA1_K20 0x6ed9eba1
|
||||||
|
#define SHA1_K40 0x8f1bbcdc
|
||||||
|
#define SHA1_K60 0xca62c1d6
|
||||||
|
|
||||||
|
void sha1_init(sha1nfo *s) {
|
||||||
|
|
||||||
|
s->state[0] = 0x67452301;
|
||||||
|
s->state[1] = 0xefcdab89;
|
||||||
|
s->state[2] = 0x98badcfe;
|
||||||
|
s->state[3] = 0x10325476;
|
||||||
|
s->state[4] = 0xc3d2e1f0;
|
||||||
|
s->byteCount = 0;
|
||||||
|
s->bufferOffset = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t sha1_rol32(uint32_t number, uint8_t bits) {
|
||||||
|
|
||||||
|
return ((number << bits) | (number >> (32 - bits)));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void sha1_hashBlock(sha1nfo *s) {
|
||||||
|
|
||||||
|
uint8_t i;
|
||||||
|
uint32_t a, b, c, d, e, t;
|
||||||
|
|
||||||
|
a = s->state[0];
|
||||||
|
b = s->state[1];
|
||||||
|
c = s->state[2];
|
||||||
|
d = s->state[3];
|
||||||
|
e = s->state[4];
|
||||||
|
for (i = 0; i < 80; i++) {
|
||||||
|
|
||||||
|
if (i >= 16) {
|
||||||
|
|
||||||
|
t = s->buffer[(i + 13) & 15] ^ s->buffer[(i + 8) & 15] ^
|
||||||
|
s->buffer[(i + 2) & 15] ^ s->buffer[i & 15];
|
||||||
|
s->buffer[i & 15] = sha1_rol32(t, 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < 20) {
|
||||||
|
|
||||||
|
t = (d ^ (b & (c ^ d))) + SHA1_K0;
|
||||||
|
|
||||||
|
} else if (i < 40) {
|
||||||
|
|
||||||
|
t = (b ^ c ^ d) + SHA1_K20;
|
||||||
|
|
||||||
|
} else if (i < 60) {
|
||||||
|
|
||||||
|
t = ((b & c) | (d & (b | c))) + SHA1_K40;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
t = (b ^ c ^ d) + SHA1_K60;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
t += sha1_rol32(a, 5) + e + s->buffer[i & 15];
|
||||||
|
e = d;
|
||||||
|
d = c;
|
||||||
|
c = sha1_rol32(b, 30);
|
||||||
|
b = a;
|
||||||
|
a = t;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
s->state[0] += a;
|
||||||
|
s->state[1] += b;
|
||||||
|
s->state[2] += c;
|
||||||
|
s->state[3] += d;
|
||||||
|
s->state[4] += e;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void sha1_addUncounted(sha1nfo *s, uint8_t data) {
|
||||||
|
|
||||||
|
uint8_t *const b = (uint8_t *)s->buffer;
|
||||||
|
#ifdef SHA_BIG_ENDIAN
|
||||||
|
b[s->bufferOffset] = data;
|
||||||
|
#else
|
||||||
|
b[s->bufferOffset ^ 3] = data;
|
||||||
|
#endif
|
||||||
|
s->bufferOffset++;
|
||||||
|
if (s->bufferOffset == BLOCK_LENGTH) {
|
||||||
|
|
||||||
|
sha1_hashBlock(s);
|
||||||
|
s->bufferOffset = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void sha1_writebyte(sha1nfo *s, uint8_t data) {
|
||||||
|
|
||||||
|
++s->byteCount;
|
||||||
|
sha1_addUncounted(s, data);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void sha1_write(sha1nfo *s, const char *data, size_t len) {
|
||||||
|
|
||||||
|
for (; len--;)
|
||||||
|
sha1_writebyte(s, (uint8_t)*data++);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void sha1_pad(sha1nfo *s) {
|
||||||
|
|
||||||
|
// Implement SHA-1 padding (fips180-2 §5.1.1)
|
||||||
|
|
||||||
|
// Pad with 0x80 followed by 0x00 until the end of the block
|
||||||
|
sha1_addUncounted(s, 0x80);
|
||||||
|
while (s->bufferOffset != 56)
|
||||||
|
sha1_addUncounted(s, 0x00);
|
||||||
|
|
||||||
|
// Append length in the last 8 bytes
|
||||||
|
sha1_addUncounted(s, 0); // We're only using 32 bit lengths
|
||||||
|
sha1_addUncounted(s, 0); // But SHA-1 supports 64 bit lengths
|
||||||
|
sha1_addUncounted(s, 0); // So zero pad the top bits
|
||||||
|
sha1_addUncounted(s, s->byteCount >> 29); // Shifting to multiply by 8
|
||||||
|
sha1_addUncounted(
|
||||||
|
s, s->byteCount >> 21); // as SHA-1 supports bitstreams as well as
|
||||||
|
sha1_addUncounted(s, s->byteCount >> 13); // byte.
|
||||||
|
sha1_addUncounted(s, s->byteCount >> 5);
|
||||||
|
sha1_addUncounted(s, s->byteCount << 3);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *sha1_result(sha1nfo *s) {
|
||||||
|
|
||||||
|
// Pad to complete the last block
|
||||||
|
sha1_pad(s);
|
||||||
|
|
||||||
|
#ifndef SHA_BIG_ENDIAN
|
||||||
|
// Swap byte order back
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 5; i++) {
|
||||||
|
|
||||||
|
s->state[i] = (((s->state[i]) << 24) & 0xff000000) |
|
||||||
|
(((s->state[i]) << 8) & 0x00ff0000) |
|
||||||
|
(((s->state[i]) >> 8) & 0x0000ff00) |
|
||||||
|
(((s->state[i]) >> 24) & 0x000000ff);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Return pointer to hash (20 characters)
|
||||||
|
return (uint8_t *)s->state;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#define HMAC_IPAD 0x36
|
||||||
|
#define HMAC_OPAD 0x5c
|
||||||
|
|
||||||
|
void sha1_initHmac(sha1nfo *s, const uint8_t *key, int keyLength) {
|
||||||
|
|
||||||
|
uint8_t i;
|
||||||
|
memset(s->keyBuffer, 0, BLOCK_LENGTH);
|
||||||
|
if (keyLength > BLOCK_LENGTH) {
|
||||||
|
|
||||||
|
// Hash long keys
|
||||||
|
sha1_init(s);
|
||||||
|
for (; keyLength--;)
|
||||||
|
sha1_writebyte(s, *key++);
|
||||||
|
memcpy(s->keyBuffer, sha1_result(s), HASH_LENGTH);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Block length keys are used as is
|
||||||
|
memcpy(s->keyBuffer, key, keyLength);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start inner hash
|
||||||
|
sha1_init(s);
|
||||||
|
for (i = 0; i < BLOCK_LENGTH; i++) {
|
||||||
|
|
||||||
|
sha1_writebyte(s, s->keyBuffer[i] ^ HMAC_IPAD);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *sha1_resultHmac(sha1nfo *s) {
|
||||||
|
|
||||||
|
uint8_t i;
|
||||||
|
// Complete inner hash
|
||||||
|
memcpy(s->innerHash, sha1_result(s), HASH_LENGTH);
|
||||||
|
// Calculate outer hash
|
||||||
|
sha1_init(s);
|
||||||
|
for (i = 0; i < BLOCK_LENGTH; i++)
|
||||||
|
sha1_writebyte(s, s->keyBuffer[i] ^ HMAC_OPAD);
|
||||||
|
for (i = 0; i < HASH_LENGTH; i++)
|
||||||
|
sha1_writebyte(s, s->innerHash[i]);
|
||||||
|
return sha1_result(s);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// End public domain SHA1 implementation
|
||||||
|
|
||||||
|
void sha1(const u8 *data, size_t len, u8 *out) {
|
||||||
|
|
||||||
|
sha1nfo s;
|
||||||
|
sha1_init(&s);
|
||||||
|
sha1_write(&s, (const char *)data, len);
|
||||||
|
memcpy(out, sha1_result(&s), HASH_LENGTH);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
char *sha1_hex(const u8 *data, size_t len) {
|
||||||
|
|
||||||
|
u8 digest[HASH_LENGTH];
|
||||||
|
sha1(data, len, digest);
|
||||||
|
u8 *hex = ck_alloc(HASH_LENGTH * 2 + 1);
|
||||||
|
for (size_t i = 0; i < HASH_LENGTH; ++i) {
|
||||||
|
|
||||||
|
sprintf((char *)(hex + i * 2), "%02x", digest[i]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return hex;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
char *sha1_hex_for_file(const char *fname, u32 len) {
|
||||||
|
|
||||||
|
int fd = open(fname, O_RDONLY);
|
||||||
|
if (fd < 0) { PFATAL("Unable to open '%s'", fname); }
|
||||||
|
|
||||||
|
u32 read_len = MIN(len, (u32)MAX_FILE);
|
||||||
|
u8 *tmp = ck_alloc(read_len);
|
||||||
|
ck_read(fd, tmp, read_len, fname);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
char *hex = sha1_hex(tmp, read_len);
|
||||||
|
ck_free(tmp);
|
||||||
|
return hex;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com>
|
Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
|
|
||||||
Copyright 2016, 2017 Google Inc. All rights reserved.
|
Copyright 2016, 2017 Google Inc. All rights reserved.
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com> and
|
Andrea Fioraldi <andreafioraldi@gmail.com> and
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
@ -178,7 +178,8 @@ fsrv_run_result_t fuzz_run_target(afl_state_t *afl, afl_forkserver_t *fsrv,
|
|||||||
void classify_counts(afl_forkserver_t *fsrv) {
|
void classify_counts(afl_forkserver_t *fsrv) {
|
||||||
|
|
||||||
u8 *mem = fsrv->trace_bits;
|
u8 *mem = fsrv->trace_bits;
|
||||||
const u8 *map = binary_mode ? count_class_binary : count_class_human;
|
const u8 *map = (binary_mode || collect_coverage) ? count_class_binary
|
||||||
|
: count_class_human;
|
||||||
|
|
||||||
u32 i = map_size;
|
u32 i = map_size;
|
||||||
|
|
||||||
@ -224,8 +225,13 @@ static void at_exit_handler(void) {
|
|||||||
|
|
||||||
if (remove_shm) {
|
if (remove_shm) {
|
||||||
|
|
||||||
|
remove_shm = false;
|
||||||
if (shm.map) afl_shm_deinit(&shm);
|
if (shm.map) afl_shm_deinit(&shm);
|
||||||
if (fsrv->use_shmem_fuzz) deinit_shmem(fsrv, shm_fuzz);
|
if ((shm_fuzz && shm_fuzz->shmemfuzz_mode) || fsrv->use_shmem_fuzz) {
|
||||||
|
|
||||||
|
shm_fuzz = deinit_shmem(fsrv, shm_fuzz);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,14 +246,7 @@ static void analyze_results(afl_forkserver_t *fsrv) {
|
|||||||
u32 i;
|
u32 i;
|
||||||
for (i = 0; i < map_size; i++) {
|
for (i = 0; i < map_size; i++) {
|
||||||
|
|
||||||
if (fsrv->trace_bits[i]) {
|
if (fsrv->trace_bits[i]) { coverage_map[i] |= fsrv->trace_bits[i]; }
|
||||||
|
|
||||||
total += fsrv->trace_bits[i];
|
|
||||||
if (fsrv->trace_bits[i] > highest) highest = fsrv->trace_bits[i];
|
|
||||||
// if (!coverage_map[i]) { coverage_map[i] = 1; }
|
|
||||||
coverage_map[i] |= fsrv->trace_bits[i];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1339,6 +1338,8 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (collect_coverage) { binary_mode = false; } // ensure this
|
||||||
|
|
||||||
if (optind == argc || !out_file) { usage(argv[0]); }
|
if (optind == argc || !out_file) { usage(argv[0]); }
|
||||||
|
|
||||||
if (in_dir && in_filelist) { FATAL("you can only specify either -i or -I"); }
|
if (in_dir && in_filelist) { FATAL("you can only specify either -i or -I"); }
|
||||||
@ -1531,6 +1532,8 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
/* initialize cmplog_mode */
|
/* initialize cmplog_mode */
|
||||||
shm_fuzz->cmplog_mode = 0;
|
shm_fuzz->cmplog_mode = 0;
|
||||||
|
atexit(at_exit_handler);
|
||||||
|
|
||||||
u8 *map = afl_shm_init(shm_fuzz, MAX_FILE + sizeof(u32), 1);
|
u8 *map = afl_shm_init(shm_fuzz, MAX_FILE + sizeof(u32), 1);
|
||||||
shm_fuzz->shmemfuzz_mode = true;
|
shm_fuzz->shmemfuzz_mode = true;
|
||||||
if (!map) { FATAL("BUG: Zero return from afl_shm_init."); }
|
if (!map) { FATAL("BUG: Zero return from afl_shm_init."); }
|
||||||
@ -1677,12 +1680,9 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
if ((coverage_map = (u8 *)malloc(map_size + 64)) == NULL)
|
if ((coverage_map = (u8 *)malloc(map_size + 64)) == NULL)
|
||||||
FATAL("coult not grab memory");
|
FATAL("coult not grab memory");
|
||||||
edges_only = false;
|
edges_only = false;
|
||||||
raw_instr_output = true;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
atexit(at_exit_handler);
|
|
||||||
|
|
||||||
if (get_afl_env("AFL_DEBUG")) {
|
if (get_afl_env("AFL_DEBUG")) {
|
||||||
|
|
||||||
int j = optind;
|
int j = optind;
|
||||||
@ -1699,9 +1699,12 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
map_size = fsrv->map_size;
|
map_size = fsrv->map_size;
|
||||||
|
|
||||||
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 (in_dir) {
|
if (in_dir) {
|
||||||
|
|
||||||
if (execute_testcases(in_dir) == 0) {
|
if (execute_testcases(in_dir) == 0) {
|
||||||
@ -1733,9 +1736,12 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if (!fsrv->nyx_mode) {
|
if (!fsrv->nyx_mode) {
|
||||||
|
|
||||||
@ -1782,9 +1788,9 @@ int main(int argc, char **argv_orig, char **envp) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
remove_shm = 0;
|
remove_shm = false;
|
||||||
afl_shm_deinit(&shm);
|
afl_shm_deinit(&shm);
|
||||||
if (fsrv->use_shmem_fuzz) shm_fuzz = deinit_shmem(fsrv, shm_fuzz);
|
if (fsrv->use_shmem_fuzz) { shm_fuzz = deinit_shmem(fsrv, shm_fuzz); }
|
||||||
|
|
||||||
u32 ret;
|
u32 ret;
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
Forkserver design by Jann Horn <jannhorn@googlemail.com>
|
||||||
|
|
||||||
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
Now maintained by Marc Heuse <mh@mh-sec.de>,
|
||||||
Heiko Eißfeldt <heiko.eissfeldt@hexco.de> and
|
Heiko Eissfeldt <heiko.eissfeldt@hexco.de> and
|
||||||
Andrea Fioraldi <andreafioraldi@gmail.com> and
|
Andrea Fioraldi <andreafioraldi@gmail.com> and
|
||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
|
|
||||||
|
@ -10,12 +10,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t i) {
|
|||||||
|
|
||||||
if (i < 15) return -1;
|
if (i < 15) return -1;
|
||||||
if (buf[0] != 'A') return 0;
|
if (buf[0] != 'A') return 0;
|
||||||
if (buf[1] != 'B') return 0;
|
int *icmp = (int *)(buf + 1);
|
||||||
if (buf[2] != 'C') return 0;
|
|
||||||
if (buf[3] != 'D') return 0;
|
|
||||||
int *icmp = (int *)(buf + 4);
|
|
||||||
if (*icmp != 0x69694141) return 0;
|
if (*icmp != 0x69694141) return 0;
|
||||||
if (memcmp(buf + 8, "1234EF", 6) == 0) abort();
|
if (memcmp(buf + 5, "1234EF", 6) == 0) abort();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,8 @@ test -e ../afl-clang-fast -a -e ../split-switches-pass.so && {
|
|||||||
for I in char short int long "long long"; do
|
for I in char short int long "long long"; do
|
||||||
for BITS in 8 16 32 64; do
|
for BITS in 8 16 32 64; do
|
||||||
bin="$testcase-split-$I-$BITS.compcov"
|
bin="$testcase-split-$I-$BITS.compcov"
|
||||||
AFL_LLVM_INSTRUMENT=AFL AFL_DEBUG=1 AFL_LLVM_LAF_SPLIT_COMPARES_BITW=$BITS AFL_LLVM_LAF_SPLIT_COMPARES=1 ../afl-clang-fast -fsigned-char -DINT_TYPE="$I" -o "$bin" "$testcase" > test.out 2>&1;
|
#AFL_LLVM_INSTRUMENT=AFL
|
||||||
|
AFL_DEBUG=1 AFL_LLVM_LAF_SPLIT_COMPARES_BITW=$BITS AFL_LLVM_LAF_SPLIT_COMPARES=1 ../afl-clang-fast -fsigned-char -DINT_TYPE="$I" -o "$bin" "$testcase" > test.out 2>&1;
|
||||||
if ! test -e "$bin"; then
|
if ! test -e "$bin"; then
|
||||||
cat test.out
|
cat test.out
|
||||||
$ECHO "$RED[!] llvm_mode laf-intel/compcov integer splitting failed! ($testcase with type $I split to $BITS)!";
|
$ECHO "$RED[!] llvm_mode laf-intel/compcov integer splitting failed! ($testcase with type $I split to $BITS)!";
|
||||||
@ -263,13 +264,12 @@ test -e ../afl-clang-fast -a -e ../split-switches-pass.so && {
|
|||||||
}
|
}
|
||||||
rm -f test-compcov test.out instrumentlist.txt
|
rm -f test-compcov test.out instrumentlist.txt
|
||||||
AFL_LLVM_CMPLOG=1 ../afl-clang-fast -o test-cmplog test-cmplog.c > /dev/null 2>&1
|
AFL_LLVM_CMPLOG=1 ../afl-clang-fast -o test-cmplog test-cmplog.c > /dev/null 2>&1
|
||||||
../afl-clang-fast -O0 -o test-c test-cmplog.c > /dev/null 2>&1
|
|
||||||
test -e test-cmplog && {
|
test -e test-cmplog && {
|
||||||
$ECHO "$GREY[*] running afl-fuzz for llvm_mode cmplog, this will take approx 10 seconds"
|
$ECHO "$GREY[*] running afl-fuzz for llvm_mode cmplog, this will take approx 10 seconds"
|
||||||
{
|
{
|
||||||
mkdir -p in
|
mkdir -p in
|
||||||
echo 00000000000000000000000000000000 > in/in
|
echo 00000000000000000000000000000000 > in/in
|
||||||
AFL_BENCH_UNTIL_CRASH=1 ../afl-fuzz -l 3 -m none -V30 -i in -o out -c ./test-cmplog -- ./test-c >>errors 2>&1
|
AFL_BENCH_UNTIL_CRASH=1 ../afl-fuzz -Z -l 3 -m none -V30 -i in -o out -c 0 -- ./test-cmplog >>errors 2>&1
|
||||||
} >>errors 2>&1
|
} >>errors 2>&1
|
||||||
test -n "$( ls out/default/crashes/id:000000* out/default/hangs/id:000000* 2>/dev/null )" && {
|
test -n "$( ls out/default/crashes/id:000000* out/default/hangs/id:000000* 2>/dev/null )" && {
|
||||||
$ECHO "$GREEN[+] afl-fuzz is working correctly with llvm_mode cmplog"
|
$ECHO "$GREEN[+] afl-fuzz is working correctly with llvm_mode cmplog"
|
||||||
@ -284,7 +284,7 @@ test -e ../afl-clang-fast -a -e ../split-switches-pass.so && {
|
|||||||
$ECHO "$YELLOW[-] we cannot test llvm_mode cmplog because it is not present"
|
$ECHO "$YELLOW[-] we cannot test llvm_mode cmplog because it is not present"
|
||||||
INCOMPLETE=1
|
INCOMPLETE=1
|
||||||
}
|
}
|
||||||
rm -rf errors test-cmplog test-c in core.*
|
rm -rf errors test-cmplog in core.*
|
||||||
../afl-clang-fast -o test-persistent ../utils/persistent_mode/persistent_demo.c > /dev/null 2>&1
|
../afl-clang-fast -o test-persistent ../utils/persistent_mode/persistent_demo.c > /dev/null 2>&1
|
||||||
test -e test-persistent && {
|
test -e test-persistent && {
|
||||||
echo foo | AFL_QUIET=1 ../afl-showmap -m ${MEM_LIMIT} -o /dev/null -q -r ./test-persistent && {
|
echo foo | AFL_QUIET=1 ../afl-showmap -m ${MEM_LIMIT} -o /dev/null -q -r ./test-persistent && {
|
||||||
|
@ -1 +1 @@
|
|||||||
63aab0f
|
4b4fdab1
|
||||||
|
@ -136,7 +136,7 @@ def overlap_alignments(segments, memory):
|
|||||||
|
|
||||||
# https://github.com/llvm-mirror/llvm/blob/master/include/llvm/ADT/Triple.h
|
# https://github.com/llvm-mirror/llvm/blob/master/include/llvm/ADT/Triple.h
|
||||||
def get_arch():
|
def get_arch():
|
||||||
arch, arch_vendor, arch_os = lldb.target.GetTriple().split("-")
|
arch, arch_vendor, arch_os, *arch_remains = lldb.debugger.GetSelectedTarget().GetTriple().split("-")
|
||||||
if arch == "x86_64":
|
if arch == "x86_64":
|
||||||
return "x64"
|
return "x64"
|
||||||
elif arch == "x86" or arch == "i386":
|
elif arch == "x86" or arch == "i386":
|
||||||
@ -165,7 +165,7 @@ def dump_arch_info():
|
|||||||
|
|
||||||
def dump_regs():
|
def dump_regs():
|
||||||
reg_state = {}
|
reg_state = {}
|
||||||
for reg_list in lldb.frame.GetRegisters():
|
for reg_list in lldb.debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().GetRegisters():
|
||||||
if "general purpose registers" in reg_list.GetName().lower():
|
if "general purpose registers" in reg_list.GetName().lower():
|
||||||
for reg in reg_list:
|
for reg in reg_list:
|
||||||
reg_state[reg.GetName()] = int(reg.GetValue(), 16)
|
reg_state[reg.GetName()] = int(reg.GetValue(), 16)
|
||||||
@ -180,8 +180,9 @@ def get_section_info(sec):
|
|||||||
module_name = sec.addr.module.file.GetFilename()
|
module_name = sec.addr.module.file.GetFilename()
|
||||||
module_name = module_name if module_name is not None else ""
|
module_name = module_name if module_name is not None else ""
|
||||||
long_name = module_name + "." + name
|
long_name = module_name + "." + name
|
||||||
|
load_addr = sec.addr.GetLoadAddress(lldb.debugger.GetSelectedTarget())
|
||||||
|
|
||||||
return sec.addr.load_addr, (sec.addr.load_addr + sec.size), sec.size, long_name
|
return load_addr, (load_addr + sec.size), sec.size, long_name
|
||||||
|
|
||||||
|
|
||||||
def dump_process_memory(output_dir):
|
def dump_process_memory(output_dir):
|
||||||
@ -191,7 +192,7 @@ def dump_process_memory(output_dir):
|
|||||||
|
|
||||||
# 1st pass:
|
# 1st pass:
|
||||||
# Loop over the segments, fill in the segment info dictionary
|
# Loop over the segments, fill in the segment info dictionary
|
||||||
for module in lldb.target.module_iter():
|
for module in lldb.debugger.GetSelectedTarget().module_iter():
|
||||||
for seg_ea in module.section_iter():
|
for seg_ea in module.section_iter():
|
||||||
seg_info = {"module": module.file.GetFilename()}
|
seg_info = {"module": module.file.GetFilename()}
|
||||||
(
|
(
|
||||||
@ -201,8 +202,8 @@ def dump_process_memory(output_dir):
|
|||||||
seg_info["name"],
|
seg_info["name"],
|
||||||
) = get_section_info(seg_ea)
|
) = get_section_info(seg_ea)
|
||||||
# TODO: Ugly hack for -1 LONG address on 32-bit
|
# TODO: Ugly hack for -1 LONG address on 32-bit
|
||||||
if seg_info["start"] >= sys.maxint or seg_size <= 0:
|
if seg_info["start"] >= sys.maxsize or seg_size <= 0:
|
||||||
print "Throwing away page: {}".format(seg_info["name"])
|
print ("Throwing away page: {}".format(seg_info["name"]))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Page-align segment
|
# Page-align segment
|
||||||
@ -212,7 +213,7 @@ def dump_process_memory(output_dir):
|
|||||||
raw_segment_list.append(seg_info)
|
raw_segment_list.append(seg_info)
|
||||||
|
|
||||||
# Add the stack memory region (just hardcode 0x1000 around the current SP)
|
# Add the stack memory region (just hardcode 0x1000 around the current SP)
|
||||||
sp = lldb.frame.GetSP()
|
sp = lldb.debugger.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().GetSP()
|
||||||
start_sp = ALIGN_PAGE_DOWN(sp)
|
start_sp = ALIGN_PAGE_DOWN(sp)
|
||||||
raw_segment_list.append(
|
raw_segment_list.append(
|
||||||
{"start": start_sp, "end": start_sp + 0x1000, "name": "STACK"}
|
{"start": start_sp, "end": start_sp + 0x1000, "name": "STACK"}
|
||||||
@ -228,7 +229,7 @@ def dump_process_memory(output_dir):
|
|||||||
start_addr = -1
|
start_addr = -1
|
||||||
next_region_addr = 0
|
next_region_addr = 0
|
||||||
while next_region_addr > start_addr:
|
while next_region_addr > start_addr:
|
||||||
err = lldb.process.GetMemoryRegionInfo(next_region_addr, mem_info)
|
err = lldb.debugger.GetSelectedTarget().GetProcess().GetMemoryRegionInfo(next_region_addr, mem_info)
|
||||||
# TODO: Should check err.success. If False, what do we do?
|
# TODO: Should check err.success. If False, what do we do?
|
||||||
if not err.success:
|
if not err.success:
|
||||||
break
|
break
|
||||||
@ -267,7 +268,7 @@ def dump_process_memory(output_dir):
|
|||||||
region_name = seg_info["name"]
|
region_name = seg_info["name"]
|
||||||
# Compress and dump the content to a file
|
# Compress and dump the content to a file
|
||||||
err = lldb.SBError()
|
err = lldb.SBError()
|
||||||
seg_content = lldb.process.ReadMemory(
|
seg_content = lldb.debugger.GetSelectedTarget().GetProcess().ReadMemory(
|
||||||
start_addr, end_addr - start_addr, err
|
start_addr, end_addr - start_addr, err
|
||||||
)
|
)
|
||||||
if seg_content == None:
|
if seg_content == None:
|
||||||
@ -340,11 +341,12 @@ def main():
|
|||||||
index_file.close()
|
index_file.close()
|
||||||
print ("Done.")
|
print ("Done.")
|
||||||
|
|
||||||
except Exception, e:
|
except Exception as e:
|
||||||
print ("!!! ERROR:\n\t{}".format(repr(e)))
|
print ("!!! ERROR:\n\t{}".format(repr(e)))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
lldb.debugger = lldb.SBDebugger.Create()
|
||||||
main()
|
main()
|
||||||
elif lldb.debugger:
|
elif lldb.debugger:
|
||||||
main()
|
main()
|
||||||
|
@ -119,7 +119,7 @@ def main():
|
|||||||
binary_code = binary_file.read()
|
binary_code = binary_file.read()
|
||||||
binary_file.close()
|
binary_file.close()
|
||||||
|
|
||||||
# Apply constraints to the mutated input
|
# Assert that the binary size is within limits
|
||||||
if len(binary_code) > CODE_SIZE_MAX:
|
if len(binary_code) > CODE_SIZE_MAX:
|
||||||
print("Binary code is too large (> {} bytes)".format(CODE_SIZE_MAX))
|
print("Binary code is too large (> {} bytes)".format(CODE_SIZE_MAX))
|
||||||
return
|
return
|
||||||
|
Submodule unicorn_mode/unicornafl updated: 63aab0f752...764b66b21c
1
xgboost
Submodule
1
xgboost
Submodule
Submodule xgboost added at 742c19f3ec
Reference in New Issue
Block a user