mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-09 16:51:34 +00:00
* sync (#886) * Create FUNDING.yml * Update FUNDING.yml * moved custom_mutator examples * unicorn speedtest makefile cleanup * fixed example location * fix qdbi * update util readme * Frida persistent (#880) * Added x64 support for persistent mode (function call only), in-memory teest cases and complog * Review changes, fix NeverZero and code to parse the .text section of the main executable. Excluded ranges TBC * Various minor fixes and finished support for AFL_INST_LIBS * Review changes Co-authored-by: Your Name <you@example.com> * nits * fix frida mode * Integer overflow/underflow fixes in libdislocator (#889) * libdislocator: fixing integer overflow in 'max_mem' variable and setting 'max_mem' type to 'size_t' * libdislocator: fixing potential integer underflow in 'total_mem' variable due to its different values in different threads * Bumped warnings up to the max and fixed remaining issues (#890) Co-authored-by: Your Name <you@example.com> * nits * frida mode - support non-pie * nits * nit * update grammar mutator * Fixes for aarch64, OSX and other minor issues (#891) Co-authored-by: Your Name <you@example.com> * nits * nits * fix PCGUARD, build aflpp_driver with fPIC * Added representative fuzzbench test and test for libxml (#893) * Added representative fuzzbench test and test for libxml * Added support for building FRIDA from source with FRIDA_SOURCE=1 Co-authored-by: Your Name <you@example.com> * nits * update changelog * typos * fixed potential double free in custom trim (#881) * error handling, freeing mem * frida: complog -> cmplog * fix statsd writing * let aflpp_qemu_driver_hook.so build fail gracefully * fix stdin trimming * Support for AFL_ENTRYPOINT (#898) Co-authored-by: Your Name <you@example.com> * remove the input file .cur_input at the end of the fuzzing, if AFL_TMPDIR is used * reverse push (#901) * Create FUNDING.yml * Update FUNDING.yml * disable QEMU static pie Co-authored-by: Andrea Fioraldi <andreafioraldi@gmail.com> * clarify that no modifications are required. * add new test for frida_mode (please review) * typos * fix persistent mode (64-bit) * set ARCH for linux intel 32-bit for frida-gum-devkit * prepare for 32-bit support (later) * not on qemu 3 anymore * unicorn mips fixes * instrumentation further move to C++11 (#900) * unicorn fixes * more unicorn fixes * Fix memory errors when trim causes testcase growth (#881) (#903) * Revert "fixed potential double free in custom trim (#881)" This reverts commit e9d2f72382cab75832721d859c3e731da071435d. * Revert "fix custom trim for increasing data" This reverts commit 86a8ef168dda766d2f25f15c15c4d3ecf21d0667. * Fix memory errors when trim causes testcase growth Modify trim_case_custom to avoid writing into in_buf because some custom mutators can cause the testcase to grow rather than shrink. Instead of modifying in_buf directly, we write the update out to the disk when trimming is complete, and then the caller is responsible for refreshing the in-memory buffer from the file. This is still a bit sketchy because it does need to modify q->len in order to notify the upper layers that something changed, and it could end up telling upper layer code that the q->len is *bigger* than the buffer (q->testcase_buf) that contains it, which is asking for trouble down the line somewhere... * Fix an unlikely situation Put back some `unlikely()` calls that were in the e9d2f72382cab75832721d859c3e731da071435d commit that was reverted. * typo * Exit on time (#904) * Variable AFL_EXIT_ON_TIME description has been added. Variables AFL_EXIT_ON_TIME and afl_exit_on_time has been added. afl->exit_on_time variable initialization has been added. The asignment of a value to the afl->afl_env.afl_exit_on_time variable from environment variables has been added. Code to exit on timeout if new path not found has been added. * Type of afl_exit_on_time variable has been changed. Variable exit_on_time has been added to the afl_state_t structure. * Command `export AFL_EXIT_WHEN_DONE=1` has been added. * Millisecond to second conversion has been added. Call get_cur_time() has been added. * Revert to using the saved current time value. * Useless check has been removed. * fix new path to custom-mutators * ensure crashes/README.txt exists * fix * Changes to bump FRIDA version and to clone FRIDA repo in to build directory rather than use a submodule as the FRIDA build scripts don't like it (#906) Co-authored-by: Your Name <you@example.com> * Fix numeric overflow in cmplog implementation (#907) Co-authored-by: Your Name <you@example.com> * testcase fixes for unicorn * remove merge conflict artifacts * fix afl-plot * Changes to remove binaries from frida_mode (#913) Co-authored-by: Your Name <you@example.com> * Frida cmplog fail fast (#914) * Changes to remove binaries from frida_mode * Changes to make cmplog fail fast Co-authored-by: Your Name <you@example.com> * afl-plot: relative time * arch linux and mac os support for afl-system-config * typo * code-format * update documentation Co-authored-by: Dominik Maier <domenukk@gmail.com> Co-authored-by: WorksButNotTested <62701594+WorksButNotTested@users.noreply.github.com> Co-authored-by: Your Name <you@example.com> Co-authored-by: Dmitry Zheregelya <zheregelya.d@gmail.com> Co-authored-by: hexcoder <hexcoder-@users.noreply.github.com> Co-authored-by: hexcoder- <heiko@hexco.de> Co-authored-by: Andrea Fioraldi <andreafioraldi@gmail.com> Co-authored-by: David CARLIER <devnexen@gmail.com> Co-authored-by: realmadsci <71108352+realmadsci@users.noreply.github.com> Co-authored-by: Roman M. Iudichev <SecNotice@ya.ru>
240 lines
8.4 KiB
Bash
Executable File
240 lines
8.4 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# if you want a specific performance file (e.g. to compare features to another)
|
|
# you can set the AFL_PERFORMANCE_FILE environment variable:
|
|
FILE=$AFL_PERFORMANCE_FILE
|
|
# otherwise we use ~/.afl_performance
|
|
test -z "$FILE" && FILE=.afl_performance
|
|
|
|
test -e $FILE || {
|
|
echo Warning: This script measure the performance of afl++ and saves the result for future comparisons into $FILE
|
|
echo Press ENTER to continue or CONTROL-C to abort
|
|
read IN
|
|
}
|
|
|
|
test -e ./test-performance.sh || { echo Error: this script must be run from the directory in which it lies. ; exit 1 ; }
|
|
|
|
export AFL_QUIET=1
|
|
export AFL_PATH=`pwd`/..
|
|
|
|
unset AFL_EXIT_WHEN_DONE
|
|
unset AFL_EXIT_ON_TIME
|
|
unset AFL_SKIP_CPUFREQ
|
|
unset AFL_DEBUG
|
|
unset AFL_HARDEN
|
|
unset AFL_USE_ASAN
|
|
unset AFL_USE_MSAN
|
|
unset AFL_CC
|
|
unset AFL_PRELOAD
|
|
unset AFL_GCC_INSTRUMENT_FILE
|
|
unset AFL_LLVM_INSTRUMENT_FILE
|
|
unset AFL_LLVM_INSTRIM
|
|
unset AFL_LLVM_LAF_SPLIT_SWITCHES
|
|
unset AFL_LLVM_LAF_TRANSFORM_COMPARES
|
|
unset AFL_LLVM_LAF_SPLIT_COMPARES
|
|
|
|
# on OpenBSD we need to work with llvm from /usr/local/bin
|
|
test -e /usr/local/bin/opt && {
|
|
export PATH=/usr/local/bin:${PATH}
|
|
}
|
|
# on MacOS X we prefer afl-clang over afl-gcc, because
|
|
# afl-gcc does not work there
|
|
test `uname -s` = 'Darwin' -o `uname -s` = 'FreeBSD' && {
|
|
AFL_GCC=afl-clang
|
|
CC=clang
|
|
} || {
|
|
AFL_GCC=afl-gcc
|
|
CC=gcc
|
|
}
|
|
|
|
ECHO="printf %b\\n"
|
|
$ECHO \\101 2>&1 | grep -qE '^A' || {
|
|
ECHO=
|
|
test -e /bin/printf && {
|
|
ECHO="/bin/printf %b\\n"
|
|
$ECHO '\\101' 2>&1 | grep -qE '^A' || ECHO=
|
|
}
|
|
}
|
|
test -z "$ECHO" && { printf Error: printf command does not support octal character codes ; exit 1 ; }
|
|
|
|
GREY="\\033[1;90m"
|
|
BLUE="\\033[1;94m"
|
|
GREEN="\\033[0;32m"
|
|
RED="\\033[0;31m"
|
|
YELLOW="\\033[1;93m"
|
|
RESET="\\033[0m"
|
|
|
|
MEM_LIMIT=500
|
|
|
|
touch $FILE || { echo Error: can not write to $FILE ; exit 1 ; }
|
|
|
|
echo Warning: this script is setting performance parameters with afl-system-config
|
|
sleep 1
|
|
afl-system-config > /dev/null 2>&1
|
|
echo Performance settings applied.
|
|
echo
|
|
|
|
$ECHO "${RESET}${GREY}[*] starting afl++ performance test framework ..."
|
|
|
|
$ECHO "$BLUE[*] Testing: ${AFL_GCC}"
|
|
GCC=x
|
|
test -e ../${AFL_GCC} -a -e ../afl-fuzz && {
|
|
../${AFL_GCC} -o test-instr.plain ../test-instr.c > /dev/null 2>&1
|
|
test -e test-instr.plain && {
|
|
$ECHO "$GREEN[+] ${AFL_GCC} compilation succeeded"
|
|
mkdir -p in
|
|
echo 0 > in/in
|
|
$ECHO "$GREY[*] running afl-fuzz for ${AFL_GCC} for 30 seconds"
|
|
{
|
|
../afl-fuzz -V 30 -s 123 -m ${MEM_LIMIT} -i in -o out-gcc -- ./test-instr.plain
|
|
} >>errors 2>&1
|
|
test -n "$( ls out-gcc/default/queue/id:000002* 2> /dev/null )" && {
|
|
GCC=`grep execs_done out-gcc/default/fuzzer_stats | awk '{print$3}'`
|
|
} || {
|
|
echo CUT----------------------------------------------------------------
|
|
cat errors
|
|
echo CUT----------------------------------------------------------------
|
|
$ECHO "$RED[!] afl-fuzz is not working correctly with ${AFL_GCC}"
|
|
}
|
|
rm -rf in out-gcc errors test-instr.plain
|
|
} || $ECHO "$RED[!] ${AFL_GCC} instrumentation failed"
|
|
} || $ECHO "$YELLOW[-] afl is not compiled, cannot test"
|
|
|
|
$ECHO "$BLUE[*] Testing: llvm_mode"
|
|
LLVM=x
|
|
test -e ../afl-clang-fast -a -e ../afl-fuzz && {
|
|
../afl-clang-fast -o test-instr.llvm ../test-instr.c > /dev/null 2>&1
|
|
test -e test-instr.llvm && {
|
|
$ECHO "$GREEN[+] llvm_mode compilation succeeded"
|
|
mkdir -p in
|
|
echo 0 > in/in
|
|
$ECHO "$GREY[*] running afl-fuzz for llvm_mode for 30 seconds"
|
|
{
|
|
../afl-fuzz -V 30 -s 123 -m ${MEM_LIMIT} -i in -o out-llvm -- ./test-instr.llvm
|
|
} >>errors 2>&1
|
|
test -n "$( ls out-llvm/default/queue/id:000002* 2> /dev/null )" && {
|
|
LLVM=`grep execs_done out-llvm/default/fuzzer_stats | awk '{print$3}'`
|
|
} || {
|
|
echo CUT----------------------------------------------------------------
|
|
cat errors
|
|
echo CUT----------------------------------------------------------------
|
|
$ECHO "$RED[!] afl-fuzz is not working correctly with llvm_mode"
|
|
}
|
|
rm -rf in out-llvm errors test-instr.llvm
|
|
} || $ECHO "$RED[!] llvm_mode instrumentation failed"
|
|
} || $ECHO "$YELLOW[-] llvm_mode is not compiled, cannot test"
|
|
|
|
$ECHO "$BLUE[*] Testing: gcc_plugin"
|
|
GCCP=x
|
|
test -e ../afl-gcc-fast -a -e ../afl-fuzz && {
|
|
../afl-gcc-fast -o test-instr.gccp ../test-instr.c > /dev/null 2>&1
|
|
test -e test-instr.gccp && {
|
|
$ECHO "$GREEN[+] gcc_plugin compilation succeeded"
|
|
mkdir -p in
|
|
echo 0 > in/in
|
|
$ECHO "$GREY[*] running afl-fuzz for gcc_plugin for 30 seconds"
|
|
{
|
|
../afl-fuzz -V 30 -s 123 -m ${MEM_LIMIT} -i in -o out-gccp -- ./test-instr.gccp
|
|
} >>errors 2>&1
|
|
test -n "$( ls out-gccp/default/queue/id:000002* 2> /dev/null )" && {
|
|
GCCP=`grep execs_done out-gccp/default/fuzzer_stats | awk '{print$3}'`
|
|
} || {
|
|
echo CUT----------------------------------------------------------------
|
|
cat errors
|
|
echo CUT----------------------------------------------------------------
|
|
$ECHO "$RED[!] afl-fuzz is not working correctly with gcc_plugin"
|
|
}
|
|
rm -rf in out-gccp errors test-instr.gccp
|
|
} || $ECHO "$RED[!] gcc_plugin instrumentation failed"
|
|
} || $ECHO "$YELLOW[-] gcc_plugin is not compiled, cannot test"
|
|
|
|
$ECHO "$BLUE[*] Testing: qemu_mode"
|
|
QEMU=x
|
|
test -e ../afl-qemu-trace -a -e ../afl-fuzz && {
|
|
$CC -o test-instr.qemu ../test-instr.c > /dev/null 2>&1
|
|
test -e test-instr.qemu && {
|
|
$ECHO "$GREEN[+] native compilation with cc succeeded"
|
|
mkdir -p in
|
|
echo 0 > in/in
|
|
$ECHO "$GREY[*] running afl-fuzz for qemu_mode for 30 seconds"
|
|
{
|
|
../afl-fuzz -Q -V 30 -s 123 -m ${MEM_LIMIT} -i in -o out-qemu -- ./test-instr.qemu
|
|
} >>errors 2>&1
|
|
test -n "$( ls out-qemu/default/queue/id:000002* 2> /dev/null )" && {
|
|
QEMU=`grep execs_done out-qemu/default/fuzzer_stats | awk '{print$3}'`
|
|
} || {
|
|
echo CUT----------------------------------------------------------------
|
|
echo ../afl-fuzz -Q -V 30 -s 123 -m ${MEM_LIMIT} -i in -o out-qemu -- ./test-instr.qemu
|
|
cat errors
|
|
echo CUT----------------------------------------------------------------
|
|
$ECHO "$RED[!] afl-fuzz is not working correctly with qemu_mode"
|
|
}
|
|
rm -rf in out-qemu errors test-instr.qemu
|
|
} || $ECHO "$RED[!] qemu_mode instrumentation failed"
|
|
} || $ECHO "$YELLOW[-] qemu_mode is not compiled, cannot test"
|
|
|
|
LOW_GCC=
|
|
HIGH_GCC=
|
|
LAST_GCC=
|
|
LOW_LLVM=
|
|
HIGH_LLVM=
|
|
LAST_LLVM=
|
|
LOW_GCCP=
|
|
HIGH_GCCP=
|
|
LAST_GCCP=
|
|
LOW_QEMU=
|
|
HIGH_QEMU=
|
|
LAST_QEMU=
|
|
|
|
test -s $FILE && {
|
|
while read LINE; do
|
|
G=`echo $LINE | awk '{print$1}'`
|
|
L=`echo $LINE | awk '{print$2}'`
|
|
P=`echo $LINE | awk '{print$3}'`
|
|
Q=`echo $LINE | awk '{print$4}'`
|
|
test "$G" = x && G=
|
|
test "$L" = x && L=
|
|
test "$P" = x && P=
|
|
test "$Q" = x && Q=
|
|
test -n "$G" && LAST_GCC=$G
|
|
test -n "$L" && LAST_LLVM=$L
|
|
test -n "$P" && LAST_GCCP=$P
|
|
test -n "$Q" && LAST_QEMU=$Q
|
|
test -n "$G" -a -z "$LOW_GCC" && LOW_GCC=$G || {
|
|
test -n "$G" -a "$G" -lt "$LOW_GCC" 2> /dev/null && LOW_GCC=$G
|
|
}
|
|
test -n "$L" -a -z "$LOW_LLVM" && LOW_LLVM=$L || {
|
|
test -n "$L" -a "$L" -lt "$LOW_LLVM" 2> /dev/null && LOW_LLVM=$L
|
|
}
|
|
test -n "$P" -a -z "$LOW_GCCP" && LOW_GCCP=$P || {
|
|
test -n "$P" -a "$P" -lt "$LOW_GCCP" 2> /dev/null && LOW_GCCP=$P
|
|
}
|
|
test -n "$Q" -a -z "$LOW_QEMU" && LOW_QEMU=$Q || {
|
|
test -n "$Q" -a "$Q" -lt "$LOW_QEMU" 2> /dev/null && LOW_QEMU=$Q
|
|
}
|
|
test -n "$G" -a -z "$HIGH_GCC" && HIGH_GCC=$G || {
|
|
test -n "$G" -a "$G" -gt "$HIGH_GCC" 2> /dev/null && HIGH_GCC=$G
|
|
}
|
|
test -n "$L" -a -z "$HIGH_LLVM" && HIGH_LLVM=$L || {
|
|
test -n "$L" -a "$L" -gt "$HIGH_LLVM" 2> /dev/null && HIGH_LLVM=$L
|
|
}
|
|
test -n "$P" -a -z "$HIGH_GCCP" && HIGH_GCCP=$P || {
|
|
test -n "$P" -a "$P" -gt "$HIGH_GCCP" 2> /dev/null && HIGH_GCCP=$P
|
|
}
|
|
test -n "$Q" -a -z "$HIGH_QEMU" && HIGH_QEMU=$Q || {
|
|
test -n "$Q" -a "$Q" -gt "$HIGH_QEMU" 2> /dev/null && HIGH_QEMU=$Q
|
|
}
|
|
done < $FILE
|
|
$ECHO "$YELLOW[!] Reading saved data from $FILE completed, please compare the results:"
|
|
$ECHO "$BLUE[!] afl-cc: lowest=$LOW_GCC highest=$HIGH_GCC last=$LAST_GCC current=$GCC"
|
|
$ECHO "$BLUE[!] llvm_mode: lowest=$LOW_LLVM highest=$HIGH_LLVM last=$LAST_LLVM current=$LLVM"
|
|
$ECHO "$BLUE[!] gcc_plugin: lowest=$LOW_GCCP highest=$HIGH_GCCP last=$LAST_GCCP current=$GCCP"
|
|
$ECHO "$BLUE[!] qemu_mode: lowest=$LOW_QEMU highest=$HIGH_QEMU last=$LAST_QEMU current=$QEMU"
|
|
} || {
|
|
$ECHO "$YELLOW[!] First run, just saving data"
|
|
$ECHO "$BLUE[!] afl-gcc=$GCC llvm_mode=$LLVM gcc_plugin=$GCCP qemu_mode=$QEMU"
|
|
}
|
|
echo "$GCC $LLVM $GCCP $QEMU" >> $FILE
|
|
$ECHO "$GREY[*] done."
|
|
$ECHO "$RESET"
|