mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-24 14:43:22 +00:00
Compare commits
77 Commits
Author | SHA1 | Date | |
---|---|---|---|
ad4b727476 | |||
41fe8b6ab9 | |||
38ab1eda6e | |||
6afca4f073 | |||
9cfe1d1394 | |||
badd9694d2 | |||
0623a73a5c | |||
2e8a459d0b | |||
02db8685f1 | |||
2f0cc088b5 | |||
05b1e49bc2 | |||
9d45e8d810 | |||
5435d5c175 | |||
869138aa41 | |||
5bf8bffd4a | |||
af5e8370af | |||
9d9d2cada9 | |||
4e73828645 | |||
d610821679 | |||
453d554fb5 | |||
9a0cee6ce1 | |||
2125950a81 | |||
8e3aee8a1a | |||
636025df9a | |||
b7a2c7e698 | |||
a7877416a8 | |||
061bd75953 | |||
b27a4a3689 | |||
a194a82bcd | |||
5452d4652b | |||
9b6ad933cd | |||
36c46b9579 | |||
08f44f4e5d | |||
f12ee5c7d2 | |||
258f4ee529 | |||
c06c297933 | |||
ffad6f3f09 | |||
3e30b700dd | |||
05ac236a6b | |||
6bb2500707 | |||
d06f8b2a93 | |||
0fe39e4768 | |||
0c122aeee6 | |||
3a31c5c985 | |||
644b544bc0 | |||
147654f871 | |||
2775271b17 | |||
413e68ab6d | |||
eb5a914ef6 | |||
88ff8aa81e | |||
804e845a94 | |||
47d5dbbead | |||
4ebde72f28 | |||
b4cb3784a5 | |||
7b2145b914 | |||
361263b0f2 | |||
eeab1afd57 | |||
843ef46b21 | |||
d7abf6936c | |||
2462c61df9 | |||
ba14c353c0 | |||
f00d83afbc | |||
4e98071385 | |||
1a3b463c4c | |||
dae5843b0e | |||
3200e6515b | |||
130b1f7864 | |||
89d6e306f2 | |||
2c8228dbe4 | |||
b5002d74b4 | |||
ddea91de1d | |||
39dadab065 | |||
e377ee3c57 | |||
38fba71546 | |||
3c811de917 | |||
63b12c5f86 | |||
79a69b14ef |
25
Dockerfile
25
Dockerfile
@ -9,18 +9,29 @@ FROM ubuntu:22.04 AS aflplusplus
|
||||
LABEL "maintainer"="afl++ team <afl@aflplus.plus>"
|
||||
LABEL "about"="AFLplusplus container image"
|
||||
|
||||
### Comment out to enable these features
|
||||
# Only available on specific ARM64 boards
|
||||
ENV NO_CORESIGHT=1
|
||||
# Possible but unlikely in a docker container
|
||||
ENV NO_NYX=1
|
||||
|
||||
### Only change these if you know what you are doing:
|
||||
# LLVM 15 does not look good so we stay at 14 to still have LTO
|
||||
ENV LLVM_VERSION=14
|
||||
# GCC 12 is producing compile errors for some targets so we stay at GCC 11
|
||||
ENV GCC_VERSION=11
|
||||
|
||||
### No changes beyond the point unless you know what you are doing :)
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV NO_ARCH_OPT=1
|
||||
ENV IS_DOCKER=1
|
||||
|
||||
RUN apt-get update && apt-get full-upgrade -y && \
|
||||
apt-get install -y --no-install-recommends wget ca-certificates && \
|
||||
apt-get install -y --no-install-recommends wget ca-certificates apt-utils && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENV LLVM_VERSION=14
|
||||
ENV GCC_VERSION=11
|
||||
|
||||
RUN echo "deb [signed-by=/etc/apt/keyrings/llvm-snapshot.gpg.key] http://apt.llvm.org/jammy/ llvm-toolchain-jammy-${LLVM_VERSION} main" > /etc/apt/sources.list.d/llvm.list && \
|
||||
wget -qO /etc/apt/keyrings/llvm-snapshot.gpg.key https://apt.llvm.org/llvm-snapshot.gpg.key
|
||||
|
||||
@ -30,7 +41,7 @@ RUN apt-get update && \
|
||||
git xz-utils bzip2 wget jupp nano bash-completion less vim joe ssh psmisc \
|
||||
python3 python3-dev python3-setuptools python-is-python3 \
|
||||
libtool libtool-bin libglib2.0-dev \
|
||||
apt-utils apt-transport-https gnupg dialog \
|
||||
apt-transport-https gnupg dialog \
|
||||
gnuplot-nox libpixman-1-dev \
|
||||
gcc-${GCC_VERSION} g++-${GCC_VERSION} gcc-${GCC_VERSION}-plugin-dev gdb lcov \
|
||||
clang-${LLVM_VERSION} clang-tools-${LLVM_VERSION} libc++1-${LLVM_VERSION} \
|
||||
@ -64,10 +75,6 @@ ENV AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1
|
||||
RUN git clone --depth=1 https://github.com/vanhauser-thc/afl-cov && \
|
||||
(cd afl-cov && make install) && rm -rf afl-cov
|
||||
|
||||
# Build currently broken
|
||||
ENV NO_CORESIGHT=1
|
||||
ENV NO_UNICORN_ARM64=1
|
||||
|
||||
WORKDIR /AFLplusplus
|
||||
COPY . .
|
||||
|
||||
|
52
GNUmakefile
52
GNUmakefile
@ -309,6 +309,17 @@ endif
|
||||
.PHONY: all
|
||||
all: test_x86 test_shm test_python ready $(PROGS) afl-as llvm gcc_plugin test_build all_done
|
||||
-$(MAKE) -C utils/aflpp_driver
|
||||
@echo
|
||||
@echo
|
||||
@echo Build Summary:
|
||||
@test -e afl-fuzz && echo "[+] afl-fuzz and supporting tools successfully built" || echo "[-] afl-fuzz could not be built, please set CC to a working compiler"
|
||||
@test -e afl-llvm-pass.so && echo "[+] LLVM basic mode successfully built" || echo "[-] LLVM mode could not be build, please install at least llvm-11 and clang-11 or newer, see docs/INSTALL.md"
|
||||
@test -e SanitizerCoveragePCGUARD.so && echo "[+] LLVM mode successfully built" || echo "[-] LLVM mode could not be build, please install at least llvm-11 and clang-11 or newer, see docs/INSTALL.md"
|
||||
@test -e SanitizerCoverageLTO.so && echo "[+] LLVM LTO mode successfully built" || echo "[-] LLVM LTO mode could not be build, it is optional, if you want it, please install LLVM 11-14. More information at instrumentation/README.lto.md on how to build it"
|
||||
ifneq "$(SYS)" "Darwin"
|
||||
@test -e afl-gcc-pass.so && echo "[+] gcc_mode successfully built" || echo "[-] gcc_mode could not be built, it is optional, install gcc-VERSION-plugin-dev to enable this"
|
||||
endif
|
||||
@echo
|
||||
|
||||
.PHONY: llvm
|
||||
llvm:
|
||||
@ -674,6 +685,31 @@ endif
|
||||
-cd unicorn_mode && unset CFLAGS && sh ./build_unicorn_support.sh
|
||||
endif
|
||||
endif
|
||||
@echo
|
||||
@echo
|
||||
@echo Build Summary:
|
||||
@test -e afl-fuzz && echo "[+] afl-fuzz and supporting tools successfully built" || echo "[-] afl-fuzz could not be built, please set CC to a working compiler"
|
||||
ifneq "$(SYS)" "Darwin"
|
||||
ifeq "$(ARCH)" "aarch64"
|
||||
ifndef NO_CORESIGHT
|
||||
@test -e afl-cs-proxy && echo "[+] coresight_mode successfully built" || echo "[-] coresight_mode could not be built, it is optional and experimental, see coresight_mode/README.md for what is needed"
|
||||
endif
|
||||
endif
|
||||
ifeq "$(SYS)" "Linux"
|
||||
ifndef NO_NYX
|
||||
@test -e libnyx.so && echo "[+] nyx_mode successfully built" || echo "[-] nyx_mode could not be built, it is optional, see nyx_mode/README.md for what is needed"
|
||||
endif
|
||||
endif
|
||||
@test -e afl-qemu-trace && echo "[+] qemu_mode successfully built" || echo "[-] qemu_mode could not be built, see docs/INSTALL.md for what is needed"
|
||||
ifeq "$(ARCH)" "aarch64"
|
||||
ifndef NO_UNICORN_ARM64
|
||||
@test -e unicorn_mode/unicornafl/build_python/libunicornafl.so && echo "[+] unicorn_mode successfully built" || echo "[-] unicorn_mode could not be built, it is optional, see unicorn_mode/README.md for what is needed"
|
||||
endif
|
||||
else
|
||||
@test -e unicorn_mode/unicornafl/build_python/libunicornafl.so && echo "[+] unicorn_mode successfully built" || echo "[-] unicorn_mode could not be built, it is optional, see unicorn_mode/README.md for what is needed"
|
||||
endif
|
||||
endif
|
||||
@echo
|
||||
|
||||
.PHONY: source-only
|
||||
source-only: all
|
||||
@ -689,6 +725,22 @@ ifndef NO_NYX
|
||||
-cd nyx_mode && ./build_nyx_support.sh
|
||||
endif
|
||||
endif
|
||||
@echo
|
||||
@echo
|
||||
@echo Build Summary:
|
||||
@test -e afl-fuzz && echo "[+] afl-fuzz and supporting tools successfully built" || echo "[-] afl-fuzz could not be built, please set CC to a working compiler"
|
||||
@test -e afl-llvm-pass.so && echo "[+] LLVM basic mode successfully built" || echo "[-] LLVM mode could not be build, please install at least llvm-11 and clang-11 or newer, see docs/INSTALL.md"
|
||||
@test -e SanitizerCoveragePCGUARD.so && echo "[+] LLVM mode successfully built" || echo "[-] LLVM mode could not be build, please install at least llvm-11 and clang-11 or newer, see docs/INSTALL.md"
|
||||
@test -e SanitizerCoverageLTO.so && echo "[+] LLVM LTO mode successfully built" || echo "[-] LLVM LTO mode could not be build, it is optional, if you want it, please install LLVM 11-14. More information at instrumentation/README.lto.md on how to build it"
|
||||
ifneq "$(SYS)" "Darwin"
|
||||
test -e afl-gcc-pass.so && echo "[+] gcc_mode successfully built" || echo "[-] gcc_mode could not be built, it is optional, install gcc-VERSION-plugin-dev to enable this"
|
||||
endif
|
||||
ifeq "$(SYS)" "Linux"
|
||||
ifndef NO_NYX
|
||||
@test -e libnyx.so && echo "[+] nyx_mode successfully built" || echo "[-] nyx_mode could not be built, it is optional, see nyx_mode/README.md for what is needed"
|
||||
endif
|
||||
endif
|
||||
@echo
|
||||
|
||||
%.8: %
|
||||
@echo .TH $* 8 $(BUILD_DATE) "afl++" > $@
|
||||
|
@ -45,11 +45,11 @@ endif
|
||||
LLVMVER = $(shell $(LLVM_CONFIG) --version 2>/dev/null | sed 's/git//' | sed 's/svn//' )
|
||||
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/ .*//' )
|
||||
LLVM_UNSUPPORTED = $(shell $(LLVM_CONFIG) --version 2>/dev/null | egrep -q '^[0-2]\.|^3.[0-7]\.' && echo 1 || echo 0 )
|
||||
LLVM_TOO_NEW = $(shell $(LLVM_CONFIG) --version 2>/dev/null | egrep -q '^1[5-9]' && echo 1 || echo 0 )
|
||||
LLVM_NEW_API = $(shell $(LLVM_CONFIG) --version 2>/dev/null | egrep -q '^1[0-9]' && echo 1 || echo 0 )
|
||||
LLVM_10_OK = $(shell $(LLVM_CONFIG) --version 2>/dev/null | egrep -q '^1[1-9]|^10\.[1-9]|^10\.0.[1-9]' && echo 1 || echo 0 )
|
||||
LLVM_HAVE_LTO = $(shell $(LLVM_CONFIG) --version 2>/dev/null | egrep -q '^1[1-9]' && echo 1 || echo 0 )
|
||||
LLVM_UNSUPPORTED = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^[0-2]\.|^3.[0-7]\.' && echo 1 || echo 0 )
|
||||
LLVM_TOO_NEW = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[5-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_10_OK = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[1-9]|^10\.[1-9]|^10\.0.[1-9]' && echo 1 || echo 0 )
|
||||
LLVM_HAVE_LTO = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[1-9]' && echo 1 || echo 0 )
|
||||
LLVM_BINDIR = $(shell $(LLVM_CONFIG) --bindir 2>/dev/null)
|
||||
LLVM_LIBDIR = $(shell $(LLVM_CONFIG) --libdir 2>/dev/null)
|
||||
LLVM_STDCXX = gnu++11
|
||||
@ -86,12 +86,6 @@ ifeq "$(LLVM_TOO_OLD)" "1"
|
||||
$(shell sleep 1)
|
||||
endif
|
||||
|
||||
ifeq "$(LLVM_MAJOR)" "15"
|
||||
$(info [!] llvm_mode detected llvm 15, which is currently broken for LTO plugins.)
|
||||
LLVM_LTO = 0
|
||||
LLVM_HAVE_LTO = 0
|
||||
endif
|
||||
|
||||
ifeq "$(LLVM_HAVE_LTO)" "1"
|
||||
$(info [+] llvm_mode detected llvm 11+, enabling afl-lto LTO implementation)
|
||||
LLVM_LTO = 1
|
||||
@ -99,7 +93,7 @@ ifeq "$(LLVM_HAVE_LTO)" "1"
|
||||
endif
|
||||
|
||||
ifeq "$(LLVM_LTO)" "0"
|
||||
$(info [+] llvm_mode detected llvm < 11 or llvm 15, afl-lto LTO will not be build.)
|
||||
$(info [+] llvm_mode detected llvm < 11, afl-lto LTO will not be build.)
|
||||
endif
|
||||
|
||||
ifeq "$(LLVM_APPLE_XCODE)" "1"
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
<img align="right" src="https://raw.githubusercontent.com/AFLplusplus/Website/master/static/aflpp_bg.svg" alt="AFL++ logo" width="250" heigh="250">
|
||||
|
||||
Release version: [4.02c](https://github.com/AFLplusplus/AFLplusplus/releases)
|
||||
Release version: [4.03c](https://github.com/AFLplusplus/AFLplusplus/releases)
|
||||
|
||||
GitHub version: 4.02c
|
||||
GitHub version: 4.04a
|
||||
|
||||
Repository:
|
||||
[https://github.com/AFLplusplus/AFLplusplus](https://github.com/AFLplusplus/AFLplusplus)
|
||||
|
1
TODO.md
1
TODO.md
@ -2,7 +2,6 @@
|
||||
|
||||
## Should
|
||||
|
||||
- makefiles should show provide a build summary success/failure
|
||||
- better documentation for custom mutators
|
||||
- better autodetection of shifting runtime timeout values
|
||||
- Update afl->pending_not_fuzzed for MOpt
|
||||
|
33
afl-cmin
33
afl-cmin
@ -105,12 +105,13 @@ function usage() {
|
||||
"Execution control settings:\n" \
|
||||
" -f file - location read by the fuzzed program (stdin)\n" \
|
||||
" -m megs - memory limit for child process ("mem_limit" MB)\n" \
|
||||
" -t msec - run time limit for child process (none)\n" \
|
||||
" -t msec - run time limit for child process (default: none)\n" \
|
||||
" -O - use binary-only instrumentation (FRIDA mode)\n" \
|
||||
" -Q - use binary-only instrumentation (QEMU mode)\n" \
|
||||
" -U - use unicorn-based instrumentation (unicorn mode)\n" \
|
||||
"\n" \
|
||||
"Minimization settings:\n" \
|
||||
" -A - allow crashes and timeouts (not recommended)\n" \
|
||||
" -C - keep crashing inputs, reject everything else\n" \
|
||||
" -e - solve for edge coverage only, ignore hit counts\n" \
|
||||
"\n" \
|
||||
@ -123,6 +124,7 @@ function usage() {
|
||||
"AFL_KEEP_TRACES: leave the temporary <out_dir>/.traces directory\n" \
|
||||
"AFL_KILL_SIGNAL: Signal delivered to child processes on timeout (default: SIGKILL)\n" \
|
||||
"AFL_NO_FORKSRV: run target via execve instead of using the forkserver\n" \
|
||||
"AFL_CMIN_ALLOW_ANY: write tuples for crashing inputs also\n" \
|
||||
"AFL_PATH: path for the afl-showmap binary if not found anywhere in PATH\n" \
|
||||
"AFL_PRINT_FILENAMES: If set, the filename currently processed will be " \
|
||||
"printed to stdout\n" \
|
||||
@ -146,11 +148,12 @@ BEGIN {
|
||||
# defaults
|
||||
extra_par = ""
|
||||
AFL_CMIN_CRASHES_ONLY = ""
|
||||
AFL_CMIN_ALLOW_ANY = ""
|
||||
|
||||
# process options
|
||||
Opterr = 1 # default is to diagnose
|
||||
Optind = 1 # skip ARGV[0]
|
||||
while ((_go_c = getopt(ARGC, ARGV, "hi:o:f:m:t:eCOQU?")) != -1) {
|
||||
while ((_go_c = getopt(ARGC, ARGV, "hi:o:f:m:t:eACOQU?")) != -1) {
|
||||
if (_go_c == "i") {
|
||||
if (!Optarg) usage()
|
||||
if (in_dir) { print "Option "_go_c" is only allowed once" > "/dev/stderr"}
|
||||
@ -186,6 +189,10 @@ BEGIN {
|
||||
AFL_CMIN_CRASHES_ONLY = "AFL_CMIN_CRASHES_ONLY=1 "
|
||||
continue
|
||||
} else
|
||||
if (_go_c == "A") {
|
||||
AFL_CMIN_ALLOW_ANY = "AFL_CMIN_ALLOW_ANY=1 "
|
||||
continue
|
||||
} else
|
||||
if (_go_c == "e") {
|
||||
extra_par = extra_par " -e"
|
||||
continue
|
||||
@ -291,6 +298,16 @@ BEGIN {
|
||||
target_bin = tnew
|
||||
}
|
||||
|
||||
if (0 == system ( "grep -aq AFL_DUMP_MAP_SIZE " target_bin )) {
|
||||
echo "[!] Trying to obtain the map size of the target ..."
|
||||
get_map_size = "AFL_DUMP_MAP_SIZE=1 " target_bin
|
||||
get_map_size | getline mapsize
|
||||
if (mapsize && mapsize > 65535 && mapsize < 100000000) {
|
||||
AFL_MAP_SIZE = "AFL_MAP_SIZE="mapsize" "
|
||||
print "[+] Setting "AFL_MAP_SIZE
|
||||
}
|
||||
}
|
||||
|
||||
if (!ENVIRON["AFL_SKIP_BIN_CHECK"] && !qemu_mode && !frida_mode && !unicorn_mode) {
|
||||
if (0 != system( "grep -q __AFL_SHM_ID "target_bin )) {
|
||||
print "[-] Error: binary '"target_bin"' doesn't appear to be instrumented." > "/dev/stderr"
|
||||
@ -399,10 +416,10 @@ BEGIN {
|
||||
print "[*] Testing the target binary..."
|
||||
|
||||
if (!stdin_file) {
|
||||
system( "AFL_CMIN_ALLOW_ANY=1 "AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"/.run_test\" -Z "extra_par" -- \""target_bin"\" "prog_args_string" <\""in_dir"/"first_file"\"")
|
||||
system(AFL_MAP_SIZE "AFL_CMIN_ALLOW_ANY=1 "AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"/.run_test\" -Z "extra_par" -- \""target_bin"\" "prog_args_string" <\""in_dir"/"first_file"\"")
|
||||
} else {
|
||||
system("cp \""in_dir"/"first_file"\" "stdin_file)
|
||||
system( "AFL_CMIN_ALLOW_ANY=1 "AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"/.run_test\" -Z "extra_par" -H \""stdin_file"\" -- \""target_bin"\" "prog_args_string" </dev/null")
|
||||
system(AFL_MAP_SIZE "AFL_CMIN_ALLOW_ANY=1 "AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"/.run_test\" -Z "extra_par" -H \""stdin_file"\" -- \""target_bin"\" "prog_args_string" </dev/null")
|
||||
}
|
||||
|
||||
first_count = 0
|
||||
@ -435,15 +452,15 @@ BEGIN {
|
||||
if (!stdin_file) {
|
||||
print " Processing "in_count" files (forkserver mode)..."
|
||||
# print AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"\" -Z "extra_par" -i \""in_dir"\" -- \""target_bin"\" "prog_args_string
|
||||
retval = system( AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"\" -Z "extra_par" -i \""in_dir"\" -- \""target_bin"\" "prog_args_string)
|
||||
retval = system(AFL_MAP_SIZE AFL_CMIN_ALLOW_ANY AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"\" -Z "extra_par" -i \""in_dir"\" -- \""target_bin"\" "prog_args_string)
|
||||
} else {
|
||||
print " Processing "in_count" files (forkserver mode)..."
|
||||
# print AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"\" -Z "extra_par" -i \""in_dir"\" -H \""stdin_file"\" -- \""target_bin"\" "prog_args_string" </dev/null"
|
||||
retval = system( AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"\" -Z "extra_par" -i \""in_dir"\" -H \""stdin_file"\" -- \""target_bin"\" "prog_args_string" </dev/null")
|
||||
retval = system(AFL_MAP_SIZE AFL_CMIN_ALLOW_ANY AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"\" -Z "extra_par" -i \""in_dir"\" -H \""stdin_file"\" -- \""target_bin"\" "prog_args_string" </dev/null")
|
||||
}
|
||||
|
||||
if (retval && !AFL_CMIN_CRASHES_ONLY) {
|
||||
print "[!] Exit code "retval" != 0 received from afl-showmap, terminating..."
|
||||
if (retval && (!AFL_CMIN_CRASHES_ONLY && !AFL_CMIN_ALLOW_ANY)) {
|
||||
print "[!] Exit code "retval" != 0 received from afl-showmap (this means a crashing or timeout input is likely present), terminating..."
|
||||
|
||||
if (!ENVIRON["AFL_KEEP_TRACES"]) {
|
||||
system("rm -rf "trace_dir" 2>/dev/null")
|
||||
|
@ -53,7 +53,7 @@ unset IN_DIR OUT_DIR STDIN_FILE EXTRA_PAR MEM_LIMIT_GIVEN \
|
||||
|
||||
export AFL_QUIET=1
|
||||
|
||||
while getopts "+i:o:f:m:t:eOQUCh" opt; do
|
||||
while getopts "+i:o:f:m:t:eOQUACh" opt; do
|
||||
|
||||
case "$opt" in
|
||||
|
||||
@ -80,6 +80,9 @@ while getopts "+i:o:f:m:t:eOQUCh" opt; do
|
||||
"e")
|
||||
EXTRA_PAR="$EXTRA_PAR -e"
|
||||
;;
|
||||
"A")
|
||||
export AFL_CMIN_ALLOW_ANY=1
|
||||
;;
|
||||
"C")
|
||||
export AFL_CMIN_CRASHES_ONLY=1
|
||||
;;
|
||||
@ -128,6 +131,7 @@ Execution control settings:
|
||||
|
||||
Minimization settings:
|
||||
|
||||
-A - allow crashing and timeout inputs
|
||||
-C - keep crashing inputs, reject everything else
|
||||
-e - solve for edge coverage only, ignore hit counts
|
||||
|
||||
@ -215,6 +219,15 @@ if [ ! -f "$TARGET_BIN" -o ! -x "$TARGET_BIN" ]; then
|
||||
|
||||
fi
|
||||
|
||||
grep -aq AFL_DUMP_MAP_SIZE "./$TARGET_BIN" && {
|
||||
echo "[!] Trying to obtain the map size of the target ..."
|
||||
MAPSIZE=`AFL_DUMP_MAP_SIZE=1 "./$TARGET_BIN" 2>/dev/null`
|
||||
test -n "$MAPSIZE" && {
|
||||
export AFL_MAP_SIZE=$MAPSIZE
|
||||
echo "[+] Setting AFL_MAP_SIZE=$MAPSIZE"
|
||||
}
|
||||
}
|
||||
|
||||
if [ "$AFL_SKIP_BIN_CHECK" = "" -a "$QEMU_MODE" = "" -a "$FRIDA_MODE" = "" -a "$UNICORN_MODE" = "" ]; then
|
||||
|
||||
if ! grep -qF "__AFL_SHM_ID" "$TARGET_BIN"; then
|
||||
|
@ -111,11 +111,11 @@ kernel.sched_latency_ns=250000000
|
||||
EOF
|
||||
}
|
||||
|
||||
egrep -q '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub 2>/dev/null || echo Error: /etc/default/grub with GRUB_CMDLINE_LINUX_DEFAULT is not present, cannot set boot options
|
||||
egrep -q '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub 2>/dev/null && {
|
||||
egrep '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub | egrep -q hardened_usercopy=off || {
|
||||
grep -E -q '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub 2>/dev/null || echo Error: /etc/default/grub with GRUB_CMDLINE_LINUX_DEFAULT is not present, cannot set boot options
|
||||
grep -E -q '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub 2>/dev/null && {
|
||||
grep -E '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub | grep -E -q hardened_usercopy=off || {
|
||||
echo "Configuring performance boot options"
|
||||
LINE=`egrep '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub | sed 's/^GRUB_CMDLINE_LINUX_DEFAULT=//' | tr -d '"'`
|
||||
LINE=`grep -E '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub | sed 's/^GRUB_CMDLINE_LINUX_DEFAULT=//' | tr -d '"'`
|
||||
OPTIONS="$LINE ibpb=off ibrs=off kpti=off l1tf=off mds=off mitigations=off no_stf_barrier noibpb noibrs nopcid nopti nospec_store_bypass_disable nospectre_v1 nospectre_v2 pcid=off pti=off spec_store_bypass_disable=off spectre_v2=off stf_barrier=off srbds=off noexec=off noexec32=off tsx=on tsx=on tsx_async_abort=off mitigations=off audit=0 hardened_usercopy=off ssbd=force-off"
|
||||
echo Setting boot options in /etc/default/grub to GRUB_CMDLINE_LINUX_DEFAULT=\"$OPTIONS\"
|
||||
sed -i "s|^GRUB_CMDLINE_LINUX_DEFAULT=.*|GRUB_CMDLINE_LINUX_DEFAULT=\"$OPTIONS\"|" /etc/default/grub
|
||||
|
@ -47,7 +47,7 @@ if [ "$PLATFORM" = "Linux" ] ; then
|
||||
} > /dev/null
|
||||
echo Settings applied.
|
||||
echo
|
||||
dmesg | egrep -q 'nospectre_v2|spectre_v2=off' || {
|
||||
dmesg | grep -E -q 'nospectre_v2|spectre_v2=off' || {
|
||||
echo It is recommended to boot the kernel with lots of security off - if you are running a machine that is in a secured network - so set this:
|
||||
echo ' /etc/default/grub:GRUB_CMDLINE_LINUX_DEFAULT="ibpb=off ibrs=off kpti=0 l1tf=off mds=off mitigations=off no_stf_barrier noibpb noibrs nopcid nopti nospec_store_bypass_disable nospectre_v1 nospectre_v2 pcid=off pti=off spec_store_bypass_disable=off spectre_v2=off stf_barrier=off srbds=off noexec=off noexec32=off tsx=on tsx_async_abort=off arm64.nopauth audit=0 hardened_usercopy=off ssbd=force-off"'
|
||||
echo
|
||||
|
@ -3,10 +3,36 @@
|
||||
This is the list of all noteworthy changes made in every public
|
||||
release of the tool. See README.md for the general instruction manual.
|
||||
|
||||
## Staying informed
|
||||
|
||||
Want to stay in the loop on major new features? Join our mailing list by
|
||||
sending a mail to <afl-users+subscribe@googlegroups.com>.
|
||||
### Version ++4.03c (release)
|
||||
- Building now gives a build summary what succeeded and what not
|
||||
- afl-fuzz:
|
||||
- added AFL_NO_STARTUP_CALIBRATION to start fuzzing at once instead
|
||||
of calibrating all initial seeds first. Good for large queues
|
||||
and long execution times, especially in CIs.
|
||||
- default calibration cycles set to 7 from 8, and only add 5 cycles
|
||||
to variables queue items instead of 12.
|
||||
- afl-cc:
|
||||
- fixed off-by-one bug in our pcguard implemenation, thanks for
|
||||
@tokatoka for reporting
|
||||
- fix for llvm 15 and reenabling LTO, thanks to nikic for the PR!
|
||||
- better handling of -fsanitize=..,...,.. lists
|
||||
- support added for LLVMFuzzerRunDriver()
|
||||
- fix gcc_mode cmplog
|
||||
- obtain the map size of a target with setting AFL_DUMP_MAP_SIZE=1
|
||||
note that this will exit the target before main()
|
||||
- qemu_mode:
|
||||
- added AFL_QEMU_TRACK_UNSTABLE to log the addresses of unstable
|
||||
edges (together with AFL_DEBUG=1 afl-fuzz). thanks to
|
||||
worksbutnottested!
|
||||
- afl-analyze broke at some point, fix by CodeLogicError, thank you!
|
||||
- afl-cmin/afl-cmin.bash now have an -A option to allow also crashing
|
||||
and timeout inputs
|
||||
- unicorn_mode:
|
||||
- updated upstream unicorn version
|
||||
- fixed builds for aarch64
|
||||
- build now uses all available cores
|
||||
|
||||
|
||||
### Version ++4.02c (release)
|
||||
- afl-cc:
|
||||
@ -22,7 +48,6 @@ sending a mail to <afl-users+subscribe@googlegroups.com>.
|
||||
- change post_process hook to allow returning NULL and 0 length to
|
||||
tell afl-fuzz to skip this mutated input
|
||||
|
||||
|
||||
### Version ++4.01c (release)
|
||||
- fixed */build_...sh scripts to work outside of git
|
||||
- new custom_mutator: libafl with token fuzzing :)
|
||||
|
15
docs/FAQ.md
15
docs/FAQ.md
@ -255,3 +255,18 @@ If you find an interesting or important question missing, submit it via
|
||||
|
||||
Solution: `git pull ; make clean install` of AFL++.
|
||||
</p></details>
|
||||
|
||||
<details>
|
||||
<summary id="afl-map-size-warning">AFL++ map size warning.</summary><p>
|
||||
|
||||
When you run a large instrumented program stand-alone or via afl-showmap
|
||||
you might see a warning like the following:
|
||||
|
||||
```
|
||||
Warning: AFL++ tools might need to set AFL_MAP_SIZE to 223723 to be able to run this instrumented program if this crashes!
|
||||
```
|
||||
|
||||
Depending how the target works it might also crash afterwards.
|
||||
|
||||
Solution: just do an `export AFL_MAP_SIZE=(the value in the warning)`.
|
||||
</p></details>
|
||||
|
@ -21,8 +21,8 @@ development state of AFL++.
|
||||
If you want to build AFL++ yourself, you have many options. The easiest choice
|
||||
is to build and install everything:
|
||||
|
||||
NOTE: depending on your Debian/Ubuntu/Kali/... version release `-12` with
|
||||
whatever llvm version is available!
|
||||
NOTE: depending on your Debian/Ubuntu/Kali/... release, replace `-12` with
|
||||
whatever llvm version is available. We recommend llvm 12, 13 or 14.
|
||||
|
||||
```shell
|
||||
sudo apt-get update
|
||||
|
@ -455,13 +455,16 @@ checks or alter some of the more exotic semantics of the tool:
|
||||
normally done when starting up the forkserver and causes a pretty
|
||||
significant performance drop.
|
||||
|
||||
- `AFL_NO_SNAPSHOT` will advice afl-fuzz not to use the snapshot feature if
|
||||
- `AFL_NO_SNAPSHOT` will advise afl-fuzz not to use the snapshot feature if
|
||||
the snapshot lkm is loaded.
|
||||
|
||||
- Setting `AFL_NO_UI` inhibits the UI altogether and just periodically prints
|
||||
some basic stats. This behavior is also automatically triggered when the
|
||||
output from afl-fuzz is redirected to a file or to a pipe.
|
||||
|
||||
- Setting `AFL_NO_STARTUP_CALIBRATION` will skip the initial calibration
|
||||
of all starting seeds, and start fuzzing at once.
|
||||
|
||||
- In QEMU mode (-Q) and FRIDA mode (-O), `AFL_PATH` will be searched for
|
||||
afl-qemu-trace and afl-frida-trace.so.
|
||||
|
||||
@ -470,7 +473,7 @@ checks or alter some of the more exotic semantics of the tool:
|
||||
some targets keep inherent state due which a detected crash test case does
|
||||
not crash the target again when the test case is given. To be able to still
|
||||
re-trigger these crashes, you can use the `AFL_PERSISTENT_RECORD` variable
|
||||
with a value of how many previous fuzz cases to keep prio a crash. If set to
|
||||
with a value of how many previous fuzz cases to keep prior a crash. If set to
|
||||
e.g., 10, then the 9 previous inputs are written to out/default/crashes as
|
||||
RECORD:000000,cnt:000000 to RECORD:000000,cnt:000008 and
|
||||
RECORD:000000,cnt:000009 being the crash case. NOTE: This option needs to be
|
||||
@ -691,8 +694,8 @@ support.
|
||||
* `AFL_FRIDA_STALKER_ADJACENT_BLOCKS` - Configure the number of adjacent blocks
|
||||
to fetch when generating instrumented code. By fetching blocks in the same
|
||||
order they appear in the original program, rather than the order of execution
|
||||
should help reduce locallity and adjacency. This includes allowing us to
|
||||
vector between adjancent blocks using a NOP slide rather than an immediate
|
||||
should help reduce locality and adjacency. This includes allowing us to
|
||||
vector between adjacent blocks using a NOP slide rather than an immediate
|
||||
branch.
|
||||
* `AFL_FRIDA_STALKER_IC_ENTRIES` - Configure the number of inline cache entries
|
||||
stored along-side branch instructions which provide a cache to avoid having to
|
||||
|
@ -291,7 +291,7 @@ its IPT performance is just 6%!
|
||||
|
||||
There are many binary-only fuzzing frameworks. Some are great for CTFs but don't
|
||||
work with large binaries, others are very slow but have good path discovery,
|
||||
some are very hard to set-up...
|
||||
some are very hard to set up...
|
||||
|
||||
* Jackalope:
|
||||
[https://github.com/googleprojectzero/Jackalope](https://github.com/googleprojectzero/Jackalope)
|
||||
|
@ -523,7 +523,7 @@ mode!) and switch the input directory with a dash (`-`):
|
||||
afl-fuzz -i - -o output -- bin/target -someopt @@
|
||||
```
|
||||
|
||||
Adding a dictionary is helpful. You have to following options:
|
||||
Adding a dictionary is helpful. You have the following options:
|
||||
|
||||
* See the directory
|
||||
[dictionaries/](../dictionaries/), if something is already included for your
|
||||
@ -626,6 +626,9 @@ from other fuzzers in the campaign first.
|
||||
|
||||
If you have a large corpus, a corpus from a previous run or are fuzzing in a CI,
|
||||
then also set `export AFL_CMPLOG_ONLY_NEW=1` and `export AFL_FAST_CAL=1`.
|
||||
If the queue in the CI is huge and/or the execution time is slow then you can
|
||||
also add `AFL_NO_STARTUP_CALIBRATION=1` to skip the initial queue calibration
|
||||
phase and start fuzzing at once.
|
||||
|
||||
You can also use different fuzzers. If you are using AFL spinoffs or AFL
|
||||
conforming fuzzers, then just use the same -o directory and give it a unique
|
||||
@ -669,7 +672,7 @@ The syncing process itself is very simple. As the `-M main-$HOSTNAME` instance
|
||||
syncs to all `-S` secondaries as well as to other fuzzers, you have to copy only
|
||||
this directory to the other machines.
|
||||
|
||||
Lets say all servers have the `-o out` directory in /target/foo/out, and you
|
||||
Let's say all servers have the `-o out` directory in /target/foo/out, and you
|
||||
created a file `servers.txt` which contains the hostnames of all participating
|
||||
servers, plus you have an ssh key deployed to all of them, then run:
|
||||
|
||||
@ -902,6 +905,10 @@ complex file formats.
|
||||
Some notes on continuous integration (CI) fuzzing - this fuzzing is different to
|
||||
normal fuzzing campaigns as these are much shorter runnings.
|
||||
|
||||
If the queue in the CI is huge and/or the execution time is slow then you can
|
||||
also add `AFL_NO_STARTUP_CALIBRATION=1` to skip the initial queue calibration
|
||||
phase and start fuzzing at once.
|
||||
|
||||
1. Always:
|
||||
* LTO has a much longer compile time which is diametrical to short fuzzing -
|
||||
hence use afl-clang-fast instead.
|
||||
|
@ -32,7 +32,7 @@ CFLAGS+=-fPIC \
|
||||
-ffunction-sections \
|
||||
|
||||
ifdef IS_ANDROID
|
||||
CFLAGS+=-DANDROID
|
||||
CFLAGS+=-DANDROID
|
||||
endif
|
||||
|
||||
AFL_CFLAGS:=-Wno-unused-parameter \
|
||||
@ -47,7 +47,7 @@ LDFLAGS+= -static-libstdc++ \
|
||||
-DANDROID \
|
||||
-llog \
|
||||
-shared
|
||||
else
|
||||
else
|
||||
LDFLAGS+=-shared \
|
||||
-lpthread \
|
||||
-lresolv
|
||||
@ -103,7 +103,7 @@ endif
|
||||
LDFLAGS+= -z noexecstack \
|
||||
-Wl,--gc-sections \
|
||||
-Wl,--exclude-libs,ALL \
|
||||
-ldl
|
||||
-ldl
|
||||
LDSCRIPT:=-Wl,--version-script=$(PWD)frida.map
|
||||
endif
|
||||
|
||||
@ -118,7 +118,7 @@ endif
|
||||
ifdef IS_ANDROID
|
||||
OS:=android
|
||||
ifdef IS_x86
|
||||
ARCH:=x86
|
||||
ARCH:=x86
|
||||
endif
|
||||
ifdef IS_x86
|
||||
ARCH:=x86_64
|
||||
@ -247,17 +247,17 @@ else ifeq "$(ARCH)" "arm64"
|
||||
|
||||
CFLAGS+=-I $(FRIDA_DIR)build/frida_thin-$(OS)-$(ARCH)/include/frida-1.0 \
|
||||
-I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/glib-2.0/ \
|
||||
-I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/glib-2.0/include/ \
|
||||
-I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/glib-2.0/include/ \
|
||||
-I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/capstone/ \
|
||||
-I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/json-glib-1.0/ \
|
||||
|
||||
ifeq "$(OS)" "android"
|
||||
CFLAGS += -static-libstdc++
|
||||
CFLAGS += -static-libstdc++
|
||||
endif
|
||||
else
|
||||
CFLAGS+=-I $(FRIDA_DIR)build/frida_thin-$(OS)-$(ARCH)/include/frida-1.0 \
|
||||
-I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/glib-2.0/ \
|
||||
-I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/glib-2.0/include/ \
|
||||
-I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/glib-2.0/include/ \
|
||||
-I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/capstone/ \
|
||||
-I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/json-glib-1.0/ \
|
||||
|
||||
@ -284,7 +284,7 @@ CFLAGS+=-I $(FRIDA_DIR)build/frida-$(OS)-$(ARCH)/include/frida-1.0 \
|
||||
-I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/glib-2.0/ \
|
||||
-I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/glib-2.0/include/ \
|
||||
-I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/capstone/ \
|
||||
-I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/json-glib-1.0/
|
||||
-I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/json-glib-1.0/
|
||||
|
||||
ifeq "$(OS)" "android"
|
||||
CFLAGS += -static-libstdc++
|
||||
|
@ -86,7 +86,7 @@ To enable the powerful CMPLOG mechanism, set `-c 0` for `afl-fuzz`.
|
||||
|
||||
## Scripting
|
||||
|
||||
One of the more powerful features of FRIDA mode is it's support for
|
||||
One of the more powerful features of FRIDA mode is its support for
|
||||
configuration by JavaScript, rather than using environment variables. For
|
||||
details of how this works, see [Scripting.md](Scripting.md).
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
FRIDA now supports the ability to configure itself using JavaScript. This allows
|
||||
the user to make use of the convenience of FRIDA's scripting engine (along with
|
||||
it's support for debug symbols and exports) to configure all of the things which
|
||||
its support for debug symbols and exports) to configure all of the things which
|
||||
were traditionally configured using environment variables.
|
||||
|
||||
By default, FRIDA mode will look for the file `afl.js` in the current working
|
||||
@ -95,7 +95,7 @@ Afl.print("done");
|
||||
|
||||
## Stripped binaries
|
||||
|
||||
Lastly, if the binary you attempting to fuzz has no symbol information and no
|
||||
Lastly, if the binary you're attempting to fuzz has no symbol information and no
|
||||
exports, then the following approach can be used.
|
||||
|
||||
```js
|
||||
|
@ -77,7 +77,9 @@ static int on_dlclose(void *handle) {
|
||||
range = &g_array_index(ranges, gum_range_t, i);
|
||||
base = range->range.base_address;
|
||||
limit = base + range->range.size;
|
||||
FVERBOSE("Reserving range: 0x%016lx, 0x%016lX", base, limit);
|
||||
FVERBOSE("Reserving range: 0x%016" G_GINT64_MODIFIER
|
||||
"x, 0x%016" G_GINT64_MODIFIER "X",
|
||||
base, limit);
|
||||
mem = gum_memory_allocate(GSIZE_TO_POINTER(base), range->range.size,
|
||||
page_size, GUM_PAGE_NO_ACCESS);
|
||||
if (mem == NULL) { FATAL("Failed to allocate %p (%d)", mem, errno); }
|
||||
|
@ -2,10 +2,17 @@ PWD:=$(shell pwd)/
|
||||
ROOT:=$(PWD)../../../
|
||||
BUILD_DIR:=$(PWD)build/
|
||||
|
||||
LIBZ_BUILD_DIR:=$(BUILD_DIR)libz/
|
||||
LIBPNG_BUILD_DIR:=$(BUILD_DIR)libpng/
|
||||
HARNESS_BUILD_DIR:=$(BUILD_DIR)harness/
|
||||
PNGTEST_BUILD_DIR:=$(BUILD_DIR)pngtest/
|
||||
|
||||
LIBZ_FILE:=$(LIBZ_BUILD_DIR)zlib-1.2.12.tar.gz
|
||||
LIBZ_URL:=http://www.zlib.net/zlib-1.2.12.tar.gz
|
||||
LIBZ_DIR:=$(LIBZ_BUILD_DIR)zlib-1.2.12/
|
||||
LIBZ_PC:=$(ZLIB_DIR)zlib.pc
|
||||
LIBZ_LIB:=$(LIBZ_DIR)libz.a
|
||||
|
||||
LIBPNG_FILE:=$(LIBPNG_BUILD_DIR)libpng-1.2.56.tar.gz
|
||||
LIBPNG_URL:=https://downloads.sourceforge.net/project/libpng/libpng12/older-releases/1.2.56/libpng-1.2.56.tar.gz
|
||||
LIBPNG_DIR:=$(LIBPNG_BUILD_DIR)libpng-1.2.56/
|
||||
@ -32,11 +39,16 @@ FRIDA_OUT:=$(BUILD_DIR)frida-out
|
||||
|
||||
.PHONY: all clean qemu frida
|
||||
|
||||
ARCH?=""
|
||||
|
||||
all: $(TEST_BIN)
|
||||
make -C $(ROOT)frida_mode/
|
||||
|
||||
32:
|
||||
CFLAGS="-m32" LDFLAGS="-m32" ARCH="x86" make all
|
||||
CFLAGS="-m32" LDFLAGS="-m32" make $(TEST_BIN)
|
||||
|
||||
arm:
|
||||
ARCH="arm" CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" make $(TEST_BIN)
|
||||
|
||||
$(BUILD_DIR):
|
||||
mkdir -p $@
|
||||
@ -51,6 +63,8 @@ $(HARNESS_FILE): | $(HARNESS_BUILD_DIR)
|
||||
$(HARNESS_OBJ): $(HARNESS_FILE)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -c $<
|
||||
|
||||
harness: $(HARNESS_OBJ)
|
||||
|
||||
######### PNGTEST ########
|
||||
|
||||
$(PNGTEST_BUILD_DIR): | $(BUILD_DIR)
|
||||
@ -62,6 +76,34 @@ $(PNGTEST_FILE): | $(PNGTEST_BUILD_DIR)
|
||||
$(PNGTEST_OBJ): $(PNGTEST_FILE) | $(LIBPNG_DIR)
|
||||
$(CXX) $(CFLAGS) $(LDFLAGS) -std=c++11 -I $(LIBPNG_DIR) -o $@ -c $<
|
||||
|
||||
pngtest: $(PNGTEST_OBJ)
|
||||
|
||||
######### LIBZ ########
|
||||
|
||||
$(LIBZ_BUILD_DIR): | $(BUILD_DIR)
|
||||
mkdir -p $@
|
||||
|
||||
$(LIBZ_FILE): | $(LIBZ_BUILD_DIR)
|
||||
wget -O $@ $(LIBZ_URL)
|
||||
|
||||
$(LIBZ_DIR): $(LIBZ_FILE)
|
||||
tar zxvf $(LIBZ_FILE) -C $(LIBZ_BUILD_DIR)
|
||||
|
||||
$(LIBZ_PC): | $(LIBZ_DIR)
|
||||
cd $(LIBZ_DIR) && \
|
||||
CFLAGS="$(CFLAGS) -fPIC" \
|
||||
./configure \
|
||||
--static \
|
||||
--archs="$(ARCH)"
|
||||
|
||||
$(LIBZ_LIB): $(LIBZ_PC)
|
||||
CFLAGS="$(CFLAGS) -fPIC" \
|
||||
make \
|
||||
-C $(LIBZ_DIR) \
|
||||
-j
|
||||
|
||||
libz: $(LIBZ_LIB)
|
||||
|
||||
######### LIBPNG ########
|
||||
|
||||
$(LIBPNG_BUILD_DIR): | $(BUILD_DIR)
|
||||
@ -73,11 +115,21 @@ $(LIBPNG_FILE): | $(LIBPNG_BUILD_DIR)
|
||||
$(LIBPNG_DIR): $(LIBPNG_FILE)
|
||||
tar zxvf $(LIBPNG_FILE) -C $(LIBPNG_BUILD_DIR)
|
||||
|
||||
$(LIBPNG_MAKEFILE): | $(LIBPNG_DIR)
|
||||
cd $(LIBPNG_DIR) && ./configure
|
||||
$(LIBPNG_MAKEFILE): $(LIBZ_LIB) | $(LIBPNG_DIR)
|
||||
cd $(LIBPNG_DIR) && \
|
||||
CFLAGS="$(CFLAGS) -I$(LIBZ_DIR)" \
|
||||
LDFLAGS="-L$(LIBZ_DIR)" \
|
||||
./configure \
|
||||
--host="$(ARCH)"
|
||||
|
||||
$(LIBPNG_LIB): $(LIBPNG_MAKEFILE)
|
||||
make -C $(LIBPNG_DIR)
|
||||
CFLAGS="$(CFLAGS) -I$(LIBZ_DIR)" \
|
||||
LDFLAGS="-L$(LIBZ_DIR)" \
|
||||
make \
|
||||
-C $(LIBPNG_DIR) \
|
||||
-j
|
||||
|
||||
png: $(LIBPNG_LIB)
|
||||
|
||||
######### TEST ########
|
||||
|
||||
@ -86,11 +138,21 @@ $(TEST_BIN): $(HARNESS_OBJ) $(PNGTEST_OBJ) $(LIBPNG_LIB)
|
||||
$(CFLAGS) \
|
||||
$(LDFLAGS) \
|
||||
-o $@ \
|
||||
$(HARNESS_OBJ) $(PNGTEST_OBJ) $(LIBPNG_LIB) \
|
||||
-lz \
|
||||
$(HARNESS_OBJ) $(PNGTEST_OBJ) $(LIBPNG_LIB) $(LIBZ_LIB) \
|
||||
$(TEST_BIN_LDFLAGS) \
|
||||
|
||||
test_bin: $(TEST_BIN)
|
||||
|
||||
dowload: $(LIBZ_FILE) $(LIBPNG_FILE) $(HARNESS_FILE) $(PNGTEST_FILE)
|
||||
|
||||
clean:
|
||||
rm -rf $(LIBZ_DIR)
|
||||
rm -rf $(LIBPNG_DIR)
|
||||
rm -f $(HARNESS_OBJ)
|
||||
rm -f $(PNGTEST_OBJ)
|
||||
rm -f $(TEST_BIN)
|
||||
|
||||
clean_all:
|
||||
rm -rf $(BUILD_DIR)
|
||||
|
||||
qemu: $(TEST_BIN)
|
||||
|
@ -4,7 +4,7 @@ BUILD_DIR:=$(PWD)build/
|
||||
UNSTABLE_DATA_DIR:=$(BUILD_DIR)in/
|
||||
UNSTABLE_DATA_FILE:=$(UNSTABLE_DATA_DIR)in
|
||||
|
||||
UNSTABLE_BIN:=$(BUILD_DIR)unstable
|
||||
TEST_BIN:=$(BUILD_DIR)unstable
|
||||
UNSTABLE_SRC:=$(PWD)unstable.c
|
||||
|
||||
QEMU_OUT:=$(BUILD_DIR)qemu-out
|
||||
@ -42,7 +42,7 @@ endif
|
||||
|
||||
.PHONY: all 32 clean qemu frida
|
||||
|
||||
all: $(UNSTABLE_BIN)
|
||||
all: $(TEST_BIN)
|
||||
make -C $(ROOT)frida_mode/
|
||||
|
||||
32:
|
||||
@ -57,14 +57,14 @@ $(UNSTABLE_DATA_DIR): | $(BUILD_DIR)
|
||||
$(UNSTABLE_DATA_FILE): | $(UNSTABLE_DATA_DIR)
|
||||
echo -n "000" > $@
|
||||
|
||||
$(UNSTABLE_BIN): $(UNSTABLE_SRC) | $(BUILD_DIR)
|
||||
$(TEST_BIN): $(UNSTABLE_SRC) | $(BUILD_DIR)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILD_DIR)
|
||||
|
||||
|
||||
qemu: $(UNSTABLE_BIN) $(UNSTABLE_DATA_FILE)
|
||||
qemu: $(TEST_BIN) $(UNSTABLE_DATA_FILE)
|
||||
AFL_QEMU_PERSISTENT_ADDR=$(AFL_QEMU_PERSISTENT_ADDR) \
|
||||
$(ROOT)afl-fuzz \
|
||||
-D \
|
||||
@ -72,9 +72,9 @@ qemu: $(UNSTABLE_BIN) $(UNSTABLE_DATA_FILE)
|
||||
-i $(UNSTABLE_DATA_DIR) \
|
||||
-o $(QEMU_OUT) \
|
||||
-- \
|
||||
$(UNSTABLE_BIN) @@
|
||||
$(TEST_BIN) @@
|
||||
|
||||
frida: $(UNSTABLE_BIN) $(UNSTABLE_DATA_FILE)
|
||||
frida: $(TEST_BIN) $(UNSTABLE_DATA_FILE)
|
||||
AFL_DEBUG=1 \
|
||||
AFL_FRIDA_PERSISTENT_ADDR=$(AFL_FRIDA_PERSISTENT_ADDR) \
|
||||
AFL_FRIDA_INST_TRACE_UNIQUE=1 \
|
||||
@ -85,9 +85,9 @@ frida: $(UNSTABLE_BIN) $(UNSTABLE_DATA_FILE)
|
||||
-i $(UNSTABLE_DATA_DIR) \
|
||||
-o $(FRIDA_OUT) \
|
||||
-- \
|
||||
$(UNSTABLE_BIN) @@
|
||||
$(TEST_BIN) @@
|
||||
|
||||
frida_coverage: $(UNSTABLE_BIN) $(UNSTABLE_DATA_FILE)
|
||||
frida_coverage: $(TEST_BIN) $(UNSTABLE_DATA_FILE)
|
||||
AFL_FRIDA_PERSISTENT_ADDR=$(AFL_FRIDA_PERSISTENT_ADDR) \
|
||||
AFL_FRIDA_OUTPUT_STDOUT=/tmp/stdout.txt \
|
||||
AFL_FRIDA_OUTPUT_STDERR=/tmp/stderr.txt \
|
||||
@ -98,9 +98,9 @@ frida_coverage: $(UNSTABLE_BIN) $(UNSTABLE_DATA_FILE)
|
||||
-i $(UNSTABLE_DATA_DIR) \
|
||||
-o $(FRIDA_OUT) \
|
||||
-- \
|
||||
$(UNSTABLE_BIN) @@
|
||||
$(TEST_BIN) @@
|
||||
|
||||
frida_unstable: $(UNSTABLE_BIN) $(UNSTABLE_DATA_FILE)
|
||||
frida_unstable: $(TEST_BIN) $(UNSTABLE_DATA_FILE)
|
||||
AFL_DEBUG=1 \
|
||||
AFL_FRIDA_PERSISTENT_ADDR=$(AFL_FRIDA_PERSISTENT_ADDR) \
|
||||
AFL_FRIDA_OUTPUT_STDOUT=/tmp/stdout.txt \
|
||||
@ -112,10 +112,10 @@ frida_unstable: $(UNSTABLE_BIN) $(UNSTABLE_DATA_FILE)
|
||||
-i $(UNSTABLE_DATA_DIR) \
|
||||
-o $(FRIDA_OUT) \
|
||||
-- \
|
||||
$(UNSTABLE_BIN) @@
|
||||
$(TEST_BIN) @@
|
||||
|
||||
debug:
|
||||
gdb \
|
||||
--ex 'set environment LD_PRELOAD=$(ROOT)afl-frida-trace.so' \
|
||||
--ex 'set disassembly-flavor intel' \
|
||||
--args $(UNSTABLE_BIN) $(UNSTABLE_DATA_FILE)
|
||||
--args $(TEST_BIN) $(UNSTABLE_DATA_FILE)
|
||||
|
@ -1,8 +1,8 @@
|
||||
#!/bin/sh
|
||||
test -n "$1" && { echo This script has no options. It updates the referenced Frida version in GNUmakefile to the most current one. ; exit 1 ; }
|
||||
|
||||
OLD=$(egrep '^GUM_DEVKIT_VERSION=' GNUmakefile 2>/dev/null|awk -F= '{print$2}')
|
||||
NEW=$(curl https://github.com/frida/frida/releases/ 2>/dev/null|egrep 'frida-gum-devkit-[0-9.]*-linux-x86_64'|head -n 1|sed 's/.*frida-gum-devkit-//'|sed 's/-linux.*//')
|
||||
OLD=$(grep -E '^GUM_DEVKIT_VERSION=' GNUmakefile 2>/dev/null|awk -F= '{print$2}')
|
||||
NEW=$(curl https://github.com/frida/frida/releases/ 2>/dev/null|grep -E 'frida-gum-devkit-[0-9.]*-linux-x86_64'|head -n 1|sed 's/.*frida-gum-devkit-//'|sed 's/-linux.*//')
|
||||
|
||||
echo Current set version: $OLD
|
||||
echo Newest available version: $NEW
|
||||
|
@ -386,7 +386,8 @@ typedef struct afl_env_vars {
|
||||
afl_bench_until_crash, afl_debug_child, afl_autoresume, afl_cal_fast,
|
||||
afl_cycle_schedules, afl_expand_havoc, afl_statsd, afl_cmplog_only_new,
|
||||
afl_exit_on_seed_issues, afl_try_affinity, afl_ignore_problems,
|
||||
afl_keep_timeouts, afl_pizza_mode, afl_no_crash_readme;
|
||||
afl_keep_timeouts, afl_pizza_mode, afl_no_crash_readme,
|
||||
afl_no_startup_calibration;
|
||||
|
||||
u8 *afl_tmpdir, *afl_custom_mutator_library, *afl_python_module, *afl_path,
|
||||
*afl_hang_tmout, *afl_forksrv_init_tmout, *afl_preload,
|
||||
|
@ -26,7 +26,7 @@
|
||||
/* Version string: */
|
||||
|
||||
// c = release, a = volatile github dev, e = experimental branch
|
||||
#define VERSION "++4.02c"
|
||||
#define VERSION "++4.03c"
|
||||
|
||||
/******************************************************
|
||||
* *
|
||||
@ -153,8 +153,9 @@
|
||||
/* Number of calibration cycles per every new test case (and for test
|
||||
cases that show variable behavior): */
|
||||
|
||||
#define CAL_CYCLES 8U
|
||||
#define CAL_CYCLES_LONG 20U
|
||||
#define CAL_CYCLES_FAST 3U
|
||||
#define CAL_CYCLES 7U
|
||||
#define CAL_CYCLES_LONG 12U
|
||||
|
||||
/* Number of subsequent timeouts before abandoning an input file: */
|
||||
|
||||
|
@ -165,6 +165,7 @@ static char *afl_environment_variables[] = {
|
||||
"AFL_NO_FORKSRV",
|
||||
"AFL_NO_UI",
|
||||
"AFL_NO_PYTHON",
|
||||
"AFL_NO_STARTUP_CALIBRATION",
|
||||
"AFL_UNTRACER_FILE",
|
||||
"AFL_LLVM_USE_TRACE_PC",
|
||||
"AFL_MAP_SIZE",
|
||||
@ -197,6 +198,7 @@ static char *afl_environment_variables[] = {
|
||||
"AFL_QEMU_INST_RANGES",
|
||||
"AFL_QEMU_EXCLUDE_RANGES",
|
||||
"AFL_QEMU_SNAPSHOT",
|
||||
"AFL_QEMU_TRACK_UNSTABLE",
|
||||
"AFL_QUIET",
|
||||
"AFL_RANDOM_ALLOC_CANARY",
|
||||
"AFL_REAL_PATH",
|
||||
|
@ -57,7 +57,7 @@ typedef uint128_t u128;
|
||||
#define FS_OPT_SHDMEM_FUZZ 0x01000000
|
||||
#define FS_OPT_NEWCMPLOG 0x02000000
|
||||
#define FS_OPT_OLD_AFLPP_WORKAROUND 0x0f000000
|
||||
// FS_OPT_MAX_MAPSIZE is 8388608 = 0x800000 = 2^23 = 1 << 22
|
||||
// FS_OPT_MAX_MAPSIZE is 8388608 = 0x800000 = 2^23 = 1 << 23
|
||||
#define FS_OPT_MAX_MAPSIZE ((0x00fffffeU >> 1) + 1)
|
||||
#define FS_OPT_GET_MAPSIZE(x) (((x & 0x00fffffe) >> 1) + 1)
|
||||
#define FS_OPT_SET_MAPSIZE(x) \
|
||||
|
@ -38,7 +38,7 @@ many dead ends until we got to this:
|
||||
* Our compiler (afl-clang-lto/afl-clang-lto++) takes care of setting the correct
|
||||
LTO options and runs our own afl-ld linker instead of the system linker.
|
||||
* The LLVM linker collects all LTO files to link and instruments them so that we
|
||||
have non-colliding edge overage.
|
||||
have non-colliding edge coverage.
|
||||
* We use a new (for afl) edge coverage - which is the same as in llvm
|
||||
-fsanitize=coverage edge coverage mode. :)
|
||||
|
||||
@ -361,4 +361,4 @@ control flow graph.
|
||||
This is all now fixed with llvm 11+. The llvm's own linker is now able to load
|
||||
passes and this bypasses all problems we had.
|
||||
|
||||
Happy end :)
|
||||
Happy end :)
|
||||
|
@ -111,6 +111,12 @@ static cl::opt<bool> ClPruneBlocks(
|
||||
cl::desc("Reduce the number of instrumented blocks"), cl::Hidden,
|
||||
cl::init(true));
|
||||
|
||||
namespace llvm {
|
||||
|
||||
void initializeModuleSanitizerCoverageLTOLegacyPassPass(PassRegistry &PB);
|
||||
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
SanitizerCoverageOptions getOptions(int LegacyCoverageLevel) {
|
||||
@ -255,13 +261,13 @@ class ModuleSanitizerCoverageLTO
|
||||
|
||||
};
|
||||
|
||||
class ModuleSanitizerCoverageLegacyPass : public ModulePass {
|
||||
class ModuleSanitizerCoverageLTOLegacyPass : public ModulePass {
|
||||
|
||||
public:
|
||||
static char ID;
|
||||
StringRef getPassName() const override {
|
||||
|
||||
return "sancov";
|
||||
return "sancov-lto";
|
||||
|
||||
}
|
||||
|
||||
@ -272,11 +278,11 @@ class ModuleSanitizerCoverageLegacyPass : public ModulePass {
|
||||
|
||||
}
|
||||
|
||||
ModuleSanitizerCoverageLegacyPass(
|
||||
ModuleSanitizerCoverageLTOLegacyPass(
|
||||
const SanitizerCoverageOptions &Options = SanitizerCoverageOptions())
|
||||
: ModulePass(ID), Options(Options) {
|
||||
|
||||
initializeModuleSanitizerCoverageLegacyPassPass(
|
||||
initializeModuleSanitizerCoverageLTOLegacyPassPass(
|
||||
*PassRegistry::getPassRegistry());
|
||||
|
||||
}
|
||||
@ -318,8 +324,11 @@ llvmGetPassPluginInfo() {
|
||||
#if LLVM_VERSION_MAJOR <= 13
|
||||
using OptimizationLevel = typename PassBuilder::OptimizationLevel;
|
||||
#endif
|
||||
// PB.registerFullLinkTimeOptimizationLastEPCallback(
|
||||
#if LLVM_VERSION_MAJOR >= 15
|
||||
PB.registerFullLinkTimeOptimizationLastEPCallback(
|
||||
#else
|
||||
PB.registerOptimizerLastEPCallback(
|
||||
#endif
|
||||
[](ModulePassManager &MPM, OptimizationLevel OL) {
|
||||
|
||||
MPM.addPass(ModuleSanitizerCoverageLTO());
|
||||
@ -1750,30 +1759,21 @@ std::string ModuleSanitizerCoverageLTO::getSectionName(
|
||||
|
||||
}
|
||||
|
||||
char ModuleSanitizerCoverageLegacyPass::ID = 0;
|
||||
char ModuleSanitizerCoverageLTOLegacyPass::ID = 0;
|
||||
|
||||
INITIALIZE_PASS_BEGIN(ModuleSanitizerCoverageLegacyPass, "sancov",
|
||||
INITIALIZE_PASS_BEGIN(ModuleSanitizerCoverageLTOLegacyPass, "sancov-lto",
|
||||
"Pass for instrumenting coverage on functions", false,
|
||||
false)
|
||||
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||
INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass)
|
||||
INITIALIZE_PASS_END(ModuleSanitizerCoverageLegacyPass, "sancov",
|
||||
INITIALIZE_PASS_END(ModuleSanitizerCoverageLTOLegacyPass, "sancov-lto",
|
||||
"Pass for instrumenting coverage on functions", false,
|
||||
false)
|
||||
|
||||
ModulePass *llvm::createModuleSanitizerCoverageLegacyPassPass(
|
||||
const SanitizerCoverageOptions &Options,
|
||||
const std::vector<std::string> &AllowlistFiles,
|
||||
const std::vector<std::string> &BlocklistFiles) {
|
||||
|
||||
return new ModuleSanitizerCoverageLegacyPass(Options);
|
||||
|
||||
}
|
||||
|
||||
static void registerLTOPass(const PassManagerBuilder &,
|
||||
legacy::PassManagerBase &PM) {
|
||||
|
||||
auto p = new ModuleSanitizerCoverageLegacyPass();
|
||||
auto p = new ModuleSanitizerCoverageLTOLegacyPass();
|
||||
PM.add(p);
|
||||
|
||||
}
|
||||
|
@ -209,57 +209,6 @@ class ModuleSanitizerCoverageAFL
|
||||
|
||||
};
|
||||
|
||||
class ModuleSanitizerCoverageLegacyPass : public ModulePass {
|
||||
|
||||
public:
|
||||
ModuleSanitizerCoverageLegacyPass(
|
||||
const SanitizerCoverageOptions &Options = SanitizerCoverageOptions())
|
||||
: ModulePass(ID), Options(Options) {
|
||||
|
||||
initializeModuleSanitizerCoverageLegacyPassPass(
|
||||
*PassRegistry::getPassRegistry());
|
||||
|
||||
}
|
||||
|
||||
bool runOnModule(Module &M) override {
|
||||
|
||||
ModuleSanitizerCoverageAFL ModuleSancov(Options);
|
||||
auto DTCallback = [this](Function &F) -> const DominatorTree * {
|
||||
|
||||
return &this->getAnalysis<DominatorTreeWrapperPass>(F).getDomTree();
|
||||
|
||||
};
|
||||
|
||||
auto PDTCallback = [this](Function &F) -> const PostDominatorTree * {
|
||||
|
||||
return &this->getAnalysis<PostDominatorTreeWrapperPass>(F)
|
||||
.getPostDomTree();
|
||||
|
||||
};
|
||||
|
||||
return ModuleSancov.instrumentModule(M, DTCallback, PDTCallback);
|
||||
|
||||
}
|
||||
|
||||
/*static*/ char ID; // Pass identification, replacement for typeid
|
||||
StringRef getPassName() const override {
|
||||
|
||||
return "ModuleSanitizerCoverage";
|
||||
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
|
||||
AU.addRequired<DominatorTreeWrapperPass>();
|
||||
AU.addRequired<PostDominatorTreeWrapperPass>();
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
SanitizerCoverageOptions Options;
|
||||
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
#if LLVM_VERSION_MAJOR >= 11 /* use new pass manager */
|
||||
@ -850,7 +799,8 @@ void ModuleSanitizerCoverageAFL::CreateFunctionLocalArrays(
|
||||
bool ModuleSanitizerCoverageAFL::InjectCoverage(
|
||||
Function &F, ArrayRef<BasicBlock *> AllBlocks, bool IsLeafFunc) {
|
||||
|
||||
uint32_t cnt_cov = 0, cnt_sel = 0, cnt_sel_inc = 0;
|
||||
uint32_t cnt_cov = 0, cnt_sel = 0, cnt_sel_inc = 0;
|
||||
static uint32_t first = 1;
|
||||
|
||||
for (auto &BB : F) {
|
||||
|
||||
@ -876,9 +826,11 @@ bool ModuleSanitizerCoverageAFL::InjectCoverage(
|
||||
|
||||
}
|
||||
|
||||
if (FuncName.compare(StringRef("__afl_coverage_interesting"))) continue;
|
||||
if (!FuncName.compare(StringRef("__afl_coverage_interesting"))) {
|
||||
|
||||
cnt_cov++;
|
||||
cnt_cov++;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -917,7 +869,8 @@ bool ModuleSanitizerCoverageAFL::InjectCoverage(
|
||||
}
|
||||
|
||||
/* Create PCGUARD array */
|
||||
CreateFunctionLocalArrays(F, AllBlocks, cnt_cov + cnt_sel_inc);
|
||||
CreateFunctionLocalArrays(F, AllBlocks, first + cnt_cov + cnt_sel_inc);
|
||||
if (first) { first = 0; }
|
||||
selects += cnt_sel;
|
||||
|
||||
uint32_t special = 0, local_selects = 0, skip_next = 0;
|
||||
@ -1103,10 +1056,10 @@ bool ModuleSanitizerCoverageAFL::InjectCoverage(
|
||||
ModuleSanitizerCoverageAFL::SetNoSanitizeMetadata(MapPtr);
|
||||
|
||||
/*
|
||||
std::string errMsg;
|
||||
raw_string_ostream os(errMsg);
|
||||
result->print(os);
|
||||
fprintf(stderr, "X: %s\n", os.str().c_str());
|
||||
std::string errMsg;
|
||||
raw_string_ostream os(errMsg);
|
||||
result->print(os);
|
||||
fprintf(stderr, "X: %s\n", os.str().c_str());
|
||||
*/
|
||||
|
||||
while (1) {
|
||||
@ -1526,26 +1479,3 @@ std::string ModuleSanitizerCoverageAFL::getSectionEnd(
|
||||
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
char ModuleSanitizerCoverageLegacyPass::ID = 0;
|
||||
INITIALIZE_PASS_BEGIN(ModuleSanitizerCoverageLegacyPass, "sancov",
|
||||
"Pass for instrumenting coverage on functions", false,
|
||||
false)
|
||||
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
||||
INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass)
|
||||
INITIALIZE_PASS_END(ModuleSanitizerCoverageLegacyPass, "sancov",
|
||||
"Pass for instrumenting coverage on functions", false,
|
||||
false)
|
||||
ModulePass *llvm::createModuleSanitizerCoverageLegacyPassPass(
|
||||
const SanitizerCoverageOptions &Options,
|
||||
const std::vector<std::string> &AllowlistFiles,
|
||||
const std::vector<std::string> &BlocklistFiles) {
|
||||
|
||||
return new ModuleSanitizerCoverageLegacyPass(Options, AllowlistFiles,
|
||||
BlocklistFiles);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -288,11 +288,18 @@ static void __afl_map_shm(void) {
|
||||
|
||||
__afl_map_size = ++__afl_final_loc; // as we count starting 0
|
||||
|
||||
if (getenv("AFL_DUMP_MAP_SIZE")) {
|
||||
|
||||
printf("%u\n", __afl_map_size);
|
||||
exit(-1);
|
||||
|
||||
}
|
||||
|
||||
if (__afl_final_loc > MAP_SIZE) {
|
||||
|
||||
char *ptr;
|
||||
u32 val = 0;
|
||||
if ((ptr = getenv("AFL_MAP_SIZE")) != NULL) val = atoi(ptr);
|
||||
if ((ptr = getenv("AFL_MAP_SIZE")) != NULL) { val = atoi(ptr); }
|
||||
if (val < __afl_final_loc) {
|
||||
|
||||
if (__afl_final_loc > FS_OPT_MAX_MAPSIZE) {
|
||||
@ -325,6 +332,15 @@ static void __afl_map_shm(void) {
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if (getenv("AFL_DUMP_MAP_SIZE")) {
|
||||
|
||||
printf("%u\n", MAP_SIZE);
|
||||
exit(-1);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!id_str && __afl_area_ptr_dummy == __afl_area_initial) {
|
||||
|
@ -97,7 +97,7 @@ sudo modprobe kvm-intel # or kvm-amd for AMD processors
|
||||
If you want to fuzz in parallel (and you should!), then this has to be done in a
|
||||
special way:
|
||||
|
||||
* Instead of `-X` (standalone mode), you specify `-Y` (multi processor mode).
|
||||
* Instead of `-X` (standalone mode), you specify `-Y` (multiprocessor mode).
|
||||
* First, a Main afl-fuzz instance has to be started with `-M 0`.
|
||||
* Only afterwards you can start Secondary afl-fuzz instances, which must have an
|
||||
increasing number value, starting at 1, e.g., `-S 1`.
|
||||
|
@ -1 +1 @@
|
||||
a120c3feb5
|
||||
dc19175a0b
|
||||
|
Submodule qemu_mode/qemuafl updated: a120c3feb5...dc19175a0b
@ -203,7 +203,7 @@ static void read_initial_file(void) {
|
||||
/* Execute target application. Returns exec checksum, or 0 if program
|
||||
times out. */
|
||||
|
||||
static u32 analyze_run_target(u8 *mem, u32 len, u8 first_run) {
|
||||
static u64 analyze_run_target(u8 *mem, u32 len, u8 first_run) {
|
||||
|
||||
afl_fsrv_write_to_testcase(&fsrv, mem, len);
|
||||
fsrv_run_result_t ret = afl_fsrv_run_target(&fsrv, exec_tmout, &stop_soon);
|
||||
@ -528,7 +528,7 @@ static void analyze() {
|
||||
|
||||
for (i = 0; i < in_len; i++) {
|
||||
|
||||
u32 xor_ff, xor_01, sub_10, add_10;
|
||||
u64 xor_ff, xor_01, sub_10, add_10;
|
||||
u8 xff_orig, x01_orig, s10_orig, a10_orig;
|
||||
|
||||
/* Perform walking byte adjustments across the file. We perform four
|
||||
|
132
src/afl-cc.c
132
src/afl-cc.c
@ -51,7 +51,7 @@ static u32 cc_par_cnt = 1; /* Param count, including argv0 */
|
||||
static u8 clang_mode; /* Invoked as afl-clang*? */
|
||||
static u8 llvm_fullpath[PATH_MAX];
|
||||
static u8 instrument_mode, instrument_opt_mode, ngram_size, ctx_k, lto_mode;
|
||||
static u8 compiler_mode, plusplus_mode, have_instr_env = 0;
|
||||
static u8 compiler_mode, plusplus_mode, have_instr_env = 0, need_aflpplib = 0;
|
||||
static u8 have_gcc, have_llvm, have_gcc_plugin, have_lto, have_instr_list = 0;
|
||||
static u8 *lto_flag = AFL_CLANG_FLTO, *argvnull;
|
||||
static u8 debug;
|
||||
@ -310,6 +310,71 @@ static u8 *find_object(u8 *obj, u8 *argv0) {
|
||||
|
||||
}
|
||||
|
||||
void parse_fsanitize(char *string) {
|
||||
|
||||
char *p, *ptr = string + strlen("-fsanitize=");
|
||||
char *new = malloc(strlen(string) + 1);
|
||||
char *tmp = malloc(strlen(ptr));
|
||||
u32 count = 0, len, ende = 0;
|
||||
|
||||
if (!new || !tmp) { FATAL("could not aquire memory"); }
|
||||
strcpy(new, "-fsanitize=");
|
||||
|
||||
do {
|
||||
|
||||
p = strchr(ptr, ',');
|
||||
if (!p) {
|
||||
|
||||
p = ptr + strlen(ptr) + 1;
|
||||
ende = 1;
|
||||
|
||||
}
|
||||
|
||||
len = p - ptr;
|
||||
if (len) {
|
||||
|
||||
strncpy(tmp, ptr, len);
|
||||
tmp[len] = 0;
|
||||
// fprintf(stderr, "Found: %s\n", tmp);
|
||||
ptr += len + 1;
|
||||
if (*tmp) {
|
||||
|
||||
u32 copy = 1;
|
||||
if (!strcmp(tmp, "fuzzer")) {
|
||||
|
||||
need_aflpplib = 1;
|
||||
copy = 0;
|
||||
|
||||
} else if (!strncmp(tmp, "fuzzer", 6)) {
|
||||
|
||||
copy = 0;
|
||||
|
||||
}
|
||||
|
||||
if (copy) {
|
||||
|
||||
if (count) { strcat(new, ","); }
|
||||
strcat(new, tmp);
|
||||
++count;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
ptr++; /*fprintf(stderr, "NO!\n"); */
|
||||
|
||||
}
|
||||
|
||||
} while (!ende);
|
||||
|
||||
strcpy(string, new);
|
||||
// fprintf(stderr, "string: %s\n", string);
|
||||
// fprintf(stderr, "new: %s\n", new);
|
||||
|
||||
}
|
||||
|
||||
/* Copy argv to cc_params, making the necessary edits. */
|
||||
|
||||
static void edit_params(u32 argc, char **argv, char **envp) {
|
||||
@ -433,13 +498,10 @@ static void edit_params(u32 argc, char **argv, char **envp) {
|
||||
alloc_printf("-fplugin=%s/afl-gcc-cmptrs-pass.so", obj_path);
|
||||
cc_params[cc_par_cnt++] = fplugin_arg;
|
||||
|
||||
} else {
|
||||
|
||||
fplugin_arg = alloc_printf("-fplugin=%s/afl-gcc-pass.so", obj_path);
|
||||
cc_params[cc_par_cnt++] = fplugin_arg;
|
||||
|
||||
}
|
||||
|
||||
fplugin_arg = alloc_printf("-fplugin=%s/afl-gcc-pass.so", obj_path);
|
||||
cc_params[cc_par_cnt++] = fplugin_arg;
|
||||
cc_params[cc_par_cnt++] = "-fno-if-conversion";
|
||||
cc_params[cc_par_cnt++] = "-fno-if-conversion2";
|
||||
|
||||
@ -604,15 +666,21 @@ static void edit_params(u32 argc, char **argv, char **envp) {
|
||||
#endif
|
||||
free(ld_path);
|
||||
|
||||
#if defined(AFL_CLANG_LDPATH) && LLVM_MAJOR >= 13
|
||||
#if defined(AFL_CLANG_LDPATH) && LLVM_MAJOR >= 15
|
||||
// The NewPM implementation only works fully since LLVM 15.
|
||||
cc_params[cc_par_cnt++] = alloc_printf(
|
||||
"-Wl,--load-pass-plugin=%s/SanitizerCoverageLTO.so", obj_path);
|
||||
#elif defined(AFL_CLANG_LDPATH) && LLVM_MAJOR >= 13
|
||||
cc_params[cc_par_cnt++] = "-Wl,--lto-legacy-pass-manager";
|
||||
cc_params[cc_par_cnt++] =
|
||||
alloc_printf("-Wl,-mllvm=-load=%s/SanitizerCoverageLTO.so", obj_path);
|
||||
#else
|
||||
cc_params[cc_par_cnt++] = "-fno-experimental-new-pass-manager";
|
||||
cc_params[cc_par_cnt++] =
|
||||
alloc_printf("-Wl,-mllvm=-load=%s/SanitizerCoverageLTO.so", obj_path);
|
||||
#endif
|
||||
|
||||
cc_params[cc_par_cnt++] = "-Wl,--allow-multiple-definition";
|
||||
cc_params[cc_par_cnt++] =
|
||||
alloc_printf("-Wl,-mllvm=-load=%s/SanitizerCoverageLTO.so", obj_path);
|
||||
cc_params[cc_par_cnt++] = lto_flag;
|
||||
|
||||
} else {
|
||||
@ -759,6 +827,8 @@ static void edit_params(u32 argc, char **argv, char **envp) {
|
||||
|
||||
}
|
||||
|
||||
if (compiler_mode == GCC_PLUGIN && !strcmp(cur, "-pipe")) { continue; }
|
||||
|
||||
if (!strcmp(cur, "-z") || !strcmp(cur, "-Wl,-z")) {
|
||||
|
||||
u8 *param = *(argv + 1);
|
||||
@ -779,20 +849,35 @@ static void edit_params(u32 argc, char **argv, char **envp) {
|
||||
|
||||
}
|
||||
|
||||
if ((!strncmp(cur, "-fsanitize=fuzzer-", strlen("-fsanitize=fuzzer-")) ||
|
||||
!strncmp(cur, "-fsanitize-coverage", strlen("-fsanitize-coverage"))) &&
|
||||
(strncmp(cur, "sanitize-coverage-allow",
|
||||
strlen("sanitize-coverage-allow")) &&
|
||||
strncmp(cur, "sanitize-coverage-deny",
|
||||
strlen("sanitize-coverage-deny")) &&
|
||||
instrument_mode != INSTRUMENT_LLVMNATIVE)) {
|
||||
if (!strncmp(cur, "-fsanitize-coverage-", 20) && strstr(cur, "list=")) {
|
||||
|
||||
have_instr_list = 1;
|
||||
|
||||
}
|
||||
|
||||
if (!strncmp(cur, "-fsanitize=", strlen("-fsanitize=")) &&
|
||||
strchr(cur, ',')) {
|
||||
|
||||
parse_fsanitize(cur);
|
||||
if (!cur || strlen(cur) <= strlen("-fsanitize=")) { continue; }
|
||||
|
||||
} else if ((!strncmp(cur, "-fsanitize=fuzzer-",
|
||||
|
||||
strlen("-fsanitize=fuzzer-")) ||
|
||||
!strncmp(cur, "-fsanitize-coverage",
|
||||
strlen("-fsanitize-coverage"))) &&
|
||||
(strncmp(cur, "sanitize-coverage-allow",
|
||||
strlen("sanitize-coverage-allow")) &&
|
||||
strncmp(cur, "sanitize-coverage-deny",
|
||||
strlen("sanitize-coverage-deny")) &&
|
||||
instrument_mode != INSTRUMENT_LLVMNATIVE)) {
|
||||
|
||||
if (!be_quiet) { WARNF("Found '%s' - stripping!", cur); }
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
if (!strcmp(cur, "-fsanitize=fuzzer")) {
|
||||
if (need_aflpplib || !strcmp(cur, "-fsanitize=fuzzer")) {
|
||||
|
||||
u8 *afllib = find_object("libAFLDriver.a", argv[0]);
|
||||
|
||||
@ -823,7 +908,15 @@ static void edit_params(u32 argc, char **argv, char **envp) {
|
||||
|
||||
}
|
||||
|
||||
continue;
|
||||
if (need_aflpplib) {
|
||||
|
||||
need_aflpplib = 0;
|
||||
|
||||
} else {
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -831,9 +924,6 @@ static void edit_params(u32 argc, char **argv, char **envp) {
|
||||
if (!strcmp(cur, "armv7a-linux-androideabi")) bit_mode = 32;
|
||||
if (!strcmp(cur, "-m64")) bit_mode = 64;
|
||||
|
||||
if (!strncmp(cur, "-fsanitize-coverage-", 20) && strstr(cur, "list="))
|
||||
have_instr_list = 1;
|
||||
|
||||
if (!strcmp(cur, "-fsanitize=address") || !strcmp(cur, "-fsanitize=memory"))
|
||||
asan_set = 1;
|
||||
|
||||
|
@ -2420,7 +2420,9 @@ void get_core_count(afl_state_t *afl) {
|
||||
|
||||
} else if ((s64)cur_runnable + 1 <= (s64)afl->cpu_core_count) {
|
||||
|
||||
OKF("Try parallel jobs - see %s/parallel_fuzzing.md.", doc_path);
|
||||
OKF("Try parallel jobs - see "
|
||||
"%s/fuzzing_in_depth.md#c-using-multiple-cores",
|
||||
doc_path);
|
||||
|
||||
}
|
||||
|
||||
|
@ -795,8 +795,14 @@ void cull_queue(afl_state_t *afl) {
|
||||
|
||||
u32 calculate_score(afl_state_t *afl, struct queue_entry *q) {
|
||||
|
||||
u32 avg_exec_us = afl->total_cal_us / afl->total_cal_cycles;
|
||||
u32 avg_bitmap_size = afl->total_bitmap_size / afl->total_bitmap_entries;
|
||||
u32 cal_cycles = afl->total_cal_cycles;
|
||||
u32 bitmap_entries = afl->total_bitmap_entries;
|
||||
|
||||
if (unlikely(!cal_cycles)) { cal_cycles = 1; }
|
||||
if (unlikely(!bitmap_entries)) { bitmap_entries = 1; }
|
||||
|
||||
u32 avg_exec_us = afl->total_cal_us / cal_cycles;
|
||||
u32 avg_bitmap_size = afl->total_bitmap_size / bitmap_entries;
|
||||
u32 perf_score = 100;
|
||||
|
||||
/* Adjust score based on execution speed of this path, compared to the
|
||||
|
@ -363,7 +363,7 @@ u8 calibrate_case(afl_state_t *afl, struct queue_entry *q, u8 *use_mem,
|
||||
++q->cal_failed;
|
||||
|
||||
afl->stage_name = "calibration";
|
||||
afl->stage_max = afl->afl_env.afl_cal_fast ? 3 : CAL_CYCLES;
|
||||
afl->stage_max = afl->afl_env.afl_cal_fast ? CAL_CYCLES_FAST : CAL_CYCLES;
|
||||
|
||||
/* Make sure the forkserver is up before we do anything, and let's not
|
||||
count its spin-up time toward binary calibration. */
|
||||
|
@ -265,6 +265,13 @@ void read_afl_environment(afl_state_t *afl, char **envp) {
|
||||
afl->afl_env.afl_cmplog_only_new =
|
||||
get_afl_env(afl_environment_variables[i]) ? 1 : 0;
|
||||
|
||||
} else if (!strncmp(env, "AFL_NO_STARTUP_CALIBRATION",
|
||||
|
||||
afl_environment_variable_len)) {
|
||||
|
||||
afl->afl_env.afl_no_startup_calibration =
|
||||
get_afl_env(afl_environment_variables[i]) ? 1 : 0;
|
||||
|
||||
} else if (!strncmp(env, "AFL_NO_UI", afl_environment_variable_len)) {
|
||||
|
||||
afl->afl_env.afl_no_ui =
|
||||
@ -597,15 +604,7 @@ void read_afl_environment(afl_state_t *afl, char **envp) {
|
||||
|
||||
}
|
||||
|
||||
if (afl->afl_env.afl_pizza_mode == 0) {
|
||||
|
||||
afl->afl_env.afl_pizza_mode = 1;
|
||||
|
||||
} else {
|
||||
|
||||
afl->pizza_is_served = 1;
|
||||
|
||||
}
|
||||
if (afl->afl_env.afl_pizza_mode) { afl->pizza_is_served = 1; }
|
||||
|
||||
if (issue_detected) { sleep(2); }
|
||||
|
||||
|
@ -2105,7 +2105,9 @@ void show_init_stats(afl_state_t *afl) {
|
||||
? 50000
|
||||
: 10000)) {
|
||||
|
||||
WARNF(cLRD "The target binary is pretty slow! See %s/perf_tips.md.",
|
||||
WARNF(cLRD
|
||||
"The target binary is pretty slow! See "
|
||||
"%s/fuzzing_in_depth.md#i-improve-the-speed",
|
||||
doc_path);
|
||||
|
||||
}
|
||||
@ -2134,13 +2136,17 @@ void show_init_stats(afl_state_t *afl) {
|
||||
|
||||
if (max_len > 50 * 1024) {
|
||||
|
||||
WARNF(cLRD "Some test cases are huge (%s) - see %s/perf_tips.md!",
|
||||
WARNF(cLRD
|
||||
"Some test cases are huge (%s) - see "
|
||||
"%s/fuzzing_in_depth.md#i-improve-the-speed",
|
||||
stringify_mem_size(IB(0), max_len), doc_path);
|
||||
|
||||
} else if (max_len > 10 * 1024) {
|
||||
|
||||
WARNF("Some test cases are big (%s) - see %s/perf_tips.md.",
|
||||
stringify_mem_size(IB(0), max_len), doc_path);
|
||||
WARNF(
|
||||
"Some test cases are big (%s) - see "
|
||||
"%s/fuzzing_in_depth.md#i-improve-the-speed",
|
||||
stringify_mem_size(IB(0), max_len), doc_path);
|
||||
|
||||
}
|
||||
|
||||
|
@ -192,9 +192,9 @@ static void usage(u8 *argv0, int more_help) {
|
||||
"executions.\n\n"
|
||||
|
||||
"Other stuff:\n"
|
||||
" -M/-S id - distributed mode (see docs/parallel_fuzzing.md)\n"
|
||||
" -M auto-sets -D, -Z (use -d to disable -D) and no "
|
||||
"trimming\n"
|
||||
" -M/-S id - distributed mode (-M sets -Z and disables trimming)\n"
|
||||
" see docs/fuzzing_in_depth.md#c-using-multiple-cores\n"
|
||||
" for effective recommendations for parallel fuzzing.\n"
|
||||
" -F path - sync to a foreign fuzzer queue directory (requires "
|
||||
"-M, can\n"
|
||||
" be specified up to %u times)\n"
|
||||
@ -273,6 +273,7 @@ static void usage(u8 *argv0, int more_help) {
|
||||
"AFL_NO_CPU_RED: avoid red color for showing very high cpu usage\n"
|
||||
"AFL_NO_FORKSRV: run target via execve instead of using the forkserver\n"
|
||||
"AFL_NO_SNAPSHOT: do not use the snapshot feature (if the snapshot lkm is loaded)\n"
|
||||
"AFL_NO_STARTUP_CALIBRATION: no initial seed calibration, start fuzzing at once\n"
|
||||
"AFL_NO_UI: switch status screen off\n"
|
||||
|
||||
DYN_COLOR
|
||||
@ -2150,7 +2151,16 @@ int main(int argc, char **argv_orig, char **envp) {
|
||||
memset(afl->virgin_tmout, 255, map_size);
|
||||
memset(afl->virgin_crash, 255, map_size);
|
||||
|
||||
perform_dry_run(afl);
|
||||
if (likely(!afl->afl_env.afl_no_startup_calibration)) {
|
||||
|
||||
perform_dry_run(afl);
|
||||
|
||||
} else {
|
||||
|
||||
ACTF("skipping initial seed calibration due option override");
|
||||
usleep(1000);
|
||||
|
||||
}
|
||||
|
||||
if (afl->q_testcase_max_cache_entries) {
|
||||
|
||||
@ -2550,7 +2560,7 @@ stop_fuzzing:
|
||||
write_bitmap(afl);
|
||||
save_auto(afl);
|
||||
|
||||
if (afl->afl_env.afl_pizza_mode) {
|
||||
if (afl->pizza_is_served) {
|
||||
|
||||
SAYF(CURSOR_SHOW cLRD "\n\n+++ Baking aborted %s +++\n" cRST,
|
||||
afl->stop_soon == 2 ? "programmatically" : "by the chef");
|
||||
|
@ -19,7 +19,8 @@
|
||||
|
||||
This tool provides a fairly accurate measurement of CPU preemption rate.
|
||||
It is meant to complement the quick-and-dirty load average widget shown
|
||||
in the afl-fuzz UI. See docs/parallel_fuzzing.md for more info.
|
||||
in the afl-fuzz UI. See docs/fuzzing_in_depth.md#c-using-multiple-cores
|
||||
for more info.
|
||||
|
||||
For some work loads, the tool may actually suggest running more instances
|
||||
than you have CPU cores. This can happen if the tested program is spending
|
||||
|
@ -1240,7 +1240,16 @@ int main(int argc, char **argv_orig, char **envp) {
|
||||
|
||||
u32 save_be_quiet = be_quiet;
|
||||
be_quiet = !debug;
|
||||
fsrv->map_size = 4194304; // dummy temporary value
|
||||
if (map_size > 4194304) {
|
||||
|
||||
fsrv->map_size = map_size;
|
||||
|
||||
} else {
|
||||
|
||||
fsrv->map_size = 4194304; // dummy temporary value
|
||||
|
||||
}
|
||||
|
||||
u32 new_map_size =
|
||||
afl_fsrv_get_mapsize(fsrv, use_argv, &stop_soon,
|
||||
(get_afl_env("AFL_DEBUG_CHILD") ||
|
||||
|
@ -48,7 +48,7 @@ test "$SYS" = "i686" -o "$SYS" = "x86_64" -o "$SYS" = "amd64" -o "$SYS" = "i86pc
|
||||
$ECHO "$GREEN[+] ${AFL_GCC} hardened mode succeeded and is working"
|
||||
} || {
|
||||
$ECHO "$RED[!] ${AFL_GCC} hardened mode is not hardened"
|
||||
env | egrep 'AFL|PATH|LLVM'
|
||||
env | grep -E 'AFL|PATH|LLVM'
|
||||
AFL_DEBUG=1 AFL_HARDEN=1 ../${AFL_GCC} -o test-compcov.harden test-compcov.c
|
||||
nm test-compcov.harden
|
||||
CODE=1
|
||||
|
@ -1 +1 @@
|
||||
06796154996fef2d92ccd172181ee0cdf3631959
|
||||
6e00ceac
|
||||
|
@ -196,13 +196,23 @@ $MAKECMD -j1 || exit 1
|
||||
echo "[+] Build process successful!"
|
||||
|
||||
echo "[*] Installing Unicorn python bindings..."
|
||||
cd unicorn/bindings/python || exit 1
|
||||
if [ -z "$VIRTUAL_ENV" ]; then
|
||||
echo "[*] Info: Installing python unicornafl using --user"
|
||||
THREADS=$CORES $PYTHONBIN setup.py install --user --force --prefix=|| exit 1
|
||||
else
|
||||
echo "[*] Info: Installing python unicornafl to virtualenv: $VIRTUAL_ENV"
|
||||
THREADS=$CORES $PYTHONBIN setup.py install --force || exit 1
|
||||
fi
|
||||
cd ../../../
|
||||
echo "[*] Installing Unicornafl python bindings..."
|
||||
cd bindings/python || exit 1
|
||||
if [ -z "$VIRTUAL_ENV" ]; then
|
||||
echo "[*] Info: Installing python unicornafl using --user"
|
||||
$PYTHONBIN setup.py install --user --force --prefix=|| exit 1
|
||||
THREADS=$CORES $PYTHONBIN setup.py install --user --force --prefix=|| exit 1
|
||||
else
|
||||
echo "[*] Info: Installing python unicornafl to virtualenv: $VIRTUAL_ENV"
|
||||
$PYTHONBIN setup.py install --force || exit 1
|
||||
THREADS=$CORES $PYTHONBIN setup.py install --force || exit 1
|
||||
fi
|
||||
echo '[*] If needed, you can (re)install the bindings from `./unicornafl/bindings/python` using `python setup.py install`'
|
||||
|
||||
|
Submodule unicorn_mode/unicornafl updated: 0679615499...6e00ceac6f
@ -62,8 +62,11 @@ extern unsigned int *__afl_fuzz_len;
|
||||
extern unsigned char *__afl_fuzz_ptr;
|
||||
|
||||
// libFuzzer interface is thin, so we don't include any libFuzzer headers.
|
||||
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
|
||||
__attribute__((weak)) int LLVMFuzzerTestOneInput(const uint8_t *Data,
|
||||
size_t Size);
|
||||
__attribute__((weak)) int LLVMFuzzerInitialize(int *argc, char ***argv);
|
||||
int LLVMFuzzerRunDriver(int *argc, char ***argv,
|
||||
int (*callback)(const uint8_t *data, size_t size));
|
||||
|
||||
// Default nop ASan hooks for manual posisoning when not linking the ASan
|
||||
// runtime
|
||||
@ -195,7 +198,9 @@ size_t LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize) {
|
||||
}
|
||||
|
||||
// Execute any files provided as parameters.
|
||||
static int ExecuteFilesOnyByOne(int argc, char **argv) {
|
||||
static int ExecuteFilesOnyByOne(int argc, char **argv,
|
||||
int (*callback)(const uint8_t *data,
|
||||
size_t size)) {
|
||||
|
||||
unsigned char *buf = (unsigned char *)malloc(MAX_FILE);
|
||||
|
||||
@ -231,7 +236,7 @@ static int ExecuteFilesOnyByOne(int argc, char **argv) {
|
||||
prev_length = length;
|
||||
|
||||
printf("Reading %zu bytes from %s\n", length, argv[i]);
|
||||
LLVMFuzzerTestOneInput(buf, length);
|
||||
callback(buf, length);
|
||||
printf("Execution successful.\n");
|
||||
|
||||
}
|
||||
@ -245,7 +250,7 @@ static int ExecuteFilesOnyByOne(int argc, char **argv) {
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
__attribute__((weak)) int main(int argc, char **argv) {
|
||||
|
||||
if (argc < 2 || strncmp(argv[1], "-h", 2) == 0)
|
||||
printf(
|
||||
@ -265,6 +270,16 @@ int main(int argc, char **argv) {
|
||||
"===================================================================\n",
|
||||
argv[0], argv[0]);
|
||||
|
||||
return LLVMFuzzerRunDriver(&argc, &argv, LLVMFuzzerTestOneInput);
|
||||
|
||||
}
|
||||
|
||||
int LLVMFuzzerRunDriver(int *argcp, char ***argvp,
|
||||
int (*callback)(const uint8_t *data, size_t size)) {
|
||||
|
||||
int argc = *argcp;
|
||||
char **argv = *argvp;
|
||||
|
||||
if (getenv("AFL_GDB")) {
|
||||
|
||||
char cmd[64];
|
||||
@ -299,7 +314,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
__afl_sharedmem_fuzzing = 0;
|
||||
__afl_manual_init();
|
||||
return ExecuteFilesOnyByOne(argc, argv);
|
||||
return ExecuteFilesOnyByOne(argc, argv, callback);
|
||||
|
||||
} else if (argc == 2 && argv[1][0] == '-') {
|
||||
|
||||
@ -315,7 +330,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
if (argc == 2) { __afl_manual_init(); }
|
||||
|
||||
return ExecuteFilesOnyByOne(argc, argv);
|
||||
return ExecuteFilesOnyByOne(argc, argv, callback);
|
||||
|
||||
}
|
||||
|
||||
@ -325,7 +340,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
// Call LLVMFuzzerTestOneInput here so that coverage caused by initialization
|
||||
// on the first execution of LLVMFuzzerTestOneInput is ignored.
|
||||
LLVMFuzzerTestOneInput(dummy_input, 4);
|
||||
callback(dummy_input, 4);
|
||||
|
||||
__asan_poison_memory_region(__afl_fuzz_ptr, MAX_FILE);
|
||||
size_t prev_length = 0;
|
||||
@ -352,7 +367,7 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
|
||||
prev_length = length;
|
||||
LLVMFuzzerTestOneInput(__afl_fuzz_ptr, length);
|
||||
(void)callback(__afl_fuzz_ptr, length);
|
||||
|
||||
}
|
||||
|
||||
@ -362,7 +377,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
while (__afl_persistent_loop(N)) {
|
||||
|
||||
LLVMFuzzerTestOneInput(__afl_fuzz_ptr, *__afl_fuzz_len);
|
||||
callback(__afl_fuzz_ptr, *__afl_fuzz_len);
|
||||
|
||||
}
|
||||
|
||||
|
@ -92,14 +92,14 @@ mkdir "$DIR" || exit 1
|
||||
|
||||
if [ -n "$3" -a -s "$DIR/../edges.txt" ]; then
|
||||
|
||||
cat "$DIR/"* | sed 's/:.*//' | sort -n | uniq -c | egrep '^[ \t]*1 ' | awk '{print$2}' > $DIR/../unique.txt
|
||||
cat "$DIR/"* | sed 's/:.*//' | sort -n | uniq -c | grep -E '^[ \t]*1 ' | awk '{print$2}' > $DIR/../unique.txt
|
||||
|
||||
if [ -s "$DIR/../unique.txt" ]; then
|
||||
|
||||
ls "$DIR/id:"* | grep -v ",sync:" |sed 's/.*\/id:/id:/g' | while read file; do
|
||||
|
||||
CNT=$(sed 's/:.*//' "$DIR/$file" | tee "$DIR/../tmp.txt" | wc -l)
|
||||
DIFF=$(diff -u "$DIR/../tmp.txt" "$DIR/../unique.txt" | egrep '^-[0-9]' | wc -l)
|
||||
DIFF=$(diff -u "$DIR/../tmp.txt" "$DIR/../unique.txt" | grep -E '^-[0-9]' | wc -l)
|
||||
UNIQUE=$(($CNT - $DIFF))
|
||||
sed -i "s/;UNIQUE$file/;$UNIQUE/" "$DIR/../queue.csv" "$2"
|
||||
|
||||
|
@ -304,7 +304,8 @@ static void *__dislocator_alloc(size_t len) {
|
||||
/* The "user-facing" wrapper for calloc(). This just checks for overflows and
|
||||
displays debug messages if requested. */
|
||||
|
||||
void *calloc(size_t elem_len, size_t elem_cnt) {
|
||||
__attribute__((malloc)) __attribute__((alloc_size(1, 2))) void *calloc(
|
||||
size_t elem_len, size_t elem_cnt) {
|
||||
|
||||
void *ret;
|
||||
|
||||
@ -339,7 +340,8 @@ void *calloc(size_t elem_len, size_t elem_cnt) {
|
||||
memory (unlike calloc(), malloc() is not guaranteed to return zeroed
|
||||
memory). */
|
||||
|
||||
void *malloc(size_t len) {
|
||||
__attribute__((malloc)) __attribute__((alloc_size(1))) void *malloc(
|
||||
size_t len) {
|
||||
|
||||
void *ret;
|
||||
|
||||
@ -398,7 +400,7 @@ void free(void *ptr) {
|
||||
/* Realloc is pretty straightforward, too. We forcibly reallocate the buffer,
|
||||
move data, and then free (aka mprotect()) the original one. */
|
||||
|
||||
void *realloc(void *ptr, size_t len) {
|
||||
__attribute__((alloc_size(2))) void *realloc(void *ptr, size_t len) {
|
||||
|
||||
void *ret;
|
||||
|
||||
@ -450,7 +452,8 @@ int posix_memalign(void **ptr, size_t align, size_t len) {
|
||||
|
||||
/* just the non-posix fashion */
|
||||
|
||||
void *memalign(size_t align, size_t len) {
|
||||
__attribute__((malloc)) __attribute__((alloc_size(2))) void *memalign(
|
||||
size_t align, size_t len) {
|
||||
|
||||
void *ret = NULL;
|
||||
|
||||
@ -466,7 +469,8 @@ void *memalign(size_t align, size_t len) {
|
||||
|
||||
/* sort of C11 alias of memalign only more severe, alignment-wise */
|
||||
|
||||
void *aligned_alloc(size_t align, size_t len) {
|
||||
__attribute__((malloc)) __attribute__((alloc_size(2))) void *aligned_alloc(
|
||||
size_t align, size_t len) {
|
||||
|
||||
void *ret = NULL;
|
||||
|
||||
@ -484,7 +488,8 @@ void *aligned_alloc(size_t align, size_t len) {
|
||||
|
||||
/* specific BSD api mainly checking possible overflow for the size */
|
||||
|
||||
void *reallocarray(void *ptr, size_t elem_len, size_t elem_cnt) {
|
||||
__attribute__((alloc_size(2, 3))) void *reallocarray(void *ptr, size_t elem_len,
|
||||
size_t elem_cnt) {
|
||||
|
||||
const size_t elem_lim = 1UL << (sizeof(size_t) * 4);
|
||||
const size_t elem_tot = elem_len * elem_cnt;
|
||||
|
@ -354,7 +354,7 @@ static void __tokencap_dump(const u8 *ptr, size_t len, u8 is_text) {
|
||||
|
||||
#undef strcmp
|
||||
|
||||
int strcmp(const char *str1, const char *str2) {
|
||||
__attribute__((hot)) int strcmp(const char *str1, const char *str2) {
|
||||
|
||||
if (__tokencap_is_ro(str1)) __tokencap_dump(str1, strlen(str1), 1);
|
||||
if (__tokencap_is_ro(str2)) __tokencap_dump(str2, strlen(str2), 1);
|
||||
@ -378,7 +378,8 @@ int strcmp(const char *str1, const char *str2) {
|
||||
|
||||
#undef strncmp
|
||||
|
||||
int strncmp(const char *str1, const char *str2, size_t len) {
|
||||
__attribute__((hot)) int strncmp(const char *str1, const char *str2,
|
||||
size_t len) {
|
||||
|
||||
if (__tokencap_is_ro(str1)) __tokencap_dump(str1, len, 1);
|
||||
if (__tokencap_is_ro(str2)) __tokencap_dump(str2, len, 1);
|
||||
@ -404,7 +405,7 @@ int strncmp(const char *str1, const char *str2, size_t len) {
|
||||
|
||||
#undef strcasecmp
|
||||
|
||||
int strcasecmp(const char *str1, const char *str2) {
|
||||
__attribute__((hot)) int strcasecmp(const char *str1, const char *str2) {
|
||||
|
||||
if (__tokencap_is_ro(str1)) __tokencap_dump(str1, strlen(str1), 1);
|
||||
if (__tokencap_is_ro(str2)) __tokencap_dump(str2, strlen(str2), 1);
|
||||
@ -428,7 +429,8 @@ int strcasecmp(const char *str1, const char *str2) {
|
||||
|
||||
#undef strncasecmp
|
||||
|
||||
int strncasecmp(const char *str1, const char *str2, size_t len) {
|
||||
__attribute__((hot)) int strncasecmp(const char *str1, const char *str2,
|
||||
size_t len) {
|
||||
|
||||
if (__tokencap_is_ro(str1)) __tokencap_dump(str1, len, 1);
|
||||
if (__tokencap_is_ro(str2)) __tokencap_dump(str2, len, 1);
|
||||
@ -454,7 +456,8 @@ int strncasecmp(const char *str1, const char *str2, size_t len) {
|
||||
|
||||
#undef memcmp
|
||||
|
||||
int memcmp(const void *mem1, const void *mem2, size_t len) {
|
||||
__attribute__((hot)) int memcmp(const void *mem1, const void *mem2,
|
||||
size_t len) {
|
||||
|
||||
if (__tokencap_is_ro(mem1)) __tokencap_dump(mem1, len, 0);
|
||||
if (__tokencap_is_ro(mem2)) __tokencap_dump(mem2, len, 0);
|
||||
@ -481,7 +484,7 @@ int memcmp(const void *mem1, const void *mem2, size_t len) {
|
||||
|
||||
#undef bcmp
|
||||
|
||||
int bcmp(const void *mem1, const void *mem2, size_t len) {
|
||||
__attribute__((hot)) int bcmp(const void *mem1, const void *mem2, size_t len) {
|
||||
|
||||
if (__tokencap_is_ro(mem1)) __tokencap_dump(mem1, len, 0);
|
||||
if (__tokencap_is_ro(mem2)) __tokencap_dump(mem2, len, 0);
|
||||
@ -508,7 +511,7 @@ int bcmp(const void *mem1, const void *mem2, size_t len) {
|
||||
|
||||
#undef strstr
|
||||
|
||||
char *strstr(const char *haystack, const char *needle) {
|
||||
__attribute__((hot)) char *strstr(const char *haystack, const char *needle) {
|
||||
|
||||
if (__tokencap_is_ro(haystack))
|
||||
__tokencap_dump(haystack, strlen(haystack), 1);
|
||||
@ -537,7 +540,8 @@ char *strstr(const char *haystack, const char *needle) {
|
||||
|
||||
#undef strcasestr
|
||||
|
||||
char *strcasestr(const char *haystack, const char *needle) {
|
||||
__attribute__((hot)) char *strcasestr(const char *haystack,
|
||||
const char *needle) {
|
||||
|
||||
if (__tokencap_is_ro(haystack))
|
||||
__tokencap_dump(haystack, strlen(haystack), 1);
|
||||
@ -566,8 +570,8 @@ char *strcasestr(const char *haystack, const char *needle) {
|
||||
|
||||
#undef memmem
|
||||
|
||||
void *memmem(const void *haystack, size_t haystack_len, const void *needle,
|
||||
size_t needle_len) {
|
||||
__attribute__((hot)) void *memmem(const void *haystack, size_t haystack_len,
|
||||
const void *needle, size_t needle_len) {
|
||||
|
||||
if (__tokencap_is_ro(haystack)) __tokencap_dump(haystack, haystack_len, 1);
|
||||
|
||||
|
Reference in New Issue
Block a user