mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-24 22:53:24 +00:00
Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
2f38839fd4 | |||
f9f9848cea |
@ -3,10 +3,10 @@
|
|||||||
# american fuzzy lop++ - custom code formatter
|
# american fuzzy lop++ - custom code formatter
|
||||||
# --------------------------------------------
|
# --------------------------------------------
|
||||||
#
|
#
|
||||||
# Written and maintained by Andrea Fioraldi <andreafioraldi@gmail.com>
|
# Written and maintaned by Andrea Fioraldi <andreafioraldi@gmail.com>
|
||||||
#
|
#
|
||||||
# Copyright 2015, 2016, 2017 Google Inc. All rights reserved.
|
# Copyright 2015, 2016, 2017 Google Inc. All rights reserved.
|
||||||
# Copyright 2019-2023 AFLplusplus Project. All rights reserved.
|
# Copyright 2019-2020 AFLplusplus Project. All rights reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@ -18,56 +18,41 @@
|
|||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
# import re # TODO: for future use
|
import re
|
||||||
import shutil
|
|
||||||
import importlib.metadata
|
|
||||||
|
|
||||||
# string_re = re.compile('(\\"(\\\\.|[^"\\\\])*\\")') # TODO: for future use
|
|
||||||
|
|
||||||
CURRENT_LLVM = os.getenv('LLVM_VERSION', 17)
|
|
||||||
CLANG_FORMAT_BIN = os.getenv("CLANG_FORMAT_BIN", "")
|
|
||||||
|
|
||||||
|
|
||||||
def check_clang_format_pip_version():
|
|
||||||
"""
|
|
||||||
Check if the correct version of clang-format is installed via pip.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: True if the correct version of clang-format is installed,
|
|
||||||
False otherwise.
|
|
||||||
"""
|
|
||||||
# Check if clang-format is installed
|
|
||||||
if importlib.util.find_spec('clang_format'):
|
|
||||||
# Check if the installed version is the expected LLVM version
|
|
||||||
if importlib.metadata.version('clang-format')\
|
|
||||||
.startswith(str(CURRENT_LLVM)+'.'):
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
# Return False, because the clang-format version does not match
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
# If the 'clang_format' package isn't installed, return False
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
# string_re = re.compile('(\\"(\\\\.|[^"\\\\])*\\")') # future use
|
||||||
|
|
||||||
with open(".clang-format") as f:
|
with open(".clang-format") as f:
|
||||||
fmt = f.read()
|
fmt = f.read()
|
||||||
|
|
||||||
|
CLANG_FORMAT_BIN = os.getenv("CLANG_FORMAT_BIN")
|
||||||
CLANG_FORMAT_PIP = check_clang_format_pip_version()
|
if CLANG_FORMAT_BIN is None:
|
||||||
|
o = 0
|
||||||
if shutil.which(CLANG_FORMAT_BIN) is None:
|
try:
|
||||||
CLANG_FORMAT_BIN = f"clang-format-{CURRENT_LLVM}"
|
p = subprocess.Popen(["clang-format-11", "--version"], stdout=subprocess.PIPE)
|
||||||
|
o, _ = p.communicate()
|
||||||
if shutil.which(CLANG_FORMAT_BIN) is None \
|
o = str(o, "utf-8")
|
||||||
and CLANG_FORMAT_PIP is False:
|
o = re.sub(r".*ersion ", "", o)
|
||||||
print(f"[!] clang-format-{CURRENT_LLVM} is needed. Aborted.")
|
# o = o[len("clang-format version "):].strip()
|
||||||
print(f"Run `pip3 install \"clang-format=={CURRENT_LLVM}.*\"` \
|
o = o[: o.find(".")]
|
||||||
to install via pip.")
|
o = int(o)
|
||||||
exit(1)
|
except:
|
||||||
|
print("clang-format-11 is needed. Aborted.")
|
||||||
if CLANG_FORMAT_PIP:
|
exit(1)
|
||||||
CLANG_FORMAT_BIN = shutil.which("clang-format")
|
# if o < 7:
|
||||||
|
# if subprocess.call(['which', 'clang-format-7'], stdout=subprocess.PIPE) == 0:
|
||||||
|
# CLANG_FORMAT_BIN = 'clang-format-7'
|
||||||
|
# elif subprocess.call(['which', 'clang-format-8'], stdout=subprocess.PIPE) == 0:
|
||||||
|
# CLANG_FORMAT_BIN = 'clang-format-8'
|
||||||
|
# elif subprocess.call(['which', 'clang-format-9'], stdout=subprocess.PIPE) == 0:
|
||||||
|
# CLANG_FORMAT_BIN = 'clang-format-9'
|
||||||
|
# elif subprocess.call(['which', 'clang-format-11'], stdout=subprocess.PIPE) == 0:
|
||||||
|
# CLANG_FORMAT_BIN = 'clang-format-11'
|
||||||
|
# else:
|
||||||
|
# print ("clang-format 7 or above is needed. Aborted.")
|
||||||
|
# exit(1)
|
||||||
|
else:
|
||||||
|
CLANG_FORMAT_BIN = "clang-format-11"
|
||||||
|
|
||||||
COLUMN_LIMIT = 80
|
COLUMN_LIMIT = 80
|
||||||
for line in fmt.split("\n"):
|
for line in fmt.split("\n"):
|
||||||
@ -87,43 +72,43 @@ def custom_format(filename):
|
|||||||
|
|
||||||
for line in src.split("\n"):
|
for line in src.split("\n"):
|
||||||
if line.lstrip().startswith("#"):
|
if line.lstrip().startswith("#"):
|
||||||
if line[line.find("#") + 1:].lstrip().startswith("define"):
|
if line[line.find("#") + 1 :].lstrip().startswith("define"):
|
||||||
in_define = True
|
in_define = True
|
||||||
|
|
||||||
if (
|
if (
|
||||||
"/*" in line
|
"/*" in line
|
||||||
and not line.strip().startswith("/*")
|
and not line.strip().startswith("/*")
|
||||||
and line.endswith("*/")
|
and line.endswith("*/")
|
||||||
and len(line) < (COLUMN_LIMIT - 2)
|
and len(line) < (COLUMN_LIMIT - 2)
|
||||||
):
|
):
|
||||||
cmt_start = line.rfind("/*")
|
cmt_start = line.rfind("/*")
|
||||||
line = (
|
line = (
|
||||||
line[:cmt_start]
|
line[:cmt_start]
|
||||||
+ " " * (COLUMN_LIMIT - 2 - len(line))
|
+ " " * (COLUMN_LIMIT - 2 - len(line))
|
||||||
+ line[cmt_start:]
|
+ line[cmt_start:]
|
||||||
)
|
)
|
||||||
|
|
||||||
define_padding = 0
|
define_padding = 0
|
||||||
if last_line is not None and in_define and last_line.endswith("\\"):
|
if last_line is not None and in_define and last_line.endswith("\\"):
|
||||||
last_line = last_line[:-1]
|
last_line = last_line[:-1]
|
||||||
define_padding = max(0, len(last_line[last_line.rfind("\n") + 1:]))
|
define_padding = max(0, len(last_line[last_line.rfind("\n") + 1 :]))
|
||||||
|
|
||||||
if (
|
if (
|
||||||
last_line is not None
|
last_line is not None
|
||||||
and last_line.strip().endswith("{")
|
and last_line.strip().endswith("{")
|
||||||
and line.strip() != ""
|
and line.strip() != ""
|
||||||
):
|
):
|
||||||
line = (" " * define_padding + "\\" if in_define else "") + "\n" + line
|
line = (" " * define_padding + "\\" if in_define else "") + "\n" + line
|
||||||
elif (
|
elif (
|
||||||
last_line is not None
|
last_line is not None
|
||||||
and last_line.strip().startswith("}")
|
and last_line.strip().startswith("}")
|
||||||
and line.strip() != ""
|
and line.strip() != ""
|
||||||
):
|
):
|
||||||
line = (" " * define_padding + "\\" if in_define else "") + "\n" + line
|
line = (" " * define_padding + "\\" if in_define else "") + "\n" + line
|
||||||
elif (
|
elif (
|
||||||
line.strip().startswith("}")
|
line.strip().startswith("}")
|
||||||
and last_line is not None
|
and last_line is not None
|
||||||
and last_line.strip() != ""
|
and last_line.strip() != ""
|
||||||
):
|
):
|
||||||
line = (" " * define_padding + "\\" if in_define else "") + "\n" + line
|
line = (" " * define_padding + "\\" if in_define else "") + "\n" + line
|
||||||
|
|
||||||
|
@ -1,75 +1,65 @@
|
|||||||
!/coresight_mode
|
|
||||||
*.dSYM
|
|
||||||
*.o
|
|
||||||
*.pyc
|
|
||||||
*.so
|
|
||||||
.sync_tmp
|
|
||||||
.test
|
.test
|
||||||
.test2
|
.test2
|
||||||
.git
|
.sync_tmp
|
||||||
.dockerignore
|
*.o
|
||||||
.github
|
*.so
|
||||||
CITATION.cff
|
*.pyc
|
||||||
CONTRIBUTING.md
|
*.dSYM
|
||||||
Changelog.md
|
as
|
||||||
Dockerfile
|
ld
|
||||||
LICENSE
|
in
|
||||||
TODO.md
|
out
|
||||||
|
core*
|
||||||
afl-analyze
|
afl-analyze
|
||||||
afl-analyze.8
|
|
||||||
afl-as
|
afl-as
|
||||||
afl-as.8
|
|
||||||
afl-clang
|
afl-clang
|
||||||
afl-clang-fast
|
|
||||||
afl-clang-fast.8
|
|
||||||
afl-clang-fast\+\+
|
|
||||||
afl-clang-fast\+\+.8
|
|
||||||
afl-clang-lto
|
|
||||||
afl-clang-lto.8
|
|
||||||
afl-clang-lto\+\+
|
|
||||||
afl-clang-lto\+\+.8
|
|
||||||
afl-clang\+\+
|
afl-clang\+\+
|
||||||
afl-cmin.8
|
afl-clang-fast
|
||||||
afl-cmin.bash.8
|
afl-clang-fast\+\+
|
||||||
|
afl-clang-lto
|
||||||
|
afl-clang-lto\+\+
|
||||||
afl-fuzz
|
afl-fuzz
|
||||||
afl-fuzz.8
|
|
||||||
afl-g\+\+
|
afl-g\+\+
|
||||||
afl-g\+\+-fast
|
|
||||||
afl-g\+\+-fast.8
|
|
||||||
afl-gcc
|
afl-gcc
|
||||||
afl-gcc-fast
|
afl-gcc-fast
|
||||||
afl-gcc-fast.8
|
afl-g\+\+-fast
|
||||||
afl-gcc.8
|
|
||||||
afl-gotcpu
|
afl-gotcpu
|
||||||
afl-gotcpu.8
|
|
||||||
afl-ld
|
afl-ld
|
||||||
afl-ld-lto
|
afl-ld-lto
|
||||||
afl-plot.8
|
|
||||||
afl-qemu-trace
|
afl-qemu-trace
|
||||||
afl-showmap
|
afl-showmap
|
||||||
|
afl-tmin
|
||||||
|
afl-analyze.8
|
||||||
|
afl-as.8
|
||||||
|
afl-clang-fast\+\+.8
|
||||||
|
afl-clang-fast.8
|
||||||
|
afl-clang-lto.8
|
||||||
|
afl-clang-lto\+\+.8
|
||||||
|
afl-cmin.8
|
||||||
|
afl-cmin.bash.8
|
||||||
|
afl-fuzz.8
|
||||||
|
afl-gcc.8
|
||||||
|
afl-gcc-fast.8
|
||||||
|
afl-g\+\+-fast.8
|
||||||
|
afl-gotcpu.8
|
||||||
|
afl-plot.8
|
||||||
afl-showmap.8
|
afl-showmap.8
|
||||||
afl-system-config.8
|
afl-system-config.8
|
||||||
afl-tmin
|
|
||||||
afl-tmin.8
|
afl-tmin.8
|
||||||
afl-whatsup.8
|
afl-whatsup.8
|
||||||
as
|
|
||||||
core*
|
|
||||||
examples/afl_frida/afl-frida
|
|
||||||
examples/afl_frida/frida-gum-example.c
|
|
||||||
examples/afl_frida/frida-gum.h
|
|
||||||
examples/afl_frida/libtestinstr.so
|
|
||||||
examples/afl_network_proxy/afl-network-client
|
|
||||||
examples/afl_network_proxy/afl-network-server
|
|
||||||
in
|
|
||||||
ld
|
|
||||||
out
|
|
||||||
qemu_mode/libcompcov/compcovtest
|
qemu_mode/libcompcov/compcovtest
|
||||||
qemu_mode/qemu-*
|
qemu_mode/qemu-*
|
||||||
test/unittests/unit_hash
|
|
||||||
test/unittests/unit_list
|
|
||||||
test/unittests/unit_maybe_alloc
|
|
||||||
test/unittests/unit_preallocable
|
|
||||||
test/unittests/unit_rand
|
|
||||||
unicorn_mode/samples/*/\.test-*
|
unicorn_mode/samples/*/\.test-*
|
||||||
unicorn_mode/samples/*/output
|
unicorn_mode/samples/*/output
|
||||||
unicorn_mode/unicornafl
|
unicorn_mode/unicornafl
|
||||||
|
test/unittests/unit_maybe_alloc
|
||||||
|
test/unittests/unit_preallocable
|
||||||
|
test/unittests/unit_list
|
||||||
|
test/unittests/unit_rand
|
||||||
|
test/unittests/unit_hash
|
||||||
|
examples/afl_network_proxy/afl-network-server
|
||||||
|
examples/afl_network_proxy/afl-network-client
|
||||||
|
examples/afl_frida/afl-frida
|
||||||
|
examples/afl_frida/libtestinstr.so
|
||||||
|
examples/afl_frida/frida-gum-example.c
|
||||||
|
examples/afl_frida/frida-gum.h
|
25
.github/workflows/build_aflplusplus_docker.yaml
vendored
Normal file
25
.github/workflows/build_aflplusplus_docker.yaml
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
name: Publish Docker Images
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ stable ]
|
||||||
|
# paths:
|
||||||
|
# - Dockerfile
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
push_to_registry:
|
||||||
|
name: Push Docker images to Dockerhub
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
- name: Login to Dockerhub
|
||||||
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_TOKEN }}
|
||||||
|
- name: Publish aflpp to Registry
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
tags: aflplusplus/aflplusplus:latest
|
50
.github/workflows/ci.yml
vendored
50
.github/workflows/ci.yml
vendored
@ -2,55 +2,29 @@ name: CI
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches: [ stable, dev ]
|
||||||
- stable
|
|
||||||
- dev
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches: [ stable, dev ]
|
||||||
- dev # No need for stable-pull-request, as that equals dev-push
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
linux:
|
build:
|
||||||
runs-on: "${{ matrix.os }}"
|
runs-on: '${{ matrix.os }}'
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-22.04, ubuntu-20.04]
|
os: [ubuntu-20.04, ubuntu-18.04]
|
||||||
env:
|
|
||||||
AFL_SKIP_CPUFREQ: 1
|
|
||||||
AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES: 1
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
|
- name: debug
|
||||||
|
run: apt-cache search plugin-dev | grep gcc- ; echo ; apt-cache search clang-format- | grep clang-format-
|
||||||
- name: update
|
- name: update
|
||||||
run: sudo apt-get update && sudo apt-get upgrade -y
|
run: sudo apt-get update && sudo apt-get upgrade -y
|
||||||
- name: debug
|
|
||||||
run: apt-cache search plugin-dev | grep gcc-; echo; apt-cache search clang-format- | grep clang-format-
|
|
||||||
- name: install packages
|
- name: install packages
|
||||||
run: sudo apt-get install -y -m -f build-essential gcc-10 g++-10 git libtool libtool-bin automake flex bison libglib2.0-0 clang-12 llvm-12-dev libc++-dev findutils libcmocka-dev python3-dev python3-setuptools ninja-build python3-pip gcc-10-plugin-dev
|
run: sudo apt-get install -y -m -f --install-suggests build-essential git libtool libtool-bin automake bison libglib2.0-0 clang llvm-dev libc++-dev findutils libcmocka-dev python3-dev python3-setuptools ninja-build
|
||||||
- name: compiler installed
|
- name: compiler installed
|
||||||
run: gcc -v; echo; clang -v
|
run: gcc -v ; echo ; clang -v
|
||||||
- name: install gcc plugin
|
- name: install gcc plugin
|
||||||
run: sudo apt-get install -y -m -f --install-suggests $(readlink /usr/bin/gcc)-plugin-dev
|
run: sudo apt-get install -y -m -f --install-suggests $(readlink /usr/bin/gcc)-plugin-dev
|
||||||
- name: build afl++
|
- name: build afl++
|
||||||
run: export NO_NYX=1; export ASAN_BUILD=1; export LLVM_CONFIG=llvm-config-12; make ASAN_BUILD=1 NO_NYX=1 LLVM_CONFIG=llvm-config-12 distrib
|
run: make distrib ASAN_BUILD=1
|
||||||
- name: run tests
|
- name: run tests
|
||||||
run: sudo -E ./afl-system-config; make tests
|
run: sudo -E ./afl-system-config ; export AFL_SKIP_CPUFREQ=1 ; make tests
|
||||||
# macos:
|
|
||||||
# runs-on: macOS-latest
|
|
||||||
# env:
|
|
||||||
# AFL_MAP_SIZE: 65536
|
|
||||||
# AFL_SKIP_CPUFREQ: 1
|
|
||||||
# AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES: 1
|
|
||||||
# steps:
|
|
||||||
# - uses: actions/checkout@v3
|
|
||||||
# - name: install
|
|
||||||
# run: brew install make gcc llvm
|
|
||||||
# - name: fix install
|
|
||||||
# run: cd /usr/local/bin; ln -s gcc-11 gcc; ln -s g++-11 g++; which gcc; gcc -v
|
|
||||||
# - name: build
|
|
||||||
# run: export PATH=/usr/local/Cellar/llvm/*/":$PATH"; export CC=/usr/local/Cellar/llvm/*/bin/clang; export CXX="$CC"++; export LLVM_CONFIG=/usr/local/Cellar/llvm/*/bin/llvm-config; sudo -E ./afl-system-config; gmake ASAN_BUILD=1
|
|
||||||
# - name: frida
|
|
||||||
# run: export CC=/usr/local/Cellar/llvm/*/bin/clang; export CXX="$CC"++; cd frida_mode; gmake
|
|
||||||
# - name: run tests
|
|
||||||
# run: sudo -E ./afl-system-config; export CC=/usr/local/Cellar/llvm/*/bin/clang; export CXX="$CC"++; export PATH=/usr/local/Cellar/llvm/*/":/usr/local/bin:$PATH"; export LLVM_CONFIG=/usr/local/Cellar/llvm/*/bin/llvm-config; gmake tests
|
|
||||||
# - name: force frida test for MacOS
|
|
||||||
# run: export AFL_PATH=`pwd`; /usr/local/bin/gcc -o test-instr test-instr.c; mkdir in; echo > in/in; AFL_NO_UI=1 ./afl-fuzz -O -i in -o out -V 5 -- ./test-instr
|
|
||||||
|
33
.github/workflows/code-format.yml
vendored
33
.github/workflows/code-format.yml
vendored
@ -1,33 +0,0 @@
|
|||||||
name: Formatting
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- stable
|
|
||||||
- dev
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- dev # No need for stable-pull-request, as that equals dev-push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
code-format-check:
|
|
||||||
name: Check code format
|
|
||||||
if: ${{ 'false' == 'true' }} # Disable the job
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
container: docker.io/aflplusplus/aflplusplus:dev
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Format
|
|
||||||
run: |
|
|
||||||
git config --global --add safe.directory /__w/AFLplusplus/AFLplusplus
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y clang-format-${LLVM_VERSION}
|
|
||||||
make code-format
|
|
||||||
- name: Check if code needed formatting
|
|
||||||
run: |
|
|
||||||
git --no-pager -c color.ui=always diff HEAD
|
|
||||||
if ! git diff HEAD --quiet; then
|
|
||||||
echo "[!] Please run 'make code-format' and push its changes."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
43
.github/workflows/codeql-analysis.yml
vendored
43
.github/workflows/codeql-analysis.yml
vendored
@ -2,32 +2,31 @@ name: "CodeQL"
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches: [ stable, dev ]
|
||||||
- stable
|
|
||||||
- dev
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches: [ stable, dev ]
|
||||||
- dev # No need for stable-pull-request, as that equals dev-push
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
analyze:
|
analyze:
|
||||||
name: Analyze
|
name: Analyze
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: # We use a previous image as it's expected to have all the dependencies
|
|
||||||
image: docker.io/aflplusplus/aflplusplus:dev
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: [ 'cpp' ]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Fix for using external repo in container build # https://github.com/actions/checkout/issues/760
|
- name: Checkout repository
|
||||||
run: git config --global --add safe.directory /__w/AFLplusplus/AFLplusplus
|
uses: actions/checkout@v2
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
- name: Initialize CodeQL
|
||||||
- name: Initialize CodeQL
|
uses: github/codeql-action/init@v1
|
||||||
uses: github/codeql-action/init@v2
|
with:
|
||||||
with:
|
languages: ${{ matrix.language }}
|
||||||
languages: cpp, python
|
|
||||||
- name: Build AFLplusplus # Rebuild because CodeQL needs to monitor the build process
|
- name: Autobuild
|
||||||
env:
|
uses: github/codeql-action/autobuild@v1
|
||||||
CC: gcc # These are symlinked to the version used in the container build
|
|
||||||
CXX: g++
|
- name: Perform CodeQL Analysis
|
||||||
run: make -i all # Best effort using -i
|
uses: github/codeql-action/analyze@v1
|
||||||
- name: Perform CodeQL Analysis
|
|
||||||
uses: github/codeql-action/analyze@v2
|
|
||||||
|
75
.github/workflows/container.yml
vendored
75
.github/workflows/container.yml
vendored
@ -1,75 +0,0 @@
|
|||||||
name: Container
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- stable
|
|
||||||
- dev
|
|
||||||
tags:
|
|
||||||
- "*"
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- dev # No need for stable-pull-request, as that equals dev-push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-and-test-amd64:
|
|
||||||
name: Test amd64 image
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Build amd64
|
|
||||||
uses: docker/build-push-action@v3
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
tags: aflplusplus:test-amd64
|
|
||||||
load: true
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
build-args: |
|
|
||||||
TEST_BUILD=1
|
|
||||||
- name: Test amd64
|
|
||||||
run: >
|
|
||||||
docker run --rm aflplusplus:test-amd64 bash -c "
|
|
||||||
apt-get update &&
|
|
||||||
apt-get install -y libcmocka-dev &&
|
|
||||||
make -i tests
|
|
||||||
"
|
|
||||||
|
|
||||||
push:
|
|
||||||
name: Push amd64 and arm64 images
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs:
|
|
||||||
- build-and-test-amd64
|
|
||||||
if: ${{ github.event_name == 'push' && github.repository == 'AFLplusplus/AFLplusplus' }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v2
|
|
||||||
with:
|
|
||||||
platforms: arm64
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
- name: Login to docker.io
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_TOKEN }}
|
|
||||||
- name: Set tags to push
|
|
||||||
id: push-tags
|
|
||||||
run: |
|
|
||||||
PUSH_TAGS=docker.io/aflplusplus/aflplusplus:${GITHUB_REF_NAME}
|
|
||||||
if [ "${GITHUB_REF_NAME}" = "stable" ]; then
|
|
||||||
PUSH_TAGS=${PUSH_TAGS},docker.io/aflplusplus/aflplusplus:latest
|
|
||||||
fi
|
|
||||||
export PUSH_TAGS
|
|
||||||
echo "::set-output name=PUSH_TAGS::${PUSH_TAGS}"
|
|
||||||
- name: Push to docker.io registry
|
|
||||||
uses: docker/build-push-action@v3
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
push: true
|
|
||||||
tags: ${{ steps.push-tags.outputs.PUSH_TAGS }}
|
|
||||||
cache-from: type=gha
|
|
13
.github/workflows/rust_custom_mutator.yml
vendored
13
.github/workflows/rust_custom_mutator.yml
vendored
@ -2,12 +2,9 @@ name: Rust Custom Mutators
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches: [ stable, dev ]
|
||||||
- stable
|
|
||||||
- dev
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches: [ stable, dev ]
|
||||||
- dev # No need for stable-pull-request, as that equals dev-push
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
@ -18,9 +15,9 @@ jobs:
|
|||||||
working-directory: custom_mutators/rust
|
working-directory: custom_mutators/rust
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-22.04, ubuntu-20.04]
|
os: [ubuntu-20.04]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v2
|
||||||
- name: Install Rust Toolchain
|
- name: Install Rust Toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
@ -30,4 +27,4 @@ jobs:
|
|||||||
- name: Run General Tests
|
- name: Run General Tests
|
||||||
run: cargo test
|
run: cargo test
|
||||||
- name: Run Tests for afl_internals feature flag
|
- name: Run Tests for afl_internals feature flag
|
||||||
run: cd custom_mutator && cargo test --features=afl_internals
|
run: cd custom_mutator && cargo test --features=afl_internals
|
133
.gitignore
vendored
133
.gitignore
vendored
@ -1,108 +1,99 @@
|
|||||||
!coresight_mode
|
|
||||||
!coresight_mode/coresight-trace
|
|
||||||
*.dSYM
|
|
||||||
*.o
|
|
||||||
*.o.tmp
|
|
||||||
*.pyc
|
|
||||||
*.so
|
|
||||||
*.swp
|
|
||||||
.sync_tmp
|
|
||||||
.test
|
.test
|
||||||
.test2
|
.test2
|
||||||
|
.sync_tmp
|
||||||
.vscode
|
.vscode
|
||||||
afl-addseeds.8
|
*.o
|
||||||
|
*.so
|
||||||
|
*.swp
|
||||||
|
*.pyc
|
||||||
|
*.dSYM
|
||||||
|
as
|
||||||
|
a.out
|
||||||
|
ld
|
||||||
|
in
|
||||||
|
out
|
||||||
|
core*
|
||||||
|
compile_commands.json
|
||||||
afl-analyze
|
afl-analyze
|
||||||
afl-analyze.8
|
|
||||||
afl-as
|
afl-as
|
||||||
afl-as.8
|
|
||||||
afl-c++
|
|
||||||
afl-c++.8
|
|
||||||
afl-cc
|
|
||||||
afl-cc.8
|
|
||||||
afl-clang
|
afl-clang
|
||||||
afl-clang++
|
afl-clang++
|
||||||
afl-clang-fast
|
afl-clang-fast
|
||||||
afl-clang-fast++
|
afl-clang-fast++
|
||||||
afl-clang-fast++.8
|
|
||||||
afl-clang-fast.8
|
|
||||||
afl-clang-lto
|
afl-clang-lto
|
||||||
afl-clang-lto++
|
afl-clang-lto++
|
||||||
afl-clang-lto++.8
|
|
||||||
afl-clang-lto.8
|
|
||||||
afl-cmin.8
|
|
||||||
afl-cmin.bash.8
|
|
||||||
afl-cs-proxy
|
|
||||||
afl-frida-trace.so
|
|
||||||
afl-fuzz
|
afl-fuzz
|
||||||
afl-fuzz.8
|
|
||||||
afl-g++
|
afl-g++
|
||||||
afl-g++.8
|
|
||||||
afl-gcc
|
afl-gcc
|
||||||
afl-gcc.8
|
|
||||||
afl-gcc-fast
|
afl-gcc-fast
|
||||||
afl-gcc-fast.8
|
|
||||||
afl-g++-fast
|
afl-g++-fast
|
||||||
afl-g++-fast.8
|
|
||||||
afl-gotcpu
|
afl-gotcpu
|
||||||
afl-gotcpu.8
|
|
||||||
afl-ld
|
afl-ld
|
||||||
afl-ld-lto
|
afl-ld-lto
|
||||||
|
afl-cs-proxy
|
||||||
|
afl-qemu-trace
|
||||||
|
afl-showmap
|
||||||
|
afl-tmin
|
||||||
|
afl-analyze.8
|
||||||
|
afl-as.8
|
||||||
|
afl-clang-fast++.8
|
||||||
|
afl-clang-fast.8
|
||||||
|
afl-clang-lto.8
|
||||||
|
afl-clang-lto++.8
|
||||||
|
afl-cmin.8
|
||||||
|
afl-cmin.bash.8
|
||||||
|
afl-fuzz.8
|
||||||
|
afl-c++.8
|
||||||
|
afl-cc.8
|
||||||
|
afl-gcc.8
|
||||||
|
afl-g++.8
|
||||||
|
afl-gcc-fast.8
|
||||||
|
afl-g++-fast.8
|
||||||
|
afl-gotcpu.8
|
||||||
|
afl-plot.8
|
||||||
|
afl-showmap.8
|
||||||
|
afl-system-config.8
|
||||||
|
afl-tmin.8
|
||||||
|
afl-whatsup.8
|
||||||
|
afl-persistent-config.8
|
||||||
|
afl-c++
|
||||||
|
afl-cc
|
||||||
afl-lto
|
afl-lto
|
||||||
afl-lto++
|
afl-lto++
|
||||||
afl-lto++.8
|
afl-lto++.8
|
||||||
afl-lto.8
|
afl-lto.8
|
||||||
afl-persistent-config.8
|
|
||||||
afl-plot.8
|
|
||||||
afl-qemu-trace
|
|
||||||
afl-showmap
|
|
||||||
afl-showmap.8
|
|
||||||
afl-system-config.8
|
|
||||||
afl-tmin
|
|
||||||
afl-tmin.8
|
|
||||||
afl-whatsup.8
|
|
||||||
a.out
|
|
||||||
as
|
|
||||||
compile_commands.json
|
|
||||||
core*
|
|
||||||
examples/afl_frida/afl-frida
|
|
||||||
examples/afl_frida/frida-gum-example.c
|
|
||||||
examples/afl_frida/frida-gum.h
|
|
||||||
examples/afl_frida/libtestinstr.so
|
|
||||||
examples/afl_network_proxy/afl-network-client
|
|
||||||
examples/afl_network_proxy/afl-network-server
|
|
||||||
examples/aflpp_driver/libAFLDriver.a
|
|
||||||
examples/aflpp_driver/libAFLQemuDriver.a
|
|
||||||
gmon.out
|
|
||||||
in
|
|
||||||
ld
|
|
||||||
libAFLDriver.a
|
|
||||||
libAFLQemuDriver.a
|
|
||||||
out
|
|
||||||
qemu_mode/libcompcov/compcovtest
|
qemu_mode/libcompcov/compcovtest
|
||||||
qemu_mode/qemu-*
|
qemu_mode/qemu-*
|
||||||
qemu_mode/qemuafl
|
qemu_mode/qemuafl
|
||||||
test/.afl_performance
|
unicorn_mode/samples/*/\.test-*
|
||||||
test-instr
|
unicorn_mode/samples/*/output/
|
||||||
test/output
|
|
||||||
test/test-c
|
|
||||||
test/test-cmplog
|
|
||||||
test/test-compcov
|
|
||||||
test/test-instr.ts
|
|
||||||
test/test-persistent
|
|
||||||
test/unittests/unit_hash
|
|
||||||
test/unittests/unit_list
|
|
||||||
test/unittests/unit_maybe_alloc
|
test/unittests/unit_maybe_alloc
|
||||||
test/unittests/unit_preallocable
|
test/unittests/unit_preallocable
|
||||||
|
test/unittests/unit_list
|
||||||
test/unittests/unit_rand
|
test/unittests/unit_rand
|
||||||
unicorn_mode/samples/*/output/
|
test/unittests/unit_hash
|
||||||
unicorn_mode/samples/*/\.test-*
|
examples/afl_network_proxy/afl-network-server
|
||||||
|
examples/afl_network_proxy/afl-network-client
|
||||||
|
examples/afl_frida/afl-frida
|
||||||
|
examples/afl_frida/libtestinstr.so
|
||||||
|
examples/afl_frida/frida-gum-example.c
|
||||||
|
examples/afl_frida/frida-gum.h
|
||||||
|
examples/aflpp_driver/libAFLDriver.a
|
||||||
|
examples/aflpp_driver/libAFLQemuDriver.a
|
||||||
|
libAFLDriver.a
|
||||||
|
libAFLQemuDriver.a
|
||||||
|
test/.afl_performance
|
||||||
|
gmon.out
|
||||||
|
afl-frida-trace.so
|
||||||
utils/afl_network_proxy/afl-network-client
|
utils/afl_network_proxy/afl-network-client
|
||||||
utils/afl_network_proxy/afl-network-server
|
utils/afl_network_proxy/afl-network-server
|
||||||
|
utils/plot_ui/afl-plot-ui
|
||||||
|
*.o.tmp
|
||||||
utils/afl_proxy/afl-proxy
|
utils/afl_proxy/afl-proxy
|
||||||
utils/optimin/build
|
utils/optimin/build
|
||||||
utils/optimin/optimin
|
utils/optimin/optimin
|
||||||
utils/persistent_mode/persistent_demo
|
utils/persistent_mode/persistent_demo
|
||||||
utils/persistent_mode/persistent_demo_new
|
utils/persistent_mode/persistent_demo_new
|
||||||
utils/persistent_mode/test-instr
|
utils/persistent_mode/test-instr
|
||||||
utils/plot_ui/afl-plot-ui
|
!coresight_mode
|
||||||
vuln_prog
|
!coresight_mode/coresight-trace
|
||||||
|
12
.gitmodules
vendored
12
.gitmodules
vendored
@ -10,18 +10,12 @@
|
|||||||
[submodule "custom_mutators/gramatron/json-c"]
|
[submodule "custom_mutators/gramatron/json-c"]
|
||||||
path = custom_mutators/gramatron/json-c
|
path = custom_mutators/gramatron/json-c
|
||||||
url = https://github.com/json-c/json-c
|
url = https://github.com/json-c/json-c
|
||||||
|
[submodule "utils/optimin/EvalMaxSAT"]
|
||||||
|
path = utils/optimin/EvalMaxSAT
|
||||||
|
url = https://github.com/FlorentAvellaneda/EvalMaxSAT
|
||||||
[submodule "coresight_mode/patchelf"]
|
[submodule "coresight_mode/patchelf"]
|
||||||
path = coresight_mode/patchelf
|
path = coresight_mode/patchelf
|
||||||
url = https://github.com/NixOS/patchelf.git
|
url = https://github.com/NixOS/patchelf.git
|
||||||
[submodule "coresight_mode/coresight-trace"]
|
[submodule "coresight_mode/coresight-trace"]
|
||||||
path = coresight_mode/coresight-trace
|
path = coresight_mode/coresight-trace
|
||||||
url = https://github.com/RICSecLab/coresight-trace.git
|
url = https://github.com/RICSecLab/coresight-trace.git
|
||||||
[submodule "nyx_mode/libnyx"]
|
|
||||||
path = nyx_mode/libnyx
|
|
||||||
url = https://github.com/nyx-fuzz/libnyx.git
|
|
||||||
[submodule "nyx_mode/packer"]
|
|
||||||
path = nyx_mode/packer
|
|
||||||
url = https://github.com/nyx-fuzz/packer.git
|
|
||||||
[submodule "nyx_mode/QEMU-Nyx"]
|
|
||||||
path = nyx_mode/QEMU-Nyx
|
|
||||||
url = https://github.com/nyx-fuzz/QEMU-Nyx
|
|
||||||
|
19
Android.bp
19
Android.bp
@ -1,11 +1,3 @@
|
|||||||
//
|
|
||||||
// NOTE: This file is outdated. None of the AFL++ team uses Android hence
|
|
||||||
// we need users to keep this updated.
|
|
||||||
// In the current state it will likely fail, please send fixes!
|
|
||||||
// Also, this should build frida_mode.
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
cc_defaults {
|
cc_defaults {
|
||||||
name: "afl-defaults",
|
name: "afl-defaults",
|
||||||
|
|
||||||
@ -76,7 +68,6 @@ cc_binary {
|
|||||||
srcs: [
|
srcs: [
|
||||||
"src/afl-fuzz*.c",
|
"src/afl-fuzz*.c",
|
||||||
"src/afl-common.c",
|
"src/afl-common.c",
|
||||||
"src/afl-forkserver.c",
|
|
||||||
"src/afl-sharedmem.c",
|
"src/afl-sharedmem.c",
|
||||||
"src/afl-forkserver.c",
|
"src/afl-forkserver.c",
|
||||||
"src/afl-performance.c",
|
"src/afl-performance.c",
|
||||||
@ -184,7 +175,7 @@ cc_binary_host {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cc_library_static {
|
cc_library_static {
|
||||||
name: "afl-compiler-rt",
|
name: "afl-llvm-rt",
|
||||||
compile_multilib: "64",
|
compile_multilib: "64",
|
||||||
vendor_available: true,
|
vendor_available: true,
|
||||||
host_supported: true,
|
host_supported: true,
|
||||||
@ -234,7 +225,6 @@ cc_library_headers {
|
|||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
cc_prebuilt_library_static {
|
cc_prebuilt_library_static {
|
||||||
name: "libfrida-gum",
|
name: "libfrida-gum",
|
||||||
compile_multilib: "64",
|
compile_multilib: "64",
|
||||||
@ -282,7 +272,7 @@ cc_binary {
|
|||||||
],
|
],
|
||||||
|
|
||||||
static_libs: [
|
static_libs: [
|
||||||
"afl-compiler-rt",
|
"afl-llvm-rt",
|
||||||
"libfrida-gum",
|
"libfrida-gum",
|
||||||
],
|
],
|
||||||
|
|
||||||
@ -300,7 +290,6 @@ cc_binary {
|
|||||||
"utils/afl_frida/android",
|
"utils/afl_frida/android",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
cc_binary {
|
cc_binary {
|
||||||
name: "afl-fuzz-32",
|
name: "afl-fuzz-32",
|
||||||
@ -357,7 +346,7 @@ cc_binary_host {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cc_library_static {
|
cc_library_static {
|
||||||
name: "afl-compiler-rt-32",
|
name: "afl-llvm-rt-32",
|
||||||
compile_multilib: "32",
|
compile_multilib: "32",
|
||||||
vendor_available: true,
|
vendor_available: true,
|
||||||
host_supported: true,
|
host_supported: true,
|
||||||
@ -396,7 +385,6 @@ cc_library_static {
|
|||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
cc_prebuilt_library_static {
|
cc_prebuilt_library_static {
|
||||||
name: "libfrida-gum-32",
|
name: "libfrida-gum-32",
|
||||||
compile_multilib: "32",
|
compile_multilib: "32",
|
||||||
@ -412,7 +400,6 @@ cc_prebuilt_library_static {
|
|||||||
"utils/afl_frida/android/arm",
|
"utils/afl_frida/android/arm",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
subdirs = [
|
subdirs = [
|
||||||
"custom_mutators",
|
"custom_mutators",
|
||||||
|
31
CITATION.cff
31
CITATION.cff
@ -1,31 +0,0 @@
|
|||||||
cff-version: 1.2.0
|
|
||||||
message: "If you use this software, please cite it as below."
|
|
||||||
authors:
|
|
||||||
- given-names: Marc
|
|
||||||
family-names: Heuse
|
|
||||||
email: mh@mh-sec.de
|
|
||||||
- given-names: Heiko
|
|
||||||
family-names: Eißfeldt
|
|
||||||
email: heiko.eissfeldt@hexco.de
|
|
||||||
- given-names: Andrea
|
|
||||||
family-names: Fioraldi
|
|
||||||
email: andreafioraldi@gmail.com
|
|
||||||
- given-names: Dominik
|
|
||||||
family-names: Maier
|
|
||||||
email: mail@dmnk.co
|
|
||||||
title: "AFL++"
|
|
||||||
version: 4.00c
|
|
||||||
type: software
|
|
||||||
date-released: 2022-01-26
|
|
||||||
url: "https://github.com/AFLplusplus/AFLplusplus"
|
|
||||||
keywords:
|
|
||||||
- fuzzing
|
|
||||||
- fuzzer
|
|
||||||
- fuzz-testing
|
|
||||||
- instrumentation
|
|
||||||
- afl-fuzz
|
|
||||||
- qemu
|
|
||||||
- llvm
|
|
||||||
- unicorn-emulator
|
|
||||||
- securiy
|
|
||||||
license: AGPL-3.0-or-later
|
|
130
Dockerfile
130
Dockerfile
@ -1,97 +1,75 @@
|
|||||||
#
|
#
|
||||||
# This Dockerfile for AFLplusplus uses Ubuntu 22.04 jammy and
|
# This Dockerfile for AFLplusplus uses Ubuntu 20.04 focal and
|
||||||
# installs LLVM 14 for afl-clang-lto support.
|
# installs LLVM 11 from llvm.org for afl-clang-lto support :-)
|
||||||
#
|
# It also installs gcc/g++ 10 from the Ubuntu development platform
|
||||||
# GCC 11 is used instead of 12 because genhtml for afl-cov doesn't like it.
|
# since focal has gcc-10 but not g++-10 ...
|
||||||
#
|
#
|
||||||
|
|
||||||
FROM ubuntu:22.04 AS aflplusplus
|
FROM ubuntu:20.04 AS aflplusplus
|
||||||
LABEL "maintainer"="AFL++ team <afl@aflplus.plus>"
|
LABEL "maintainer"="afl++ team <afl@aflplus.plus>"
|
||||||
LABEL "about"="AFLplusplus container image"
|
LABEL "about"="AFLplusplus docker 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:
|
|
||||||
# Current recommended LLVM version is 16
|
|
||||||
ENV LLVM_VERSION=16
|
|
||||||
# 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
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
ENV NO_ARCH_OPT=1
|
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-utils && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get -y install --no-install-recommends \
|
apt-get -y install --no-install-suggests --no-install-recommends \
|
||||||
make cmake automake meson ninja-build bison flex \
|
automake \
|
||||||
git xz-utils bzip2 wget jupp nano bash-completion less vim joe ssh psmisc \
|
cmake \
|
||||||
python3 python3-dev python3-pip python-is-python3 \
|
meson \
|
||||||
libtool libtool-bin libglib2.0-dev \
|
ninja-build \
|
||||||
apt-transport-https gnupg dialog \
|
bison flex \
|
||||||
gnuplot-nox libpixman-1-dev bc \
|
build-essential \
|
||||||
gcc-${GCC_VERSION} g++-${GCC_VERSION} gcc-${GCC_VERSION}-plugin-dev gdb lcov \
|
git \
|
||||||
clang-${LLVM_VERSION} clang-tools-${LLVM_VERSION} libc++1-${LLVM_VERSION} \
|
python3 python3-dev python3-setuptools python-is-python3 \
|
||||||
libc++-${LLVM_VERSION}-dev libc++abi1-${LLVM_VERSION} libc++abi-${LLVM_VERSION}-dev \
|
libtool libtool-bin \
|
||||||
libclang1-${LLVM_VERSION} libclang-${LLVM_VERSION}-dev \
|
libglib2.0-dev \
|
||||||
libclang-common-${LLVM_VERSION}-dev libclang-rt-${LLVM_VERSION}-dev libclang-cpp${LLVM_VERSION} \
|
wget vim jupp nano bash-completion less \
|
||||||
libclang-cpp${LLVM_VERSION}-dev liblld-${LLVM_VERSION} \
|
apt-utils apt-transport-https ca-certificates gnupg dialog \
|
||||||
liblld-${LLVM_VERSION}-dev liblldb-${LLVM_VERSION} liblldb-${LLVM_VERSION}-dev \
|
libpixman-1-dev \
|
||||||
libllvm${LLVM_VERSION} libomp-${LLVM_VERSION}-dev libomp5-${LLVM_VERSION} \
|
gnuplot-nox \
|
||||||
lld-${LLVM_VERSION} lldb-${LLVM_VERSION} llvm-${LLVM_VERSION} \
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
llvm-${LLVM_VERSION}-dev llvm-${LLVM_VERSION}-runtime llvm-${LLVM_VERSION}-tools \
|
|
||||||
$([ "$(dpkg --print-architecture)" = "amd64" ] && echo gcc-${GCC_VERSION}-multilib gcc-multilib) \
|
|
||||||
$([ "$(dpkg --print-architecture)" = "arm64" ] && echo libcapstone-dev) && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
# gcc-multilib is only used for -m32 support on x86
|
|
||||||
# libcapstone-dev is used for coresight_mode on arm64
|
|
||||||
|
|
||||||
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_VERSION} 0 && \
|
RUN echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-12 main" >> /etc/apt/sources.list && \
|
||||||
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${GCC_VERSION} 0 && \
|
wget -qO - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
|
||||||
update-alternatives --install /usr/bin/clang clang /usr/bin/clang-${LLVM_VERSION} 0 && \
|
|
||||||
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-${LLVM_VERSION} 0
|
|
||||||
|
|
||||||
RUN wget -qO- https://sh.rustup.rs | CARGO_HOME=/etc/cargo sh -s -- -y -q --no-modify-path
|
RUN echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal main" >> /etc/apt/sources.list && \
|
||||||
ENV PATH=$PATH:/etc/cargo/bin
|
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 1E9377A2BA9EF27F
|
||||||
|
|
||||||
RUN apt clean -y
|
RUN apt-get update && apt-get full-upgrade -y && \
|
||||||
|
apt-get -y install --no-install-suggests --no-install-recommends \
|
||||||
|
gcc-10 g++-10 gcc-10-plugin-dev gcc-10-multilib gcc-multilib gdb lcov \
|
||||||
|
clang-12 clang-tools-12 libc++1-12 libc++-12-dev \
|
||||||
|
libc++abi1-12 libc++abi-12-dev libclang1-12 libclang-12-dev \
|
||||||
|
libclang-common-12-dev libclang-cpp12 libclang-cpp12-dev liblld-12 \
|
||||||
|
liblld-12-dev liblldb-12 liblldb-12-dev libllvm12 libomp-12-dev \
|
||||||
|
libomp5-12 lld-12 lldb-12 llvm-12 llvm-12-dev llvm-12-runtime llvm-12-tools \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
ENV LLVM_CONFIG=llvm-config-${LLVM_VERSION}
|
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 0
|
||||||
|
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 0
|
||||||
|
|
||||||
|
ENV LLVM_CONFIG=llvm-config-12
|
||||||
ENV AFL_SKIP_CPUFREQ=1
|
ENV AFL_SKIP_CPUFREQ=1
|
||||||
ENV AFL_TRY_AFFINITY=1
|
ENV AFL_TRY_AFFINITY=1
|
||||||
ENV AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1
|
ENV AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1
|
||||||
|
|
||||||
RUN git clone --depth=1 https://github.com/vanhauser-thc/afl-cov && \
|
RUN git clone --depth=1 https://github.com/vanhauser-thc/afl-cov /afl-cov
|
||||||
(cd afl-cov && make install) && rm -rf afl-cov
|
RUN cd /afl-cov && make install && cd ..
|
||||||
|
|
||||||
|
COPY . /AFLplusplus
|
||||||
WORKDIR /AFLplusplus
|
WORKDIR /AFLplusplus
|
||||||
COPY . .
|
|
||||||
|
|
||||||
ARG CC=gcc-$GCC_VERSION
|
RUN export CC=gcc-10 && export CXX=g++-10 && make clean && \
|
||||||
ARG CXX=g++-$GCC_VERSION
|
make distrib && make install && make clean
|
||||||
|
|
||||||
# Used in CI to prevent a 'make clean' which would remove the binaries to be tested
|
RUN sh -c 'echo set encoding=utf-8 > /root/.vimrc'
|
||||||
ARG TEST_BUILD
|
RUN echo '. /etc/bash_completion' >> ~/.bashrc
|
||||||
|
RUN echo 'alias joe="joe --wordwrap --joe_state -nobackup"' >> ~/.bashrc
|
||||||
|
RUN echo "export PS1='"'[afl++ \h] \w$(__git_ps1) \$ '"'" >> ~/.bashrc
|
||||||
|
ENV IS_DOCKER="1"
|
||||||
|
|
||||||
RUN sed -i.bak 's/^ -/ /g' GNUmakefile && \
|
# Disabled until we have the container ready
|
||||||
make clean && make distrib && \
|
#COPY --from=aflplusplus/afl-dyninst /usr/local/lib/libdyninstAPI_RT.so /usr/local/lib/libdyninstAPI_RT.so
|
||||||
([ "${TEST_BUILD}" ] || (make install)) && \
|
#COPY --from=aflplusplus/afl-dyninst /afl-dyninst/libAflDyninst.so /usr/local/lib/libAflDyninst.so
|
||||||
mv GNUmakefile.bak GNUmakefile
|
|
||||||
|
|
||||||
RUN echo "set encoding=utf-8" > /root/.vimrc && \
|
|
||||||
echo ". /etc/bash_completion" >> ~/.bashrc && \
|
|
||||||
echo 'alias joe="joe --wordwrap --joe_state -nobackup"' >> ~/.bashrc && \
|
|
||||||
echo "export PS1='"'[AFL++ \h] \w \$ '"'" >> ~/.bashrc
|
|
||||||
|
310
GNUmakefile
310
GNUmakefile
@ -32,23 +32,24 @@ VERSION = $(shell grep '^$(HASH)define VERSION ' ../config.h | cut -d '"' -f
|
|||||||
# PROGS intentionally omit afl-as, which gets installed elsewhere.
|
# PROGS intentionally omit afl-as, which gets installed elsewhere.
|
||||||
|
|
||||||
PROGS = afl-fuzz afl-showmap afl-tmin afl-gotcpu afl-analyze
|
PROGS = afl-fuzz afl-showmap afl-tmin afl-gotcpu afl-analyze
|
||||||
SH_PROGS = afl-plot afl-cmin afl-cmin.bash afl-whatsup afl-addseeds afl-system-config afl-persistent-config afl-cc
|
SH_PROGS = afl-plot afl-cmin afl-cmin.bash afl-whatsup afl-system-config afl-persistent-config afl-cc
|
||||||
MANPAGES=$(foreach p, $(PROGS) $(SH_PROGS), $(p).8) afl-as.8
|
MANPAGES=$(foreach p, $(PROGS) $(SH_PROGS), $(p).8) afl-as.8
|
||||||
ASAN_OPTIONS=detect_leaks=0
|
ASAN_OPTIONS=detect_leaks=0
|
||||||
|
|
||||||
|
OS = $(shell uname -o)
|
||||||
SYS = $(shell uname -s)
|
SYS = $(shell uname -s)
|
||||||
ARCH = $(shell uname -m)
|
ARCH = $(shell uname -m)
|
||||||
|
|
||||||
$(info [*] Compiling AFL++ for OS $(SYS) on ARCH $(ARCH))
|
ifeq "$(OS)" "Cygwin"
|
||||||
|
SYS=Cygwin
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(info [*] Compiling afl++ for OS $(SYS) on ARCH $(ARCH))
|
||||||
|
|
||||||
ifdef NO_SPLICING
|
ifdef NO_SPLICING
|
||||||
override CFLAGS_OPT += -DNO_SPLICING
|
override CFLAGS_OPT += -DNO_SPLICING
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef NO_UTF
|
|
||||||
override CFLAGS_OPT += -DFANCY_BOXES_NO_UTF
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef ASAN_BUILD
|
ifdef ASAN_BUILD
|
||||||
$(info Compiling ASAN version of binaries)
|
$(info Compiling ASAN version of binaries)
|
||||||
override CFLAGS += $(ASAN_CFLAGS)
|
override CFLAGS += $(ASAN_CFLAGS)
|
||||||
@ -66,10 +67,6 @@ ifdef MSAN_BUILD
|
|||||||
override LDFLAGS += -fsanitize=memory
|
override LDFLAGS += -fsanitize=memory
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CODE_COVERAGE
|
|
||||||
override CFLAGS += -D__AFL_CODE_COVERAGE=1
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq "$(findstring android, $(shell $(CC) --version 2>/dev/null))" ""
|
ifeq "$(findstring android, $(shell $(CC) --version 2>/dev/null))" ""
|
||||||
ifeq "$(shell echo 'int main() {return 0; }' | $(CC) $(CFLAGS) -Werror -x c - -flto=full -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
|
ifeq "$(shell echo 'int main() {return 0; }' | $(CC) $(CFLAGS) -Werror -x c - -flto=full -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
|
||||||
CFLAGS_FLTO ?= -flto=full
|
CFLAGS_FLTO ?= -flto=full
|
||||||
@ -84,9 +81,9 @@ else
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#ifeq "$(shell echo 'int main() {return 0; }' | $(CC) -fno-move-loop-invariants -fdisable-tree-cunrolli -x c - -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
|
ifeq "$(shell echo 'int main() {return 0; }' | $(CC) -fno-move-loop-invariants -fdisable-tree-cunrolli -x c - -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
|
||||||
# SPECIAL_PERFORMANCE += -fno-move-loop-invariants -fdisable-tree-cunrolli
|
SPECIAL_PERFORMANCE += -fno-move-loop-invariants -fdisable-tree-cunrolli
|
||||||
#endif
|
endif
|
||||||
|
|
||||||
#ifeq "$(shell echo 'int main() {return 0; }' | $(CC) $(CFLAGS) -Werror -x c - -march=native -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
|
#ifeq "$(shell echo 'int main() {return 0; }' | $(CC) $(CFLAGS) -Werror -x c - -march=native -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
|
||||||
# ifndef SOURCE_DATE_EPOCH
|
# ifndef SOURCE_DATE_EPOCH
|
||||||
@ -99,23 +96,15 @@ ifneq "$(SYS)" "Darwin"
|
|||||||
#ifeq "$(HAVE_MARCHNATIVE)" "1"
|
#ifeq "$(HAVE_MARCHNATIVE)" "1"
|
||||||
# SPECIAL_PERFORMANCE += -march=native
|
# SPECIAL_PERFORMANCE += -march=native
|
||||||
#endif
|
#endif
|
||||||
#ifndef DEBUG
|
# OS X does not like _FORTIFY_SOURCE=2
|
||||||
# CFLAGS_OPT += -D_FORTIFY_SOURCE=1
|
ifndef DEBUG
|
||||||
#endif
|
CFLAGS_OPT += -D_FORTIFY_SOURCE=2
|
||||||
else
|
endif
|
||||||
# On some odd MacOS system configurations, the Xcode sdk path is not set correctly
|
|
||||||
SDK_LD = -L$(shell xcrun --show-sdk-path)/usr/lib
|
|
||||||
LDFLAGS += $(SDK_LD)
|
|
||||||
endif
|
|
||||||
|
|
||||||
COMPILER_TYPE=$(shell $(CC) --version|grep "Free Software Foundation")
|
|
||||||
ifneq "$(COMPILER_TYPE)" ""
|
|
||||||
#$(info gcc is being used)
|
|
||||||
CFLAGS_OPT += -Wno-error=format-truncation -Wno-format-truncation
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "$(SYS)" "SunOS"
|
ifeq "$(SYS)" "SunOS"
|
||||||
LDFLAGS = -lkstat -lrt -lsocket -lnsl
|
CFLAGS_OPT += -Wno-format-truncation
|
||||||
|
LDFLAGS = -lkstat -lrt
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef STATIC
|
ifdef STATIC
|
||||||
@ -154,13 +143,12 @@ ifdef DEBUG
|
|||||||
$(info Compiling DEBUG version of binaries)
|
$(info Compiling DEBUG version of binaries)
|
||||||
override CFLAGS += -ggdb3 -O0 -Wall -Wextra -Werror $(CFLAGS_OPT)
|
override CFLAGS += -ggdb3 -O0 -Wall -Wextra -Werror $(CFLAGS_OPT)
|
||||||
else
|
else
|
||||||
CFLAGS ?= -O2 $(CFLAGS_OPT) # -funroll-loops is slower on modern compilers
|
CFLAGS ?= -O3 -funroll-loops $(CFLAGS_OPT)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
override CFLAGS += -g -Wno-pointer-sign -Wno-variadic-macros -Wall -Wextra -Wno-pointer-arith \
|
override CFLAGS += -g -Wno-pointer-sign -Wno-variadic-macros -Wall -Wextra -Wpointer-arith \
|
||||||
-fPIC -I include/ -DAFL_PATH=\"$(HELPER_PATH)\" \
|
-I include/ -DAFL_PATH=\"$(HELPER_PATH)\" \
|
||||||
-DBIN_PATH=\"$(BIN_PATH)\" -DDOC_PATH=\"$(DOC_PATH)\"
|
-DBIN_PATH=\"$(BIN_PATH)\" -DDOC_PATH=\"$(DOC_PATH)\"
|
||||||
# -fstack-protector
|
|
||||||
|
|
||||||
ifeq "$(SYS)" "FreeBSD"
|
ifeq "$(SYS)" "FreeBSD"
|
||||||
override CFLAGS += -I /usr/local/include/
|
override CFLAGS += -I /usr/local/include/
|
||||||
@ -184,22 +172,22 @@ endif
|
|||||||
|
|
||||||
ifeq "$(SYS)" "Haiku"
|
ifeq "$(SYS)" "Haiku"
|
||||||
SHMAT_OK=0
|
SHMAT_OK=0
|
||||||
override CFLAGS += -DUSEMMAP=1 -Wno-error=format
|
override CFLAGS += -DUSEMMAP=1 -Wno-error=format -fPIC
|
||||||
override LDFLAGS += -Wno-deprecated-declarations -lgnu -lnetwork
|
override LDFLAGS += -Wno-deprecated-declarations -lgnu -lnetwork
|
||||||
#SPECIAL_PERFORMANCE += -DUSEMMAP=1
|
SPECIAL_PERFORMANCE += -DUSEMMAP=1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
AFL_FUZZ_FILES = $(wildcard src/afl-fuzz*.c)
|
AFL_FUZZ_FILES = $(wildcard src/afl-fuzz*.c)
|
||||||
|
|
||||||
ifneq "$(shell command -v python3m 2>/dev/null)" ""
|
ifneq "$(shell command -v python3m 2>/dev/null)" ""
|
||||||
ifneq "$(shell command -v python3m-config 2>/dev/null)" ""
|
ifneq "$(shell command -v python3m-config 2>/dev/null)" ""
|
||||||
PYTHON_INCLUDE := $(shell python3m-config --includes)
|
PYTHON_INCLUDE ?= $(shell python3m-config --includes)
|
||||||
PYTHON_VERSION := $(strip $(shell python3m --version 2>&1))
|
PYTHON_VERSION ?= $(strip $(shell python3m --version 2>&1))
|
||||||
# Starting with python3.8, we need to pass the `embed` flag. Earlier versions didn't know this flag.
|
# Starting with python3.8, we need to pass the `embed` flag. Earlier versions didn't know this flag.
|
||||||
ifeq "$(shell python3m-config --embed --libs 2>/dev/null | grep -q lpython && echo 1 )" "1"
|
ifeq "$(shell python3m-config --embed --libs 2>/dev/null | grep -q lpython && echo 1 )" "1"
|
||||||
PYTHON_LIB := $(shell python3m-config --libs --embed --ldflags)
|
PYTHON_LIB ?= $(shell python3m-config --libs --embed --ldflags)
|
||||||
else
|
else
|
||||||
PYTHON_LIB := $(shell python3m-config --ldflags)
|
PYTHON_LIB ?= $(shell python3m-config --ldflags)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -207,13 +195,13 @@ endif
|
|||||||
ifeq "$(PYTHON_INCLUDE)" ""
|
ifeq "$(PYTHON_INCLUDE)" ""
|
||||||
ifneq "$(shell command -v python3 2>/dev/null)" ""
|
ifneq "$(shell command -v python3 2>/dev/null)" ""
|
||||||
ifneq "$(shell command -v python3-config 2>/dev/null)" ""
|
ifneq "$(shell command -v python3-config 2>/dev/null)" ""
|
||||||
PYTHON_INCLUDE := $(shell python3-config --includes)
|
PYTHON_INCLUDE ?= $(shell python3-config --includes)
|
||||||
PYTHON_VERSION := $(strip $(shell python3 --version 2>&1))
|
PYTHON_VERSION ?= $(strip $(shell python3 --version 2>&1))
|
||||||
# Starting with python3.8, we need to pass the `embed` flag. Earlier versions didn't know this flag.
|
# Starting with python3.8, we need to pass the `embed` flag. Earier versions didn't know this flag.
|
||||||
ifeq "$(shell python3-config --embed --libs 2>/dev/null | grep -q lpython && echo 1 )" "1"
|
ifeq "$(shell python3-config --embed --libs 2>/dev/null | grep -q lpython && echo 1 )" "1"
|
||||||
PYTHON_LIB := $(shell python3-config --libs --embed --ldflags)
|
PYTHON_LIB ?= $(shell python3-config --libs --embed --ldflags)
|
||||||
else
|
else
|
||||||
PYTHON_LIB := $(shell python3-config --ldflags)
|
PYTHON_LIB ?= $(shell python3-config --ldflags)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -222,9 +210,9 @@ endif
|
|||||||
ifeq "$(PYTHON_INCLUDE)" ""
|
ifeq "$(PYTHON_INCLUDE)" ""
|
||||||
ifneq "$(shell command -v python 2>/dev/null)" ""
|
ifneq "$(shell command -v python 2>/dev/null)" ""
|
||||||
ifneq "$(shell command -v python-config 2>/dev/null)" ""
|
ifneq "$(shell command -v python-config 2>/dev/null)" ""
|
||||||
PYTHON_INCLUDE := $(shell python-config --includes)
|
PYTHON_INCLUDE ?= $(shell python-config --includes)
|
||||||
PYTHON_LIB := $(shell python-config --ldflags)
|
PYTHON_LIB ?= $(shell python-config --ldflags)
|
||||||
PYTHON_VERSION := $(strip $(shell python --version 2>&1))
|
PYTHON_VERSION ?= $(strip $(shell python --version 2>&1))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -233,9 +221,9 @@ endif
|
|||||||
ifeq "$(PYTHON_INCLUDE)" ""
|
ifeq "$(PYTHON_INCLUDE)" ""
|
||||||
ifneq "$(shell command -v python3.7 2>/dev/null)" ""
|
ifneq "$(shell command -v python3.7 2>/dev/null)" ""
|
||||||
ifneq "$(shell command -v python3.7-config 2>/dev/null)" ""
|
ifneq "$(shell command -v python3.7-config 2>/dev/null)" ""
|
||||||
PYTHON_INCLUDE := $(shell python3.7-config --includes)
|
PYTHON_INCLUDE ?= $(shell python3.7-config --includes)
|
||||||
PYTHON_LIB := $(shell python3.7-config --ldflags)
|
PYTHON_LIB ?= $(shell python3.7-config --ldflags)
|
||||||
PYTHON_VERSION := $(strip $(shell python3.7 --version 2>&1))
|
PYTHON_VERSION ?= $(strip $(shell python3.7 --version 2>&1))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -244,9 +232,9 @@ endif
|
|||||||
ifeq "$(PYTHON_INCLUDE)" ""
|
ifeq "$(PYTHON_INCLUDE)" ""
|
||||||
ifneq "$(shell command -v python2.7 2>/dev/null)" ""
|
ifneq "$(shell command -v python2.7 2>/dev/null)" ""
|
||||||
ifneq "$(shell command -v python2.7-config 2>/dev/null)" ""
|
ifneq "$(shell command -v python2.7-config 2>/dev/null)" ""
|
||||||
PYTHON_INCLUDE := $(shell python2.7-config --includes)
|
PYTHON_INCLUDE ?= $(shell python2.7-config --includes)
|
||||||
PYTHON_LIB := $(shell python2.7-config --ldflags)
|
PYTHON_LIB ?= $(shell python2.7-config --ldflags)
|
||||||
PYTHON_VERSION := $(strip $(shell python2.7 --version 2>&1))
|
PYTHON_VERSION ?= $(strip $(shell python2.7 --version 2>&1))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@ -258,22 +246,25 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq "$(filter Linux GNU%,$(SYS))" ""
|
ifneq "$(filter Linux GNU%,$(SYS))" ""
|
||||||
|
ifndef DEBUG
|
||||||
|
override CFLAGS += -D_FORTIFY_SOURCE=2
|
||||||
|
endif
|
||||||
override LDFLAGS += -ldl -lrt -lm
|
override LDFLAGS += -ldl -lrt -lm
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq "$(findstring FreeBSD, $(SYS))" ""
|
ifneq "$(findstring FreeBSD, $(SYS))" ""
|
||||||
override CFLAGS += -pthread
|
override CFLAGS += -pthread
|
||||||
override LDFLAGS += -lpthread -lm
|
override LDFLAGS += -lpthread
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq "$(findstring NetBSD, $(SYS))" ""
|
ifneq "$(findstring NetBSD, $(SYS))" ""
|
||||||
override CFLAGS += -pthread
|
override CFLAGS += -pthread
|
||||||
override LDFLAGS += -lpthread -lm
|
override LDFLAGS += -lpthread
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq "$(findstring OpenBSD, $(SYS))" ""
|
ifneq "$(findstring OpenBSD, $(SYS))" ""
|
||||||
override CFLAGS += -pthread
|
override CFLAGS += -pthread
|
||||||
override LDFLAGS += -lpthread -lm
|
override LDFLAGS += -lpthread
|
||||||
endif
|
endif
|
||||||
|
|
||||||
COMM_HDR = include/alloc-inl.h include/config.h include/debug.h include/types.h
|
COMM_HDR = include/alloc-inl.h include/config.h include/debug.h include/types.h
|
||||||
@ -321,28 +312,22 @@ endif
|
|||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: test_x86 test_shm test_python ready $(PROGS) afl-as llvm gcc_plugin test_build all_done
|
all: test_x86 test_shm test_python ready $(PROGS) afl-as llvm gcc_plugin test_build all_done
|
||||||
-$(MAKE) -C utils/aflpp_driver
|
-$(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 built, 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 built, please install at least llvm-13 and clang-13 or newer, see docs/INSTALL.md"
|
|
||||||
@test -e SanitizerCoverageLTO.so && echo "[+] LLVM LTO mode successfully built" || echo "[-] LLVM LTO mode could not be built, it is optional, if you want it, please install LLVM and LLD 11+. 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
|
.PHONY: llvm
|
||||||
llvm:
|
llvm:
|
||||||
-$(MAKE) -j$(nproc) -f GNUmakefile.llvm
|
ifneq "$(SYS)" "Cygwin"
|
||||||
|
-$(MAKE) -j4 -f GNUmakefile.llvm
|
||||||
|
endif
|
||||||
|
@test -e afl-cc || -$(MAKE) -f GNUmakefile.llvm afl-cc
|
||||||
@test -e afl-cc || { echo "[-] Compiling afl-cc failed. You seem not to have a working compiler." ; exit 1; }
|
@test -e afl-cc || { echo "[-] Compiling afl-cc failed. You seem not to have a working compiler." ; exit 1; }
|
||||||
|
|
||||||
.PHONY: gcc_plugin
|
.PHONY: gcc_plugin
|
||||||
gcc_plugin:
|
gcc_plugin:
|
||||||
ifneq "$(SYS)" "Darwin"
|
ifneq "$(SYS)" "Darwin"
|
||||||
|
ifneq "$(SYS)" "Cygwin"
|
||||||
-$(MAKE) -f GNUmakefile.gcc_plugin
|
-$(MAKE) -f GNUmakefile.gcc_plugin
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
.PHONY: man
|
.PHONY: man
|
||||||
man: $(MANPAGES)
|
man: $(MANPAGES)
|
||||||
@ -370,15 +355,15 @@ performance-test: source-only
|
|||||||
help:
|
help:
|
||||||
@echo "HELP --- the following make targets exist:"
|
@echo "HELP --- the following make targets exist:"
|
||||||
@echo "=========================================="
|
@echo "=========================================="
|
||||||
@echo "all: the main AFL++ binaries and llvm/gcc instrumentation"
|
@echo "all: just the main afl++ binaries"
|
||||||
@echo "binary-only: everything for binary-only fuzzing: frida_mode, nyx_mode, qemu_mode, frida_mode, unicorn_mode, coresight_mode, libdislocator, libtokencap"
|
@echo "binary-only: everything for binary-only fuzzing: qemu_mode, frida_mode, unicorn_mode, coresight_mode, libdislocator, libtokencap"
|
||||||
@echo "source-only: everything for source code fuzzing: nyx_mode, libdislocator, libtokencap"
|
@echo "source-only: everything for source code fuzzing: gcc_plugin, libdislocator, libtokencap"
|
||||||
@echo "distrib: everything (for both binary-only and source code fuzzing)"
|
@echo "distrib: everything (for both binary-only and source code fuzzing)"
|
||||||
@echo "man: creates simple man pages from the help option of the programs"
|
@echo "man: creates simple man pages from the help option of the programs"
|
||||||
@echo "install: installs everything you have compiled with the build option above"
|
@echo "install: installs everything you have compiled with the build option above"
|
||||||
@echo "clean: cleans everything compiled (not downloads when on a checkout)"
|
@echo "clean: cleans everything compiled (not downloads when on a checkout)"
|
||||||
@echo "deepclean: cleans everything including downloads"
|
@echo "deepclean: cleans everything including downloads"
|
||||||
@echo "uninstall: uninstall AFL++ from the system"
|
@echo "uninstall: uninstall afl++ from the system"
|
||||||
@echo "code-format: format the code, do this before you commit and send a PR please!"
|
@echo "code-format: format the code, do this before you commit and send a PR please!"
|
||||||
@echo "tests: this runs the test framework. It is more catered for the developers, but if you run into problems this helps pinpointing the problem"
|
@echo "tests: this runs the test framework. It is more catered for the developers, but if you run into problems this helps pinpointing the problem"
|
||||||
@echo "unit: perform unit tests (based on cmocka and GNU linker)"
|
@echo "unit: perform unit tests (based on cmocka and GNU linker)"
|
||||||
@ -390,24 +375,16 @@ help:
|
|||||||
@echo Known build environment options:
|
@echo Known build environment options:
|
||||||
@echo "=========================================="
|
@echo "=========================================="
|
||||||
@echo STATIC - compile AFL++ static
|
@echo STATIC - compile AFL++ static
|
||||||
@echo "CODE_COVERAGE - compile the target for code coverage (see docs/instrumentation/README.llvm.md)"
|
@echo ASAN_BUILD - compiles with memory sanitizer for debug purposes
|
||||||
@echo ASAN_BUILD - compiles AFL++ with memory sanitizer for debug purposes
|
|
||||||
@echo UBSAN_BUILD - compiles AFL++ tools with undefined behaviour sanitizer for debug purposes
|
|
||||||
@echo DEBUG - no optimization, -ggdb3, all warnings and -Werror
|
@echo DEBUG - no optimization, -ggdb3, all warnings and -Werror
|
||||||
@echo LLVM_DEBUG - shows llvm deprecation warnings
|
|
||||||
@echo PROFILING - compile afl-fuzz with profiling information
|
@echo PROFILING - compile afl-fuzz with profiling information
|
||||||
@echo INTROSPECTION - compile afl-fuzz with mutation introspection
|
@echo INTROSPECTION - compile afl-fuzz with mutation introspection
|
||||||
@echo NO_PYTHON - disable python support
|
@echo NO_PYTHON - disable python support
|
||||||
@echo NO_SPLICING - disables splicing mutation in afl-fuzz, not recommended for normal fuzzing
|
@echo NO_SPLICING - disables splicing mutation in afl-fuzz, not recommended for normal fuzzing
|
||||||
@echo "NO_UTF - do not use UTF-8 for line rendering in status screen (fallback to G1 box drawing, of vanilla AFL)"
|
|
||||||
@echo NO_NYX - disable building nyx mode dependencies
|
|
||||||
@echo "NO_CORESIGHT - disable building coresight (arm64 only)"
|
|
||||||
@echo NO_UNICORN_ARM64 - disable building unicorn on arm64
|
|
||||||
@echo "WAFL_MODE - enable for WASM fuzzing with https://github.com/fgsect/WAFL"
|
|
||||||
@echo AFL_NO_X86 - if compiling on non-intel/amd platforms
|
@echo AFL_NO_X86 - if compiling on non-intel/amd platforms
|
||||||
@echo "LLVM_CONFIG - if your distro doesn't use the standard name for llvm-config (e.g., Debian)"
|
@echo "LLVM_CONFIG - if your distro doesn't use the standard name for llvm-config (e.g. Debian)"
|
||||||
@echo "=========================================="
|
@echo "=========================================="
|
||||||
@echo e.g.: make LLVM_CONFIG=llvm-config-16
|
@echo e.g.: make ASAN_BUILD=1
|
||||||
|
|
||||||
.PHONY: test_x86
|
.PHONY: test_x86
|
||||||
ifndef AFL_NO_X86
|
ifndef AFL_NO_X86
|
||||||
@ -417,7 +394,7 @@ test_x86:
|
|||||||
@echo "[*] Testing the PATH environment variable..."
|
@echo "[*] Testing the PATH environment variable..."
|
||||||
@test "$${PATH}" != "$${PATH#.:}" && { echo "Please remove current directory '.' from PATH to avoid recursion of 'as', thanks!"; echo; exit 1; } || :
|
@test "$${PATH}" != "$${PATH#.:}" && { echo "Please remove current directory '.' from PATH to avoid recursion of 'as', thanks!"; echo; exit 1; } || :
|
||||||
@echo "[*] Checking for the ability to compile x86 code..."
|
@echo "[*] Checking for the ability to compile x86 code..."
|
||||||
@echo 'int main() { __asm__("xorb %al, %al"); }' | $(CC) $(CFLAGS) $(LDFLAGS) -w -x c - -o .test1 || ( echo; echo "Oops, looks like your compiler can't generate x86 code."; echo; echo "Don't panic! You can use the LLVM or QEMU mode, but see docs/INSTALL first."; echo "(To ignore this error, set AFL_NO_X86=1 and try again.)"; echo; exit 1 )
|
@echo 'main() { __asm__("xorb %al, %al"); }' | $(CC) $(CFLAGS) -w -x c - -o .test1 || ( echo; echo "Oops, looks like your compiler can't generate x86 code."; echo; echo "Don't panic! You can use the LLVM or QEMU mode, but see docs/INSTALL first."; echo "(To ignore this error, set AFL_NO_X86=1 and try again.)"; echo; exit 1 )
|
||||||
@rm -f .test1
|
@rm -f .test1
|
||||||
else
|
else
|
||||||
test_x86:
|
test_x86:
|
||||||
@ -441,19 +418,19 @@ test_python:
|
|||||||
@echo "[+] $(PYTHON_VERSION) support seems to be working."
|
@echo "[+] $(PYTHON_VERSION) support seems to be working."
|
||||||
else
|
else
|
||||||
test_python:
|
test_python:
|
||||||
@echo "[-] You seem to need to install the package python3-dev or python-dev (and perhaps python[3]-apt), but it is optional so we continue"
|
@echo "[-] You seem to need to install the package python3-dev, python2-dev or python-dev (and perhaps python[23]-apt), but it is optional so we continue"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: ready
|
.PHONY: ready
|
||||||
ready:
|
ready:
|
||||||
@echo "[+] Everything seems to be working, ready to compile. ($(shell $(CC) --version 2>&1|head -n 1))"
|
@echo "[+] Everything seems to be working, ready to compile."
|
||||||
|
|
||||||
afl-as: src/afl-as.c include/afl-as.h $(COMM_HDR) | test_x86
|
afl-as: src/afl-as.c include/afl-as.h $(COMM_HDR) | test_x86
|
||||||
$(CC) $(CFLAGS) src/$@.c -o $@ $(LDFLAGS)
|
$(CC) $(CFLAGS) src/$@.c -o $@ $(LDFLAGS)
|
||||||
@ln -sf afl-as as
|
@ln -sf afl-as as
|
||||||
|
|
||||||
src/afl-performance.o : $(COMM_HDR) src/afl-performance.c include/hash.h
|
src/afl-performance.o : $(COMM_HDR) src/afl-performance.c include/hash.h
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_OPT) -Iinclude -c src/afl-performance.c -o src/afl-performance.o
|
$(CC) $(CFLAGS) -Iinclude $(SPECIAL_PERFORMANCE) -O3 -fno-unroll-loops -c src/afl-performance.c -o src/afl-performance.o
|
||||||
|
|
||||||
src/afl-common.o : $(COMM_HDR) src/afl-common.c include/common.h
|
src/afl-common.o : $(COMM_HDR) src/afl-common.c include/common.h
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_FLTO) -c src/afl-common.c -o src/afl-common.o
|
$(CC) $(CFLAGS) $(CFLAGS_FLTO) -c src/afl-common.c -o src/afl-common.o
|
||||||
@ -468,7 +445,7 @@ afl-fuzz: $(COMM_HDR) include/afl-fuzz.h $(AFL_FUZZ_FILES) src/afl-common.o src/
|
|||||||
$(CC) $(CFLAGS) $(COMPILE_STATIC) $(CFLAGS_FLTO) $(AFL_FUZZ_FILES) src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o -o $@ $(PYFLAGS) $(LDFLAGS) -lm
|
$(CC) $(CFLAGS) $(COMPILE_STATIC) $(CFLAGS_FLTO) $(AFL_FUZZ_FILES) src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o -o $@ $(PYFLAGS) $(LDFLAGS) -lm
|
||||||
|
|
||||||
afl-showmap: src/afl-showmap.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o $(COMM_HDR) | test_x86
|
afl-showmap: src/afl-showmap.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o $(COMM_HDR) | test_x86
|
||||||
$(CC) $(CFLAGS) $(COMPILE_STATIC) $(CFLAGS_FLTO) src/$@.c src/afl-fuzz-mutators.c src/afl-fuzz-python.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o -o $@ $(PYFLAGS) $(LDFLAGS)
|
$(CC) $(CFLAGS) $(COMPILE_STATIC) $(CFLAGS_FLTO) src/$@.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o -o $@ $(LDFLAGS)
|
||||||
|
|
||||||
afl-tmin: src/afl-tmin.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o $(COMM_HDR) | test_x86
|
afl-tmin: src/afl-tmin.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o $(COMM_HDR) | test_x86
|
||||||
$(CC) $(CFLAGS) $(COMPILE_STATIC) $(CFLAGS_FLTO) src/$@.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o -o $@ $(LDFLAGS)
|
$(CC) $(CFLAGS) $(COMPILE_STATIC) $(CFLAGS_FLTO) src/$@.c src/afl-common.o src/afl-sharedmem.o src/afl-forkserver.o src/afl-performance.o -o $@ $(LDFLAGS)
|
||||||
@ -561,9 +538,9 @@ code-format:
|
|||||||
ifndef AFL_NO_X86
|
ifndef AFL_NO_X86
|
||||||
test_build: afl-cc afl-gcc afl-as afl-showmap
|
test_build: afl-cc afl-gcc afl-as afl-showmap
|
||||||
@echo "[*] Testing the CC wrapper afl-cc and its instrumentation output..."
|
@echo "[*] Testing the CC wrapper afl-cc and its instrumentation output..."
|
||||||
@unset AFL_MAP_SIZE AFL_USE_UBSAN AFL_USE_CFISAN AFL_USE_LSAN AFL_USE_ASAN AFL_USE_MSAN; ASAN_OPTIONS=detect_leaks=0 AFL_INST_RATIO=100 AFL_PATH=. ./afl-cc test-instr.c $(LDFLAGS) -o test-instr 2>&1 || (echo "Oops, afl-cc failed"; exit 1 )
|
@unset AFL_MAP_SIZE AFL_USE_UBSAN AFL_USE_CFISAN AFL_USE_LSAN AFL_USE_ASAN AFL_USE_MSAN; ASAN_OPTIONS=detect_leaks=0 AFL_INST_RATIO=100 AFL_PATH=. ./afl-cc test-instr.c -o test-instr 2>&1 || (echo "Oops, afl-cc failed"; exit 1 )
|
||||||
-ASAN_OPTIONS=detect_leaks=0 ./afl-showmap -q -m none -o .test-instr0 ./test-instr < /dev/null
|
ASAN_OPTIONS=detect_leaks=0 ./afl-showmap -m none -q -o .test-instr0 ./test-instr < /dev/null
|
||||||
-echo 1 | ASAN_OPTIONS=detect_leaks=0 ./afl-showmap -m none -q -o .test-instr1 ./test-instr
|
echo 1 | ASAN_OPTIONS=detect_leaks=0 ./afl-showmap -m none -q -o .test-instr1 ./test-instr
|
||||||
@rm -f test-instr
|
@rm -f test-instr
|
||||||
@cmp -s .test-instr0 .test-instr1; DR="$$?"; rm -f .test-instr0 .test-instr1; if [ "$$DR" = "0" ]; then echo; echo "Oops, the instrumentation of afl-cc does not seem to be behaving correctly!"; echo; echo "Please post to https://github.com/AFLplusplus/AFLplusplus/issues to troubleshoot the issue."; echo; exit 1; fi
|
@cmp -s .test-instr0 .test-instr1; DR="$$?"; rm -f .test-instr0 .test-instr1; if [ "$$DR" = "0" ]; then echo; echo "Oops, the instrumentation of afl-cc does not seem to be behaving correctly!"; echo; echo "Please post to https://github.com/AFLplusplus/AFLplusplus/issues to troubleshoot the issue."; echo; exit 1; fi
|
||||||
@echo
|
@echo
|
||||||
@ -597,27 +574,26 @@ all_done: test_build
|
|||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(PROGS) afl-fuzz-document afl-as as afl-g++ afl-clang afl-clang++ *.o src/*.o *~ a.out core core.[1-9][0-9]* *.stackdump .test .test1 .test2 test-instr .test-instr0 .test-instr1 afl-cs-proxy afl-qemu-trace afl-gcc-fast afl-g++-fast ld *.so *.8 test/unittests/*.o test/unittests/unit_maybe_alloc test/unittests/preallocable .afl-* afl-gcc afl-g++ afl-clang afl-clang++ test/unittests/unit_hash test/unittests/unit_rand *.dSYM lib*.a
|
rm -rf $(PROGS) libradamsa.so afl-fuzz-document afl-as as afl-g++ afl-clang afl-clang++ *.o src/*.o *~ a.out core core.[1-9][0-9]* *.stackdump .test .test1 .test2 test-instr .test-instr0 .test-instr1 afl-cs-proxy afl-qemu-trace afl-gcc-fast afl-gcc-pass.so afl-g++-fast ld *.so *.8 test/unittests/*.o test/unittests/unit_maybe_alloc test/unittests/preallocable .afl-* afl-gcc afl-g++ afl-clang afl-clang++ test/unittests/unit_hash test/unittests/unit_rand *.dSYM
|
||||||
|
ifneq "$(SYS)" "Cygwin"
|
||||||
-$(MAKE) -f GNUmakefile.llvm clean
|
-$(MAKE) -f GNUmakefile.llvm clean
|
||||||
-$(MAKE) -f GNUmakefile.gcc_plugin clean
|
-$(MAKE) -f GNUmakefile.gcc_plugin clean
|
||||||
-$(MAKE) -C utils/libdislocator clean
|
endif
|
||||||
-$(MAKE) -C utils/libtokencap clean
|
$(MAKE) -C utils/libdislocator clean
|
||||||
-$(MAKE) -C utils/aflpp_driver clean
|
$(MAKE) -C utils/libtokencap clean
|
||||||
-$(MAKE) -C utils/afl_network_proxy clean
|
$(MAKE) -C utils/aflpp_driver clean
|
||||||
-$(MAKE) -C utils/socket_fuzzing clean
|
$(MAKE) -C utils/afl_network_proxy clean
|
||||||
-$(MAKE) -C utils/argv_fuzzing clean
|
$(MAKE) -C utils/socket_fuzzing clean
|
||||||
|
$(MAKE) -C utils/argv_fuzzing clean
|
||||||
-$(MAKE) -C utils/plot_ui clean
|
-$(MAKE) -C utils/plot_ui clean
|
||||||
-$(MAKE) -C qemu_mode/unsigaction clean
|
$(MAKE) -C qemu_mode/unsigaction clean
|
||||||
-$(MAKE) -C qemu_mode/fastexit clean
|
$(MAKE) -C qemu_mode/libcompcov clean
|
||||||
-$(MAKE) -C qemu_mode/libcompcov clean
|
$(MAKE) -C qemu_mode/libqasan clean
|
||||||
-$(MAKE) -C qemu_mode/libqasan clean
|
|
||||||
-$(MAKE) -C frida_mode clean
|
-$(MAKE) -C frida_mode clean
|
||||||
rm -rf nyx_mode/packer/linux_initramfs/init.cpio.gz nyx_mode/libnyx/libnyx/target/release/* nyx_mode/QEMU-Nyx/x86_64-softmmu/qemu-system-x86_64
|
|
||||||
ifeq "$(IN_REPO)" "1"
|
ifeq "$(IN_REPO)" "1"
|
||||||
-test -e coresight_mode/coresight-trace/Makefile && $(MAKE) -C coresight_mode/coresight-trace clean || true
|
-test -e coresight_mode/coresight-trace/Makefile && $(MAKE) -C coresight_mode/coresight-trace clean || true
|
||||||
-test -e qemu_mode/qemuafl/Makefile && $(MAKE) -C qemu_mode/qemuafl clean || true
|
-test -e qemu_mode/qemuafl/Makefile && $(MAKE) -C qemu_mode/qemuafl clean || true
|
||||||
-test -e unicorn_mode/unicornafl/Makefile && $(MAKE) -C unicorn_mode/unicornafl clean || true
|
test -e unicorn_mode/unicornafl/Makefile && $(MAKE) -C unicorn_mode/unicornafl clean || true
|
||||||
-test -e nyx_mode/QEMU-Nyx/Makefile && $(MAKE) -C nyx_mode/QEMU-Nyx clean || true
|
|
||||||
else
|
else
|
||||||
rm -rf coresight_mode/coresight_trace
|
rm -rf coresight_mode/coresight_trace
|
||||||
rm -rf qemu_mode/qemuafl
|
rm -rf qemu_mode/qemuafl
|
||||||
@ -629,140 +605,67 @@ deepclean: clean
|
|||||||
rm -rf coresight_mode/coresight-trace
|
rm -rf coresight_mode/coresight-trace
|
||||||
rm -rf unicorn_mode/unicornafl
|
rm -rf unicorn_mode/unicornafl
|
||||||
rm -rf qemu_mode/qemuafl
|
rm -rf qemu_mode/qemuafl
|
||||||
rm -rf nyx_mode/libnyx nyx_mode/packer nyx_mode/QEMU-Nyx
|
|
||||||
ifeq "$(IN_REPO)" "1"
|
ifeq "$(IN_REPO)" "1"
|
||||||
|
# NEVER EVER ACTIVATE THAT!!!!! git reset --hard >/dev/null 2>&1 || true
|
||||||
git checkout coresight_mode/coresight-trace
|
git checkout coresight_mode/coresight-trace
|
||||||
git checkout unicorn_mode/unicornafl
|
git checkout unicorn_mode/unicornafl
|
||||||
git checkout qemu_mode/qemuafl
|
git checkout qemu_mode/qemuafl
|
||||||
git checkout nyx_mode/libnyx
|
|
||||||
git checkout nyx_mode/packer
|
|
||||||
git checkout nyx_mode/QEMU-Nyx
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: distrib
|
.PHONY: distrib
|
||||||
distrib: all
|
distrib: all
|
||||||
-$(MAKE) -j$(nproc) -f GNUmakefile.llvm
|
ifneq "$(SYS)" "Cygwin"
|
||||||
|
-$(MAKE) -j4 -f GNUmakefile.llvm
|
||||||
ifneq "$(SYS)" "Darwin"
|
ifneq "$(SYS)" "Darwin"
|
||||||
-$(MAKE) -f GNUmakefile.gcc_plugin
|
-$(MAKE) -f GNUmakefile.gcc_plugin
|
||||||
-$(MAKE) -C utils/libdislocator
|
|
||||||
-$(MAKE) -C utils/libtokencap
|
|
||||||
endif
|
endif
|
||||||
-$(MAKE) -C utils/afl_network_proxy
|
endif
|
||||||
-$(MAKE) -C utils/socket_fuzzing
|
$(MAKE) -C utils/libdislocator
|
||||||
-$(MAKE) -C utils/argv_fuzzing
|
$(MAKE) -C utils/libtokencap
|
||||||
|
$(MAKE) -C utils/afl_network_proxy
|
||||||
|
$(MAKE) -C utils/socket_fuzzing
|
||||||
|
$(MAKE) -C utils/argv_fuzzing
|
||||||
# -$(MAKE) -C utils/plot_ui
|
# -$(MAKE) -C utils/plot_ui
|
||||||
-$(MAKE) -C frida_mode
|
-$(MAKE) -C frida_mode
|
||||||
ifneq "$(SYS)" "Darwin"
|
ifneq "$(SYS)" "Darwin"
|
||||||
ifeq "$(ARCH)" "aarch64"
|
ifeq "$(ARCH)" "aarch64"
|
||||||
ifndef NO_CORESIGHT
|
|
||||||
-$(MAKE) -C coresight_mode
|
-$(MAKE) -C coresight_mode
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq "$(SYS)" "Linux"
|
|
||||||
ifndef NO_NYX
|
|
||||||
-cd nyx_mode && ./build_nyx_support.sh
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
-cd qemu_mode && sh ./build_qemu_support.sh
|
-cd qemu_mode && sh ./build_qemu_support.sh
|
||||||
ifeq "$(ARCH)" "aarch64"
|
|
||||||
ifndef NO_UNICORN_ARM64
|
|
||||||
-cd unicorn_mode && unset CFLAGS && sh ./build_unicorn_support.sh
|
-cd unicorn_mode && unset CFLAGS && sh ./build_unicorn_support.sh
|
||||||
endif
|
|
||||||
else
|
|
||||||
-cd unicorn_mode && unset CFLAGS && sh ./build_unicorn_support.sh
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: binary-only
|
.PHONY: binary-only
|
||||||
binary-only: test_shm test_python ready $(PROGS)
|
binary-only: test_shm test_python ready $(PROGS)
|
||||||
ifneq "$(SYS)" "Darwin"
|
$(MAKE) -C utils/libdislocator
|
||||||
-$(MAKE) -C utils/libdislocator
|
$(MAKE) -C utils/libtokencap
|
||||||
-$(MAKE) -C utils/libtokencap
|
$(MAKE) -C utils/afl_network_proxy
|
||||||
endif
|
$(MAKE) -C utils/socket_fuzzing
|
||||||
-$(MAKE) -C utils/afl_network_proxy
|
$(MAKE) -C utils/argv_fuzzing
|
||||||
-$(MAKE) -C utils/socket_fuzzing
|
|
||||||
-$(MAKE) -C utils/argv_fuzzing
|
|
||||||
# -$(MAKE) -C utils/plot_ui
|
# -$(MAKE) -C utils/plot_ui
|
||||||
-$(MAKE) -C frida_mode
|
-$(MAKE) -C frida_mode
|
||||||
ifneq "$(SYS)" "Darwin"
|
ifneq "$(SYS)" "Darwin"
|
||||||
ifeq "$(ARCH)" "aarch64"
|
ifeq "$(ARCH)" "aarch64"
|
||||||
ifndef NO_CORESIGHT
|
|
||||||
-$(MAKE) -C coresight_mode
|
-$(MAKE) -C coresight_mode
|
||||||
endif
|
|
||||||
endif
|
|
||||||
ifeq "$(SYS)" "Linux"
|
|
||||||
ifndef NO_NYX
|
|
||||||
-cd nyx_mode && ./build_nyx_support.sh
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
-cd qemu_mode && sh ./build_qemu_support.sh
|
-cd qemu_mode && sh ./build_qemu_support.sh
|
||||||
ifeq "$(ARCH)" "aarch64"
|
|
||||||
ifndef NO_UNICORN_ARM64
|
|
||||||
-cd unicorn_mode && unset CFLAGS && sh ./build_unicorn_support.sh
|
-cd unicorn_mode && unset CFLAGS && sh ./build_unicorn_support.sh
|
||||||
endif
|
|
||||||
else
|
|
||||||
-cd unicorn_mode && unset CFLAGS && sh ./build_unicorn_support.sh
|
|
||||||
endif
|
|
||||||
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
|
.PHONY: source-only
|
||||||
source-only: all
|
source-only: all
|
||||||
-$(MAKE) -j$(nproc) -f GNUmakefile.llvm
|
ifneq "$(SYS)" "Cygwin"
|
||||||
|
-$(MAKE) -j4 -f GNUmakefile.llvm
|
||||||
ifneq "$(SYS)" "Darwin"
|
ifneq "$(SYS)" "Darwin"
|
||||||
-$(MAKE) -f GNUmakefile.gcc_plugin
|
-$(MAKE) -f GNUmakefile.gcc_plugin
|
||||||
-$(MAKE) -C utils/libdislocator
|
|
||||||
-$(MAKE) -C utils/libtokencap
|
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
$(MAKE) -C utils/libdislocator
|
||||||
|
$(MAKE) -C utils/libtokencap
|
||||||
# -$(MAKE) -C utils/plot_ui
|
# -$(MAKE) -C utils/plot_ui
|
||||||
ifeq "$(SYS)" "Linux"
|
|
||||||
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 built, 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 built, please install at least llvm-13 and clang-13 or newer, see docs/INSTALL.md"
|
|
||||||
@test -e SanitizerCoverageLTO.so && echo "[+] LLVM LTO mode successfully built" || echo "[-] LLVM LTO mode could not be built, 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: %
|
%.8: %
|
||||||
@echo .TH $* 8 $(BUILD_DATE) "AFL++" > $@
|
@echo .TH $* 8 $(BUILD_DATE) "afl++" > $@
|
||||||
@echo .SH NAME >> $@
|
@echo .SH NAME >> $@
|
||||||
@echo .B $* >> $@
|
@echo .B $* >> $@
|
||||||
@echo >> $@
|
@echo >> $@
|
||||||
@ -774,8 +677,8 @@ endif
|
|||||||
@./$* -hh 2>&1 | tail -n +4 >> $@
|
@./$* -hh 2>&1 | tail -n +4 >> $@
|
||||||
@echo >> $@
|
@echo >> $@
|
||||||
@echo .SH AUTHOR >> $@
|
@echo .SH AUTHOR >> $@
|
||||||
@echo "AFL++ was written by Michal \"lcamtuf\" Zalewski and is maintained by Marc \"van Hauser\" Heuse <mh@mh-sec.de>, Dominik Maier <domenukk@gmail.com>, Andrea Fioraldi <andreafioraldi@gmail.com> and Heiko \"hexcoder-\" Eissfeldt <heiko.eissfeldt@hexco.de>" >> $@
|
@echo "afl++ was written by Michal \"lcamtuf\" Zalewski and is maintained by Marc \"van Hauser\" Heuse <mh@mh-sec.de>, Heiko \"hexcoder-\" Eissfeldt <heiko.eissfeldt@hexco.de>, Andrea Fioraldi <andreafioraldi@gmail.com> and Dominik Maier <domenukk@gmail.com>" >> $@
|
||||||
@echo The homepage of AFL++ is: https://github.com/AFLplusplus/AFLplusplus >> $@
|
@echo The homepage of afl++ is: https://github.com/AFLplusplus/AFLplusplus >> $@
|
||||||
@echo >> $@
|
@echo >> $@
|
||||||
@echo .SH LICENSE >> $@
|
@echo .SH LICENSE >> $@
|
||||||
@echo Apache License Version 2.0, January 2004 >> $@
|
@echo Apache License Version 2.0, January 2004 >> $@
|
||||||
@ -786,7 +689,6 @@ install: all $(MANPAGES)
|
|||||||
@rm -f $${DESTDIR}$(BIN_PATH)/afl-plot.sh
|
@rm -f $${DESTDIR}$(BIN_PATH)/afl-plot.sh
|
||||||
@rm -f $${DESTDIR}$(BIN_PATH)/afl-as
|
@rm -f $${DESTDIR}$(BIN_PATH)/afl-as
|
||||||
@rm -f $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt.o $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt-32.o $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt-64.o $${DESTDIR}$(HELPER_PATH)/afl-gcc-rt.o
|
@rm -f $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt.o $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt-32.o $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt-64.o $${DESTDIR}$(HELPER_PATH)/afl-gcc-rt.o
|
||||||
@for i in afl-llvm-dict2file.so afl-llvm-lto-instrumentlist.so afl-llvm-pass.so cmplog-instructions-pass.so cmplog-routines-pass.so cmplog-switches-pass.so compare-transform-pass.so libcompcov.so libdislocator.so libnyx.so libqasan.so libtokencap.so SanitizerCoverageLTO.so SanitizerCoveragePCGUARD.so split-compares-pass.so split-switches-pass.so injection-pass.so; do echo rm -fv $${DESTDIR}$(HELPER_PATH)/$${i}; done
|
|
||||||
install -m 755 $(PROGS) $(SH_PROGS) $${DESTDIR}$(BIN_PATH)
|
install -m 755 $(PROGS) $(SH_PROGS) $${DESTDIR}$(BIN_PATH)
|
||||||
@if [ -f afl-qemu-trace ]; then install -m 755 afl-qemu-trace $${DESTDIR}$(BIN_PATH); fi
|
@if [ -f afl-qemu-trace ]; then install -m 755 afl-qemu-trace $${DESTDIR}$(BIN_PATH); fi
|
||||||
@if [ -f utils/plot_ui/afl-plot-ui ]; then install -m 755 utils/plot_ui/afl-plot-ui $${DESTDIR}$(BIN_PATH); fi
|
@if [ -f utils/plot_ui/afl-plot-ui ]; then install -m 755 utils/plot_ui/afl-plot-ui $${DESTDIR}$(BIN_PATH); fi
|
||||||
@ -798,13 +700,14 @@ install: all $(MANPAGES)
|
|||||||
@if [ -f socketfuzz32.so -o -f socketfuzz64.so ]; then $(MAKE) -C utils/socket_fuzzing install; fi
|
@if [ -f socketfuzz32.so -o -f socketfuzz64.so ]; then $(MAKE) -C utils/socket_fuzzing install; fi
|
||||||
@if [ -f argvfuzz32.so -o -f argvfuzz64.so ]; then $(MAKE) -C utils/argv_fuzzing install; fi
|
@if [ -f argvfuzz32.so -o -f argvfuzz64.so ]; then $(MAKE) -C utils/argv_fuzzing install; fi
|
||||||
@if [ -f afl-frida-trace.so ]; then install -m 755 afl-frida-trace.so $${DESTDIR}$(HELPER_PATH); fi
|
@if [ -f afl-frida-trace.so ]; then install -m 755 afl-frida-trace.so $${DESTDIR}$(HELPER_PATH); fi
|
||||||
@if [ -f libnyx.so ]; then install -m 755 libnyx.so $${DESTDIR}$(HELPER_PATH); fi
|
|
||||||
@if [ -f utils/afl_network_proxy/afl-network-server ]; then $(MAKE) -C utils/afl_network_proxy install; fi
|
@if [ -f utils/afl_network_proxy/afl-network-server ]; then $(MAKE) -C utils/afl_network_proxy install; fi
|
||||||
@if [ -f utils/aflpp_driver/libAFLDriver.a ]; then set -e; install -m 644 utils/aflpp_driver/libAFLDriver.a $${DESTDIR}$(HELPER_PATH); fi
|
@if [ -f utils/aflpp_driver/libAFLDriver.a ]; then set -e; install -m 644 utils/aflpp_driver/libAFLDriver.a $${DESTDIR}$(HELPER_PATH); fi
|
||||||
@if [ -f utils/aflpp_driver/libAFLQemuDriver.a ]; then set -e; install -m 644 utils/aflpp_driver/libAFLQemuDriver.a $${DESTDIR}$(HELPER_PATH); fi
|
@if [ -f utils/aflpp_driver/libAFLQemuDriver.a ]; then set -e; install -m 644 utils/aflpp_driver/libAFLQemuDriver.a $${DESTDIR}$(HELPER_PATH); fi
|
||||||
|
ifneq "$(SYS)" "Cygwin"
|
||||||
-$(MAKE) -f GNUmakefile.llvm install
|
-$(MAKE) -f GNUmakefile.llvm install
|
||||||
ifneq "$(SYS)" "Darwin"
|
ifneq "$(SYS)" "Darwin"
|
||||||
-$(MAKE) -f GNUmakefile.gcc_plugin install
|
-$(MAKE) -f GNUmakefile.gcc_plugin install
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-gcc
|
ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-gcc
|
||||||
ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-g++
|
ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-g++
|
||||||
@ -817,12 +720,11 @@ endif
|
|||||||
install -m 644 docs/*.md $${DESTDIR}$(DOC_PATH)
|
install -m 644 docs/*.md $${DESTDIR}$(DOC_PATH)
|
||||||
cp -r testcases/ $${DESTDIR}$(MISC_PATH)
|
cp -r testcases/ $${DESTDIR}$(MISC_PATH)
|
||||||
cp -r dictionaries/ $${DESTDIR}$(MISC_PATH)
|
cp -r dictionaries/ $${DESTDIR}$(MISC_PATH)
|
||||||
cp injections.dic $${DESTDIR}$(MISC_PATH)
|
|
||||||
|
|
||||||
.PHONY: uninstall
|
.PHONY: uninstall
|
||||||
uninstall:
|
uninstall:
|
||||||
-cd $${DESTDIR}$(BIN_PATH) && rm -f $(PROGS) $(SH_PROGS) afl-cs-proxy afl-qemu-trace afl-plot-ui afl-fuzz-document afl-network-client afl-network-server afl-g* afl-plot.sh afl-as afl-ld-lto afl-c* afl-lto*
|
-cd $${DESTDIR}$(BIN_PATH) && rm -f $(PROGS) $(SH_PROGS) afl-cs-proxy afl-qemu-trace afl-plot-ui afl-fuzz-document afl-network-server afl-g* afl-plot.sh afl-as afl-ld-lto afl-c* afl-lto*
|
||||||
-cd $${DESTDIR}$(HELPER_PATH) && rm -f afl-g*.*o afl-llvm-*.*o afl-compiler-*.*o libdislocator.so libtokencap.so libcompcov.so libqasan.so afl-frida-trace.so libnyx.so socketfuzz*.so argvfuzz*.so libAFLDriver.a libAFLQemuDriver.a as afl-as SanitizerCoverage*.so compare-transform-pass.so cmplog-*-pass.so split-*-pass.so dynamic_list.txt injections.dic
|
-cd $${DESTDIR}$(HELPER_PATH) && rm -f afl-g*.*o afl-llvm-*.*o afl-compiler-*.*o libdislocator.so libtokencap.so libcompcov.so libqasan.so afl-frida-trace.so socketfuzz*.so argvfuzz*.so libAFLDriver.a libAFLQemuDriver.a as afl-as SanitizerCoverage*.so compare-transform-pass.so cmplog-*-pass.so split-*-pass.so dynamic_list.txt
|
||||||
-rm -rf $${DESTDIR}$(MISC_PATH)/testcases $${DESTDIR}$(MISC_PATH)/dictionaries
|
-rm -rf $${DESTDIR}$(MISC_PATH)/testcases $${DESTDIR}$(MISC_PATH)/dictionaries
|
||||||
-sh -c "ls docs/*.md | sed 's|^docs/|$${DESTDIR}$(DOC_PATH)/|' | xargs rm -f"
|
-sh -c "ls docs/*.md | sed 's|^docs/|$${DESTDIR}$(DOC_PATH)/|' | xargs rm -f"
|
||||||
-cd $${DESTDIR}$(MAN_PATH) && rm -f $(MANPAGES)
|
-cd $${DESTDIR}$(MAN_PATH) && rm -f $(MANPAGES)
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
# from Laszlo Szekeres.
|
# from Laszlo Szekeres.
|
||||||
#
|
#
|
||||||
# Copyright 2015 Google Inc. All rights reserved.
|
# Copyright 2015 Google Inc. All rights reserved.
|
||||||
# Copyright 2019-2024 AFLplusplus Project. All rights reserved.
|
# Copyright 2019-2020 AFLplusplus Project. All rights reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@ -28,17 +28,15 @@ MAN_PATH ?= $(PREFIX)/share/man/man8
|
|||||||
|
|
||||||
VERSION = $(shell grep '^$(HASH)define VERSION ' ./config.h | cut -d '"' -f2)
|
VERSION = $(shell grep '^$(HASH)define VERSION ' ./config.h | cut -d '"' -f2)
|
||||||
|
|
||||||
CFLAGS ?= -O3 -g -funroll-loops
|
CFLAGS ?= -O3 -g -funroll-loops -D_FORTIFY_SOURCE=2
|
||||||
# -D_FORTIFY_SOURCE=1
|
|
||||||
CFLAGS_SAFE := -Wall -Iinclude -Wno-pointer-sign \
|
CFLAGS_SAFE := -Wall -Iinclude -Wno-pointer-sign \
|
||||||
-DAFL_PATH=\"$(HELPER_PATH)\" -DBIN_PATH=\"$(BIN_PATH)\" \
|
-DAFL_PATH=\"$(HELPER_PATH)\" -DBIN_PATH=\"$(BIN_PATH)\" \
|
||||||
-DGCC_VERSION=\"$(GCCVER)\" -DGCC_BINDIR=\"$(GCCBINDIR)\" \
|
-DGCC_VERSION=\"$(GCCVER)\" -DGCC_BINDIR=\"$(GCCBINDIR)\" \
|
||||||
-Wno-unused-function
|
-Wno-unused-function
|
||||||
override CFLAGS += $(CFLAGS_SAFE)
|
override CFLAGS += $(CFLAGS_SAFE)
|
||||||
|
|
||||||
CXXFLAGS ?= -O3 -g -funroll-loops
|
CXXFLAGS ?= -O3 -g -funroll-loops -D_FORTIFY_SOURCE=2
|
||||||
# -D_FORTIFY_SOURCE=1
|
CXXEFLAGS := $(CXXFLAGS) -Wall -std=c++11
|
||||||
CXXEFLAGS := $(CXXFLAGS) $(CPPFLAGS) -Wall -std=c++11
|
|
||||||
|
|
||||||
CC ?= gcc
|
CC ?= gcc
|
||||||
CXX ?= g++
|
CXX ?= g++
|
||||||
@ -61,7 +59,7 @@ ifeq "$(findstring Foundation,$(shell $(CC) --version))" ""
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
PLUGIN_BASE = "$(shell $(CC) -print-file-name=plugin)"
|
PLUGIN_BASE = "$(shell $(CC) -print-file-name=plugin)"
|
||||||
PLUGIN_FLAGS = -fPIC -fno-rtti -fno-exceptions -I$(PLUGIN_BASE)/include -I$(PLUGIN_BASE)
|
PLUGIN_FLAGS = -fPIC -fno-rtti -I$(PLUGIN_BASE)/include -I$(PLUGIN_BASE)
|
||||||
HASH=\#
|
HASH=\#
|
||||||
|
|
||||||
GCCVER = $(shell $(CC) --version 2>/dev/null | awk 'NR == 1 {print $$NF}')
|
GCCVER = $(shell $(CC) --version 2>/dev/null | awk 'NR == 1 {print $$NF}')
|
||||||
@ -102,9 +100,7 @@ ifeq "$(SYS)" "SunOS"
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
PASSES = ./afl-gcc-pass.so ./afl-gcc-cmplog-pass.so ./afl-gcc-cmptrs-pass.so
|
PROGS = ./afl-gcc-pass.so ./afl-compiler-rt.o ./afl-compiler-rt-32.o ./afl-compiler-rt-64.o
|
||||||
|
|
||||||
PROGS = $(PASSES) ./afl-compiler-rt.o ./afl-compiler-rt-32.o ./afl-compiler-rt-64.o
|
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: test_shm test_deps $(PROGS) test_build all_done
|
all: test_shm test_deps $(PROGS) test_build all_done
|
||||||
@ -139,13 +135,11 @@ afl-common.o: ./src/afl-common.c
|
|||||||
|
|
||||||
./afl-compiler-rt-32.o: instrumentation/afl-compiler-rt.o.c
|
./afl-compiler-rt-32.o: instrumentation/afl-compiler-rt.o.c
|
||||||
@printf "[*] Building 32-bit variant of the runtime (-m32)... "
|
@printf "[*] Building 32-bit variant of the runtime (-m32)... "
|
||||||
@$(CC) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -m32 -fPIC -c $< -o $@ 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; else echo "failed (that's fine)"; fi
|
@$(CC) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -m32 -fPIC -c $< -o $@ 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; ln -sf afl-compiler-rt-32.o afl-llvm-rt-32.o; else echo "failed (that's fine)"; fi
|
||||||
|
|
||||||
./afl-compiler-rt-64.o: instrumentation/afl-compiler-rt.o.c
|
./afl-compiler-rt-64.o: instrumentation/afl-compiler-rt.o.c
|
||||||
@printf "[*] Building 64-bit variant of the runtime (-m64)... "
|
@printf "[*] Building 64-bit variant of the runtime (-m64)... "
|
||||||
@$(CC) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -m64 -fPIC -c $< -o $@ 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; else echo "failed (that's fine)"; fi
|
@$(CC) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -m64 -fPIC -c $< -o $@ 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; ln -sf afl-compiler-rt-64.o afl-llvm-rt-64.o; else echo "failed (that's fine)"; fi
|
||||||
|
|
||||||
$(PASSES): instrumentation/afl-gcc-common.h
|
|
||||||
|
|
||||||
./afl-gcc-pass.so: instrumentation/afl-gcc-pass.so.cc | test_deps
|
./afl-gcc-pass.so: instrumentation/afl-gcc-pass.so.cc | test_deps
|
||||||
$(CXX) $(CXXEFLAGS) $(PLUGIN_FLAGS) -shared $< -o $@
|
$(CXX) $(CXXEFLAGS) $(PLUGIN_FLAGS) -shared $< -o $@
|
||||||
@ -154,12 +148,6 @@ $(PASSES): instrumentation/afl-gcc-common.h
|
|||||||
ln -sf afl-cc.8 afl-gcc-fast.8
|
ln -sf afl-cc.8 afl-gcc-fast.8
|
||||||
ln -sf afl-cc.8 afl-g++-fast.8
|
ln -sf afl-cc.8 afl-g++-fast.8
|
||||||
|
|
||||||
./afl-gcc-cmplog-pass.so: instrumentation/afl-gcc-cmplog-pass.so.cc | test_deps
|
|
||||||
$(CXX) $(CXXEFLAGS) $(PLUGIN_FLAGS) -shared $< -o $@
|
|
||||||
|
|
||||||
./afl-gcc-cmptrs-pass.so: instrumentation/afl-gcc-cmptrs-pass.so.cc | test_deps
|
|
||||||
$(CXX) $(CXXEFLAGS) $(PLUGIN_FLAGS) -shared $< -o $@
|
|
||||||
|
|
||||||
.PHONY: test_build
|
.PHONY: test_build
|
||||||
test_build: $(PROGS)
|
test_build: $(PROGS)
|
||||||
@echo "[*] Testing the CC wrapper and instrumentation output..."
|
@echo "[*] Testing the CC wrapper and instrumentation output..."
|
||||||
@ -177,7 +165,7 @@ all_done: test_build
|
|||||||
.NOTPARALLEL: clean
|
.NOTPARALLEL: clean
|
||||||
|
|
||||||
%.8: %
|
%.8: %
|
||||||
@echo .TH $* 8 `date "+%Y-%m-%d"` "AFL++" > ./$@
|
@echo .TH $* 8 `date "+%Y-%m-%d"` "afl++" > ./$@
|
||||||
@echo .SH NAME >> ./$@
|
@echo .SH NAME >> ./$@
|
||||||
@echo .B $* >> ./$@
|
@echo .B $* >> ./$@
|
||||||
@echo >> ./$@
|
@echo >> ./$@
|
||||||
@ -189,8 +177,8 @@ all_done: test_build
|
|||||||
@./$* -h 2>&1 | tail -n +4 >> ./$@
|
@./$* -h 2>&1 | tail -n +4 >> ./$@
|
||||||
@echo >> ./$@
|
@echo >> ./$@
|
||||||
@echo .SH AUTHOR >> ./$@
|
@echo .SH AUTHOR >> ./$@
|
||||||
@echo "AFL++ was written by Michal \"lcamtuf\" Zalewski and is maintained by Marc \"van Hauser\" Heuse <mh@mh-sec.de>, Dominik Maier <domenukk@gmail.com>, Andrea Fioraldi <andreafioraldi@gmail.com> and Heiko \"hexcoder-\" Eissfeldt <heiko.eissfeldt@hexco.de>" >> ./$@
|
@echo "afl++ was written by Michal \"lcamtuf\" Zalewski and is maintained by Marc \"van Hauser\" Heuse <mh@mh-sec.de>, Heiko \"hexcoder-\" Eissfeldt <heiko.eissfeldt@hexco.de>, Andrea Fioraldi <andreafioraldi@gmail.com> and Dominik Maier <domenukk@gmail.com>" >> ./$@
|
||||||
@echo The homepage of AFL++ is: https://github.com/AFLplusplus/AFLplusplus >> ./$@
|
@echo The homepage of afl++ is: https://github.com/AFLplusplus/AFLplusplus >> ./$@
|
||||||
@echo >> ./$@
|
@echo >> ./$@
|
||||||
@echo .SH LICENSE >> ./$@
|
@echo .SH LICENSE >> ./$@
|
||||||
@echo Apache License Version 2.0, January 2004 >> ./$@
|
@echo Apache License Version 2.0, January 2004 >> ./$@
|
||||||
@ -202,8 +190,6 @@ install: all
|
|||||||
ln -sf afl-c++ $${DESTDIR}$(BIN_PATH)/afl-g++-fast
|
ln -sf afl-c++ $${DESTDIR}$(BIN_PATH)/afl-g++-fast
|
||||||
ln -sf afl-compiler-rt.o $${DESTDIR}$(HELPER_PATH)/afl-gcc-rt.o
|
ln -sf afl-compiler-rt.o $${DESTDIR}$(HELPER_PATH)/afl-gcc-rt.o
|
||||||
install -m 755 ./afl-gcc-pass.so $${DESTDIR}$(HELPER_PATH)
|
install -m 755 ./afl-gcc-pass.so $${DESTDIR}$(HELPER_PATH)
|
||||||
install -m 755 ./afl-gcc-cmplog-pass.so $${DESTDIR}$(HELPER_PATH)
|
|
||||||
install -m 755 ./afl-gcc-cmptrs-pass.so $${DESTDIR}$(HELPER_PATH)
|
|
||||||
install -m 644 -T instrumentation/README.gcc_plugin.md $${DESTDIR}$(DOC_PATH)/README.gcc_plugin.md
|
install -m 644 -T instrumentation/README.gcc_plugin.md $${DESTDIR}$(DOC_PATH)/README.gcc_plugin.md
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
|
147
GNUmakefile.llvm
147
GNUmakefile.llvm
@ -31,6 +31,11 @@ BUILD_DATE ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "+%Y-%m-%d" 2>/dev/nul
|
|||||||
VERSION = $(shell grep '^$(HASH)define VERSION ' ./config.h | cut -d '"' -f2)
|
VERSION = $(shell grep '^$(HASH)define VERSION ' ./config.h | cut -d '"' -f2)
|
||||||
|
|
||||||
SYS = $(shell uname -s)
|
SYS = $(shell uname -s)
|
||||||
|
OS = $(shell uname -o)
|
||||||
|
ifeq "$(OS)" "Cygwin"
|
||||||
|
SYS=Cygwin
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
ifeq "$(SYS)" "OpenBSD"
|
ifeq "$(SYS)" "OpenBSD"
|
||||||
LLVM_CONFIG ?= $(BIN_PATH)/llvm-config
|
LLVM_CONFIG ?= $(BIN_PATH)/llvm-config
|
||||||
@ -45,13 +50,11 @@ endif
|
|||||||
LLVMVER = $(shell $(LLVM_CONFIG) --version 2>/dev/null | sed 's/git//' | sed 's/svn//' )
|
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_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_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 | grep -E -q '^[0-2]\.|^3.[0-8]\.' && echo 1 || echo 0 )
|
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 | grep -E -q '^1[8-9]|^2[0-9]' && echo 1 || echo 0 )
|
LLVM_TOO_NEW = $(shell $(LLVM_CONFIG) --version 2>/dev/null | egrep -q '^1[4-9]' && echo 1 || echo 0 )
|
||||||
LLVM_TOO_OLD = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^[1-9]\.|^1[012]\.' && echo 1 || echo 0 )
|
LLVM_NEW_API = $(shell $(LLVM_CONFIG) --version 2>/dev/null | egrep -q '^1[0-9]' && echo 1 || echo 0 )
|
||||||
LLVM_NEW_API = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[0-9]' && echo 1 || echo 0 )
|
LLVM_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_NEWER_API = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[6-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_13_OK = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[3-9]' && echo 1 || echo 0 )
|
|
||||||
LLVM_HAVE_LTO = $(shell $(LLVM_CONFIG) --version 2>/dev/null | grep -E -q '^1[2-9]' && echo 1 || echo 0 )
|
|
||||||
LLVM_BINDIR = $(shell $(LLVM_CONFIG) --bindir 2>/dev/null)
|
LLVM_BINDIR = $(shell $(LLVM_CONFIG) --bindir 2>/dev/null)
|
||||||
LLVM_LIBDIR = $(shell $(LLVM_CONFIG) --libdir 2>/dev/null)
|
LLVM_LIBDIR = $(shell $(LLVM_CONFIG) --libdir 2>/dev/null)
|
||||||
LLVM_STDCXX = gnu++11
|
LLVM_STDCXX = gnu++11
|
||||||
@ -70,12 +73,6 @@ ifeq "$(LLVM_TOO_NEW)" "1"
|
|||||||
$(warning you are using an in-development llvm version - this might break llvm_mode!)
|
$(warning you are using an in-development llvm version - this might break llvm_mode!)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "$(LLVM_TOO_OLD)" "1"
|
|
||||||
$(warning you are using an outdated LLVM version! Please use at least LLVM 13 or newer!)
|
|
||||||
$(shell sleep 2)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# No switching the meaning of LLVM_TOO_OLD
|
|
||||||
LLVM_TOO_OLD=1
|
LLVM_TOO_OLD=1
|
||||||
|
|
||||||
ifeq "$(LLVM_MAJOR)" "9"
|
ifeq "$(LLVM_MAJOR)" "9"
|
||||||
@ -89,18 +86,19 @@ ifeq "$(LLVM_NEW_API)" "1"
|
|||||||
LLVM_TOO_OLD=0
|
LLVM_TOO_OLD=0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "$(LLVM_NEWER_API)" "1"
|
ifeq "$(LLVM_TOO_OLD)" "1"
|
||||||
$(info [+] llvm_mode detected llvm 16+, enabling c++17)
|
$(info [!] llvm_mode detected an old version of llvm, upgrade to at least 9 or preferable 11!)
|
||||||
LLVM_STDCXX = c++17
|
$(shell sleep 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "$(LLVM_HAVE_LTO)" "1"
|
ifeq "$(LLVM_HAVE_LTO)" "1"
|
||||||
$(info [+] llvm_mode detected llvm 12+, enabling afl-lto LTO implementation)
|
$(info [+] llvm_mode detected llvm 11+, enabling afl-lto LTO implementation)
|
||||||
LLVM_LTO = 1
|
LLVM_LTO = 1
|
||||||
|
#TEST_MMAP = 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "$(LLVM_LTO)" "0"
|
ifeq "$(LLVM_LTO)" "0"
|
||||||
$(info [+] llvm_mode detected llvm < 12, afl-lto LTO will not be build.)
|
$(info [+] llvm_mode detected llvm < 11, afl-lto LTO will not be build.)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "$(LLVM_APPLE_XCODE)" "1"
|
ifeq "$(LLVM_APPLE_XCODE)" "1"
|
||||||
@ -221,17 +219,6 @@ ifeq "$(LLVM_LTO)" "1"
|
|||||||
ifeq "$(AFL_REAL_LD)" ""
|
ifeq "$(AFL_REAL_LD)" ""
|
||||||
ifneq "$(shell readlink $(LLVM_BINDIR)/ld.lld 2>&1)" ""
|
ifneq "$(shell readlink $(LLVM_BINDIR)/ld.lld 2>&1)" ""
|
||||||
AFL_REAL_LD = $(LLVM_BINDIR)/ld.lld
|
AFL_REAL_LD = $(LLVM_BINDIR)/ld.lld
|
||||||
else ifneq "$(shell command -v ld.lld 2>/dev/null)" ""
|
|
||||||
AFL_REAL_LD = $(shell command -v ld.lld)
|
|
||||||
TMP_LDLDD_VERSION = $(shell $(AFL_REAL_LD) --version | awk '{ print $$2 }')
|
|
||||||
ifeq "$(LLVMVER)" "$(TMP_LDLDD_VERSION)"
|
|
||||||
$(warning ld.lld found in a weird location ($(AFL_REAL_LD)), but its the same version as LLVM so we will allow it)
|
|
||||||
else
|
|
||||||
$(warning ld.lld found in a weird location ($(AFL_REAL_LD)) and its of a different version than LLMV ($(TMP_LDLDD_VERSION) vs. $(LLVMVER)) - cannot enable LTO mode)
|
|
||||||
AFL_REAL_LD=
|
|
||||||
LLVM_LTO = 0
|
|
||||||
endif
|
|
||||||
undefine TMP_LDLDD_VERSION
|
|
||||||
else
|
else
|
||||||
$(warning ld.lld not found, cannot enable LTO mode)
|
$(warning ld.lld not found, cannot enable LTO mode)
|
||||||
LLVM_LTO = 0
|
LLVM_LTO = 0
|
||||||
@ -247,7 +234,7 @@ AFL_CLANG_FUSELD=
|
|||||||
ifeq "$(LLVM_LTO)" "1"
|
ifeq "$(LLVM_LTO)" "1"
|
||||||
ifeq "$(shell echo 'int main() {return 0; }' | $(CLANG_BIN) -x c - -fuse-ld=`command -v ld` -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
|
ifeq "$(shell echo 'int main() {return 0; }' | $(CLANG_BIN) -x c - -fuse-ld=`command -v ld` -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
|
||||||
AFL_CLANG_FUSELD=1
|
AFL_CLANG_FUSELD=1
|
||||||
ifeq "$(shell echo 'int main() {return 0; }' | $(CLANG_BIN) -x c - -fuse-ld=ld.lld --ld-path=$(AFL_REAL_LD) -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
|
ifeq "$(shell echo 'int main() {return 0; }' | $(CLANG_BIN) -x c - -fuse-ld=ld.lld --ld-path=$(LLVM_BINDIR)/ld.lld -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
|
||||||
AFL_CLANG_LDPATH=1
|
AFL_CLANG_LDPATH=1
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
@ -262,52 +249,49 @@ else
|
|||||||
AFL_CLANG_DEBUG_PREFIX =
|
AFL_CLANG_DEBUG_PREFIX =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS ?= -O3 -funroll-loops -fPIC
|
ifeq "$(SYS)" "Cygwin"
|
||||||
# -D_FORTIFY_SOURCE=1
|
override CFLAGS :=
|
||||||
CFLAGS_SAFE := -Wall -g -Wno-cast-qual -Wno-variadic-macros -Wno-pointer-sign \
|
override CXXFLAGS :=
|
||||||
-I ./include/ -I ./instrumentation/ \
|
endif
|
||||||
|
|
||||||
|
CFLAGS ?= -O3 -funroll-loops -D_FORTIFY_SOURCE=2
|
||||||
|
CFLAGS_SAFE := -Wall -g -Wno-cast-qual -Wno-variadic-macros -Wno-pointer-sign -I ./include/ -I ./instrumentation/ \
|
||||||
-DAFL_PATH=\"$(HELPER_PATH)\" -DBIN_PATH=\"$(BIN_PATH)\" \
|
-DAFL_PATH=\"$(HELPER_PATH)\" -DBIN_PATH=\"$(BIN_PATH)\" \
|
||||||
-DLLVM_BINDIR=\"$(LLVM_BINDIR)\" -DVERSION=\"$(VERSION)\" \
|
-DLLVM_BINDIR=\"$(LLVM_BINDIR)\" -DVERSION=\"$(VERSION)\" \
|
||||||
-DLLVM_LIBDIR=\"$(LLVM_LIBDIR)\" -DLLVM_VERSION=\"$(LLVMVER)\" \
|
-DLLVM_LIBDIR=\"$(LLVM_LIBDIR)\" -DLLVM_VERSION=\"$(LLVMVER)\" \
|
||||||
-DAFL_CLANG_FLTO=\"$(AFL_CLANG_FLTO)\" -DAFL_REAL_LD=\"$(AFL_REAL_LD)\" \
|
-Wno-deprecated -DAFL_CLANG_FLTO=\"$(AFL_CLANG_FLTO)\" \
|
||||||
-DAFL_CLANG_LDPATH=\"$(AFL_CLANG_LDPATH)\" -DAFL_CLANG_FUSELD=\"$(AFL_CLANG_FUSELD)\" \
|
-DAFL_REAL_LD=\"$(AFL_REAL_LD)\" \
|
||||||
-DCLANG_BIN=\"$(CLANG_BIN)\" -DCLANGPP_BIN=\"$(CLANGPP_BIN)\" -DUSE_BINDIR=$(USE_BINDIR) \
|
-DAFL_CLANG_LDPATH=\"$(AFL_CLANG_LDPATH)\" \
|
||||||
-Wno-unused-function $(AFL_CLANG_DEBUG_PREFIX)
|
-DAFL_CLANG_FUSELD=\"$(AFL_CLANG_FUSELD)\" \
|
||||||
ifndef LLVM_DEBUG
|
-DCLANG_BIN=\"$(CLANG_BIN)\" -DCLANGPP_BIN=\"$(CLANGPP_BIN)\" -DUSE_BINDIR=$(USE_BINDIR) -Wno-unused-function \
|
||||||
CFLAGS_SAFE += -Wno-deprecated
|
$(AFL_CLANG_DEBUG_PREFIX)
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef CODE_COVERAGE
|
|
||||||
override CFLAGS_SAFE += -D__AFL_CODE_COVERAGE=1
|
|
||||||
override LDFLAGS += -ldl
|
|
||||||
endif
|
|
||||||
|
|
||||||
override CFLAGS += $(CFLAGS_SAFE)
|
override CFLAGS += $(CFLAGS_SAFE)
|
||||||
|
|
||||||
|
|
||||||
ifdef AFL_TRACE_PC
|
ifdef AFL_TRACE_PC
|
||||||
$(info Compile option AFL_TRACE_PC is deprecated, just set AFL_LLVM_INSTRUMENT=PCGUARD to activate when compiling targets )
|
$(info Compile option AFL_TRACE_PC is deprecated, just set AFL_LLVM_INSTRUMENT=PCGUARD to activate when compiling targets )
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CXXFLAGS ?= -O3 -funroll-loops -fPIC
|
CXXFLAGS ?= -O3 -funroll-loops -D_FORTIFY_SOURCE=2
|
||||||
# -D_FORTIFY_SOURCE=1
|
|
||||||
override CXXFLAGS += -Wall -g -I ./include/ \
|
override CXXFLAGS += -Wall -g -I ./include/ \
|
||||||
-DVERSION=\"$(VERSION)\" -Wno-variadic-macros -Wno-deprecated-copy-with-dtor \
|
-DVERSION=\"$(VERSION)\" -Wno-variadic-macros \
|
||||||
-DLLVM_MINOR=$(LLVM_MINOR) -DLLVM_MAJOR=$(LLVM_MAJOR)
|
-DLLVM_MINOR=$(LLVM_MINOR) -DLLVM_MAJOR=$(LLVM_MAJOR)
|
||||||
|
|
||||||
|
ifneq "$(SYS)" "Cygwin"
|
||||||
|
override CFLAGS += "-fPIC"
|
||||||
|
override CFLAGS_SAFE += "-fPIC"
|
||||||
|
override CXXFLAGS += "-fPIC"
|
||||||
|
endif
|
||||||
|
|
||||||
ifneq "$(shell $(LLVM_CONFIG) --includedir) 2> /dev/null" ""
|
ifneq "$(shell $(LLVM_CONFIG) --includedir) 2> /dev/null" ""
|
||||||
CLANG_CFL = -I$(shell $(LLVM_CONFIG) --includedir)
|
CLANG_CFL = -I$(shell $(LLVM_CONFIG) --includedir)
|
||||||
endif
|
endif
|
||||||
ifneq "$(LLVM_CONFIG)" ""
|
ifneq "$(LLVM_CONFIG)" ""
|
||||||
CLANG_CFL += -I$(shell dirname $(LLVM_CONFIG))/../include
|
CLANG_CFL += -I$(shell dirname $(LLVM_CONFIG))/../include
|
||||||
endif
|
endif
|
||||||
CLANG_CPPFL = `$(LLVM_CONFIG) --cxxflags` -fno-rtti -fno-exceptions -fPIC $(CXXFLAGS) $(CPPFLAGS) -Wno-deprecated-declarations
|
CLANG_CPPFL = `$(LLVM_CONFIG) --cxxflags` -fno-rtti $(CXXFLAGS) -Wno-deprecated-declarations
|
||||||
CLANG_LFL = `$(LLVM_CONFIG) --ldflags` $(LDFLAGS)
|
CLANG_LFL = `$(LLVM_CONFIG) --ldflags` $(LDFLAGS)
|
||||||
|
|
||||||
# wasm fuzzing: disable thread-local storage and unset LLVM debug flag
|
|
||||||
ifdef WAFL_MODE
|
|
||||||
$(info Compiling libraries for use with WAVM)
|
|
||||||
CLANG_CPPFL += -DNDEBUG -DNO_TLS
|
|
||||||
endif
|
|
||||||
|
|
||||||
# User teor2345 reports that this is required to make things work on MacOS X.
|
# User teor2345 reports that this is required to make things work on MacOS X.
|
||||||
ifeq "$(SYS)" "Darwin"
|
ifeq "$(SYS)" "Darwin"
|
||||||
@ -341,7 +325,7 @@ ifeq "$(TEST_MMAP)" "1"
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
PROGS_ALWAYS = ./afl-cc ./afl-compiler-rt.o ./afl-compiler-rt-32.o ./afl-compiler-rt-64.o
|
PROGS_ALWAYS = ./afl-cc ./afl-compiler-rt.o ./afl-compiler-rt-32.o ./afl-compiler-rt-64.o
|
||||||
PROGS = $(PROGS_ALWAYS) ./afl-llvm-pass.so ./SanitizerCoveragePCGUARD.so ./split-compares-pass.so ./split-switches-pass.so ./cmplog-routines-pass.so ./cmplog-instructions-pass.so ./cmplog-switches-pass.so ./afl-llvm-dict2file.so ./compare-transform-pass.so ./afl-ld-lto ./afl-llvm-lto-instrumentlist.so ./SanitizerCoverageLTO.so ./injection-pass.so
|
PROGS = $(PROGS_ALWAYS) ./afl-llvm-pass.so ./SanitizerCoveragePCGUARD.so ./split-compares-pass.so ./split-switches-pass.so ./cmplog-routines-pass.so ./cmplog-instructions-pass.so ./cmplog-switches-pass.so ./afl-llvm-dict2file.so ./compare-transform-pass.so ./afl-ld-lto ./afl-llvm-lto-instrumentlist.so ./SanitizerCoverageLTO.so
|
||||||
|
|
||||||
# If prerequisites are not given, warn, do not build anything, and exit with code 0
|
# If prerequisites are not given, warn, do not build anything, and exit with code 0
|
||||||
ifeq "$(LLVMVER)" ""
|
ifeq "$(LLVMVER)" ""
|
||||||
@ -417,22 +401,22 @@ endif
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
instrumentation/afl-llvm-common.o: instrumentation/afl-llvm-common.cc instrumentation/afl-llvm-common.h
|
instrumentation/afl-llvm-common.o: instrumentation/afl-llvm-common.cc instrumentation/afl-llvm-common.h
|
||||||
$(CXX) $(CFLAGS) $(CPPFLAGS) `$(LLVM_CONFIG) --cxxflags` -fno-rtti -fPIC -std=$(LLVM_STDCXX) -c $< -o $@
|
$(CXX) $(CFLAGS) $(CPPFLAGS) `$(LLVM_CONFIG) --cxxflags` -fno-rtti -std=$(LLVM_STDCXX) -c $< -o $@
|
||||||
|
|
||||||
./afl-llvm-pass.so: instrumentation/afl-llvm-pass.so.cc instrumentation/afl-llvm-common.o | test_deps
|
./afl-llvm-pass.so: instrumentation/afl-llvm-pass.so.cc instrumentation/afl-llvm-common.o | test_deps
|
||||||
ifeq "$(LLVM_MIN_4_0_1)" "0"
|
ifeq "$(LLVM_MIN_4_0_1)" "0"
|
||||||
$(info [!] N-gram branch coverage instrumentation is not available for llvm version $(LLVMVER))
|
$(info [!] N-gram branch coverage instrumentation is not available for llvm version $(LLVMVER))
|
||||||
endif
|
endif
|
||||||
$(CXX) $(CLANG_CPPFL) -Wdeprecated -fno-rtti -fPIC -std=$(LLVM_STDCXX) -shared $< -o $@ $(CLANG_LFL) instrumentation/afl-llvm-common.o
|
$(CXX) $(CLANG_CPPFL) -Wdeprecated -fno-rtti -std=$(LLVM_STDCXX) -shared $< -o $@ $(CLANG_LFL) instrumentation/afl-llvm-common.o
|
||||||
|
|
||||||
./SanitizerCoveragePCGUARD.so: instrumentation/SanitizerCoveragePCGUARD.so.cc instrumentation/afl-llvm-common.o | test_deps
|
./SanitizerCoveragePCGUARD.so: instrumentation/SanitizerCoveragePCGUARD.so.cc instrumentation/afl-llvm-common.o | test_deps
|
||||||
ifeq "$(LLVM_13_OK)" "1"
|
ifeq "$(LLVM_10_OK)" "1"
|
||||||
-$(CXX) $(CLANG_CPPFL) -fno-rtti -fPIC -std=$(LLVM_STDCXX) -shared $< -o $@ $(CLANG_LFL) -Wno-deprecated-copy-dtor -Wdeprecated instrumentation/afl-llvm-common.o
|
-$(CXX) $(CLANG_CPPFL) -Wdeprecated -fno-rtti -std=$(LLVM_STDCXX) -shared $< -o $@ $(CLANG_LFL) instrumentation/afl-llvm-common.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
./afl-llvm-lto-instrumentlist.so: instrumentation/afl-llvm-lto-instrumentlist.so.cc instrumentation/afl-llvm-common.o
|
./afl-llvm-lto-instrumentlist.so: instrumentation/afl-llvm-lto-instrumentlist.so.cc instrumentation/afl-llvm-common.o
|
||||||
ifeq "$(LLVM_LTO)" "1"
|
ifeq "$(LLVM_LTO)" "1"
|
||||||
$(CXX) $(CLANG_CPPFL) -fno-rtti -fPIC -std=$(LLVM_STDCXX) -shared $< -o $@ $(CLANG_LFL) instrumentation/afl-llvm-common.o
|
$(CXX) $(CLANG_CPPFL) -fno-rtti -std=$(LLVM_STDCXX) -shared $< -o $@ $(CLANG_LFL) instrumentation/afl-llvm-common.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
./afl-ld-lto: src/afl-ld-lto.c
|
./afl-ld-lto: src/afl-ld-lto.c
|
||||||
@ -440,12 +424,12 @@ ifeq "$(LLVM_LTO)" "1"
|
|||||||
$(CC) $(CFLAGS) $(CPPFLAGS) $< -o $@
|
$(CC) $(CFLAGS) $(CPPFLAGS) $< -o $@
|
||||||
endif
|
endif
|
||||||
|
|
||||||
./SanitizerCoverageLTO.so: instrumentation/SanitizerCoverageLTO.so.cc instrumentation/afl-llvm-common.o
|
./SanitizerCoverageLTO.so: instrumentation/SanitizerCoverageLTO.so.cc
|
||||||
ifeq "$(LLVM_LTO)" "1"
|
ifeq "$(LLVM_LTO)" "1"
|
||||||
$(CXX) $(CLANG_CPPFL) -Wno-writable-strings -fno-rtti -fPIC -std=$(LLVM_STDCXX) -shared $< -o $@ $(CLANG_LFL) instrumentation/afl-llvm-common.o
|
$(CXX) $(CLANG_CPPFL) -Wno-writable-strings -fno-rtti -std=$(LLVM_STDCXX) -shared $< -o $@ $(CLANG_LFL) instrumentation/afl-llvm-common.o
|
||||||
$(CLANG_BIN) $(CFLAGS_SAFE) $(CPPFLAGS) -Wno-unused-result -O0 $(AFL_CLANG_FLTO) -fPIC -c instrumentation/afl-llvm-rt-lto.o.c -o ./afl-llvm-rt-lto.o
|
$(CLANG_BIN) $(CFLAGS_SAFE) $(CPPFLAGS) -Wno-unused-result -O0 $(AFL_CLANG_FLTO) -c instrumentation/afl-llvm-rt-lto.o.c -o ./afl-llvm-rt-lto.o
|
||||||
@$(CLANG_BIN) $(CFLAGS_SAFE) $(CPPFLAGS) -Wno-unused-result -O0 $(AFL_CLANG_FLTO) -m64 -fPIC -c instrumentation/afl-llvm-rt-lto.o.c -o ./afl-llvm-rt-lto-64.o 2>/dev/null; if [ "$$?" = "0" ]; then : ; fi
|
@$(CLANG_BIN) $(CFLAGS_SAFE) $(CPPFLAGS) -Wno-unused-result -O0 $(AFL_CLANG_FLTO) -m64 -c instrumentation/afl-llvm-rt-lto.o.c -o ./afl-llvm-rt-lto-64.o 2>/dev/null; if [ "$$?" = "0" ]; then : ; fi
|
||||||
@$(CLANG_BIN) $(CFLAGS_SAFE) $(CPPFLAGS) -Wno-unused-result -O0 $(AFL_CLANG_FLTO) -m32 -fPIC -c instrumentation/afl-llvm-rt-lto.o.c -o ./afl-llvm-rt-lto-32.o 2>/dev/null; if [ "$$?" = "0" ]; then : ; fi
|
@$(CLANG_BIN) $(CFLAGS_SAFE) $(CPPFLAGS) -Wno-unused-result -O0 $(AFL_CLANG_FLTO) -m32 -c instrumentation/afl-llvm-rt-lto.o.c -o ./afl-llvm-rt-lto-32.o 2>/dev/null; if [ "$$?" = "0" ]; then : ; fi
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# laf
|
# laf
|
||||||
@ -469,25 +453,22 @@ endif
|
|||||||
afl-llvm-dict2file.so: instrumentation/afl-llvm-dict2file.so.cc instrumentation/afl-llvm-common.o | test_deps
|
afl-llvm-dict2file.so: instrumentation/afl-llvm-dict2file.so.cc instrumentation/afl-llvm-common.o | test_deps
|
||||||
$(CXX) $(CLANG_CPPFL) -shared $< -o $@ $(CLANG_LFL) instrumentation/afl-llvm-common.o
|
$(CXX) $(CLANG_CPPFL) -shared $< -o $@ $(CLANG_LFL) instrumentation/afl-llvm-common.o
|
||||||
|
|
||||||
./injection-pass.so: instrumentation/injection-pass.cc instrumentation/afl-llvm-common.o | test_deps
|
|
||||||
$(CXX) $(CLANG_CPPFL) -shared $< -o $@ $(CLANG_LFL) instrumentation/afl-llvm-common.o
|
|
||||||
|
|
||||||
.PHONY: document
|
.PHONY: document
|
||||||
document:
|
document:
|
||||||
$(CLANG_BIN) -D_AFL_DOCUMENT_MUTATIONS $(CFLAGS_SAFE) $(CPPFLAGS) $(CLANG_CFL) -O3 -Wno-unused-result -fPIC -c instrumentation/afl-compiler-rt.o.c -o ./afl-compiler-rt.o
|
$(CLANG_BIN) -D_AFL_DOCUMENT_MUTATIONS $(CFLAGS_SAFE) $(CPPFLAGS) $(CLANG_CFL) -O3 -Wno-unused-result -c instrumentation/afl-compiler-rt.o.c -o ./afl-compiler-rt.o
|
||||||
@$(CLANG_BIN) -D_AFL_DOCUMENT_MUTATIONS $(CFLAGS_SAFE) $(CPPFLAGS) $(CLANG_CFL) -O3 -Wno-unused-result -m32 -fPIC -c instrumentation/afl-compiler-rt.o.c -o ./afl-compiler-rt-32.o 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; else echo "failed (that's fine)"; fi
|
@$(CLANG_BIN) -D_AFL_DOCUMENT_MUTATIONS $(CFLAGS_SAFE) $(CPPFLAGS) $(CLANG_CFL) -O3 -Wno-unused-result -m32 -c instrumentation/afl-compiler-rt.o.c -o ./afl-compiler-rt-32.o 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; else echo "failed (that's fine)"; fi
|
||||||
@$(CLANG_BIN) -D_AFL_DOCUMENT_MUTATIONS $(CFLAGS_SAFE) $(CPPFLAGS) $(CLANG_CFL) -O3 -Wno-unused-result -m64 -fPIC -c instrumentation/afl-compiler-rt.o.c -o ./afl-compiler-rt-64.o 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; else echo "failed (that's fine)"; fi
|
@$(CLANG_BIN) -D_AFL_DOCUMENT_MUTATIONS $(CFLAGS_SAFE) $(CPPFLAGS) $(CLANG_CFL) -O3 -Wno-unused-result -m64 -c instrumentation/afl-compiler-rt.o.c -o ./afl-compiler-rt-64.o 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; else echo "failed (that's fine)"; fi
|
||||||
|
|
||||||
./afl-compiler-rt.o: instrumentation/afl-compiler-rt.o.c
|
./afl-compiler-rt.o: instrumentation/afl-compiler-rt.o.c
|
||||||
$(CC) $(CLANG_CFL) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -fPIC -c $< -o $@
|
$(CC) $(CLANG_CFL) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -c $< -o $@
|
||||||
|
|
||||||
./afl-compiler-rt-32.o: instrumentation/afl-compiler-rt.o.c
|
./afl-compiler-rt-32.o: instrumentation/afl-compiler-rt.o.c
|
||||||
@printf "[*] Building 32-bit variant of the runtime (-m32)... "
|
@printf "[*] Building 32-bit variant of the runtime (-m32)... "
|
||||||
@$(CC) $(CLANG_CFL) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -m32 -fPIC -c $< -o $@ 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; else echo "failed (that's fine)"; fi
|
@$(CC) $(CLANG_CFL) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -m32 -c $< -o $@ 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; ln -sf afl-compiler-rt-32.o afl-llvm-rt-32.o; else echo "failed (that's fine)"; fi
|
||||||
|
|
||||||
./afl-compiler-rt-64.o: instrumentation/afl-compiler-rt.o.c
|
./afl-compiler-rt-64.o: instrumentation/afl-compiler-rt.o.c
|
||||||
@printf "[*] Building 64-bit variant of the runtime (-m64)... "
|
@printf "[*] Building 64-bit variant of the runtime (-m64)... "
|
||||||
@$(CC) $(CLANG_CFL) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -m64 -fPIC -c $< -o $@ 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; else echo "failed (that's fine)"; fi
|
@$(CC) $(CLANG_CFL) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -m64 -c $< -o $@ 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; ln -sf afl-compiler-rt-64.o afl-llvm-rt-64.o; else echo "failed (that's fine)"; fi
|
||||||
|
|
||||||
.PHONY: test_build
|
.PHONY: test_build
|
||||||
test_build: $(PROGS)
|
test_build: $(PROGS)
|
||||||
@ -510,11 +491,11 @@ install: all
|
|||||||
@install -d -m 755 $${DESTDIR}$(BIN_PATH) $${DESTDIR}$(HELPER_PATH) $${DESTDIR}$(DOC_PATH) $${DESTDIR}$(MISC_PATH)
|
@install -d -m 755 $${DESTDIR}$(BIN_PATH) $${DESTDIR}$(HELPER_PATH) $${DESTDIR}$(DOC_PATH) $${DESTDIR}$(MISC_PATH)
|
||||||
@if [ -f ./afl-cc ]; then set -e; install -m 755 ./afl-cc $${DESTDIR}$(BIN_PATH); ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-c++; fi
|
@if [ -f ./afl-cc ]; then set -e; install -m 755 ./afl-cc $${DESTDIR}$(BIN_PATH); ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-c++; fi
|
||||||
@rm -f $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt*.o $${DESTDIR}$(HELPER_PATH)/afl-gcc-rt*.o
|
@rm -f $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt*.o $${DESTDIR}$(HELPER_PATH)/afl-gcc-rt*.o
|
||||||
@if [ -f ./afl-compiler-rt.o ]; then set -e; install -m 755 ./afl-compiler-rt.o $${DESTDIR}$(HELPER_PATH); fi
|
@if [ -f ./afl-compiler-rt.o ]; then set -e; install -m 755 ./afl-compiler-rt.o $${DESTDIR}$(HELPER_PATH); ln -sf afl-compiler-rt.o $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt.o ;fi
|
||||||
@if [ -f ./afl-lto ]; then set -e; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-lto; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-lto++; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-clang-lto; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-clang-lto++; install -m 755 ./afl-llvm-rt-lto*.o ./afl-llvm-lto-instrumentlist.so $${DESTDIR}$(HELPER_PATH); fi
|
@if [ -f ./afl-lto ]; then set -e; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-lto; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-lto++; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-clang-lto; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-clang-lto++; install -m 755 ./afl-llvm-rt-lto*.o ./afl-llvm-lto-instrumentlist.so $${DESTDIR}$(HELPER_PATH); fi
|
||||||
@if [ -f ./afl-ld-lto ]; then set -e; install -m 755 ./afl-ld-lto $${DESTDIR}$(BIN_PATH); fi
|
@if [ -f ./afl-ld-lto ]; then set -e; install -m 755 ./afl-ld-lto $${DESTDIR}$(BIN_PATH); fi
|
||||||
@if [ -f ./afl-compiler-rt-32.o ]; then set -e; install -m 755 ./afl-compiler-rt-32.o $${DESTDIR}$(HELPER_PATH); fi
|
@if [ -f ./afl-compiler-rt-32.o ]; then set -e; install -m 755 ./afl-compiler-rt-32.o $${DESTDIR}$(HELPER_PATH); ln -sf afl-compiler-rt-32.o $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt-32.o ;fi
|
||||||
@if [ -f ./afl-compiler-rt-64.o ]; then set -e; install -m 755 ./afl-compiler-rt-64.o $${DESTDIR}$(HELPER_PATH); fi
|
@if [ -f ./afl-compiler-rt-64.o ]; then set -e; install -m 755 ./afl-compiler-rt-64.o $${DESTDIR}$(HELPER_PATH); ln -sf afl-compiler-rt-64.o $${DESTDIR}$(HELPER_PATH)/afl-llvm-rt-64.o ; fi
|
||||||
@if [ -f ./compare-transform-pass.so ]; then set -e; install -m 755 ./*.so $${DESTDIR}$(HELPER_PATH); fi
|
@if [ -f ./compare-transform-pass.so ]; then set -e; install -m 755 ./*.so $${DESTDIR}$(HELPER_PATH); fi
|
||||||
@if [ -f ./compare-transform-pass.so ]; then set -e; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-clang-fast ; ln -sf ./afl-c++ $${DESTDIR}$(BIN_PATH)/afl-clang-fast++ ; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-clang ; ln -sf ./afl-c++ $${DESTDIR}$(BIN_PATH)/afl-clang++ ; fi
|
@if [ -f ./compare-transform-pass.so ]; then set -e; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-clang-fast ; ln -sf ./afl-c++ $${DESTDIR}$(BIN_PATH)/afl-clang-fast++ ; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-clang ; ln -sf ./afl-c++ $${DESTDIR}$(BIN_PATH)/afl-clang++ ; fi
|
||||||
@if [ -f ./SanitizerCoverageLTO.so ]; then set -e; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-clang-lto ; ln -sf ./afl-c++ $${DESTDIR}$(BIN_PATH)/afl-clang-lto++ ; fi
|
@if [ -f ./SanitizerCoverageLTO.so ]; then set -e; ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-clang-lto ; ln -sf ./afl-c++ $${DESTDIR}$(BIN_PATH)/afl-clang-lto++ ; fi
|
||||||
@ -522,7 +503,7 @@ install: all
|
|||||||
install -m 644 instrumentation/README.*.md $${DESTDIR}$(DOC_PATH)/
|
install -m 644 instrumentation/README.*.md $${DESTDIR}$(DOC_PATH)/
|
||||||
|
|
||||||
%.8: %
|
%.8: %
|
||||||
@echo .TH $* 8 $(BUILD_DATE) "AFL++" > ./$@
|
@echo .TH $* 8 $(BUILD_DATE) "afl++" > ./$@
|
||||||
@echo .SH NAME >> ./$@
|
@echo .SH NAME >> ./$@
|
||||||
@printf "%s" ".B $* \- " >> ./$@
|
@printf "%s" ".B $* \- " >> ./$@
|
||||||
@./$* -h 2>&1 | head -n 1 | sed -e "s/$$(printf '\e')[^m]*m//g" >> ./$@
|
@./$* -h 2>&1 | head -n 1 | sed -e "s/$$(printf '\e')[^m]*m//g" >> ./$@
|
||||||
@ -536,8 +517,8 @@ install: all
|
|||||||
@./$* -h 2>&1 | tail -n +4 >> ./$@
|
@./$* -h 2>&1 | tail -n +4 >> ./$@
|
||||||
@echo >> ./$@
|
@echo >> ./$@
|
||||||
@echo .SH AUTHOR >> ./$@
|
@echo .SH AUTHOR >> ./$@
|
||||||
@echo "AFL++ was written by Michal \"lcamtuf\" Zalewski and is maintained by Marc \"van Hauser\" Heuse <mh@mh-sec.de>, Dominik Maier <domenukk@gmail.com>, Andrea Fioraldi <andreafioraldi@gmail.com> and Heiko \"hexcoder-\" Eissfeldt <heiko.eissfeldt@hexco.de>" >> ./$@
|
@echo "afl++ was written by Michal \"lcamtuf\" Zalewski and is maintained by Marc \"van Hauser\" Heuse <mh@mh-sec.de>, Heiko \"hexcoder-\" Eissfeldt <heiko.eissfeldt@hexco.de>, Andrea Fioraldi <andreafioraldi@gmail.com> and Dominik Maier <domenukk@gmail.com>" >> ./$@
|
||||||
@echo The homepage of AFL++ is: https://github.com/AFLplusplus/AFLplusplus >> ./$@
|
@echo The homepage of afl++ is: https://github.com/AFLplusplus/AFLplusplus >> ./$@
|
||||||
@echo >> ./$@
|
@echo >> ./$@
|
||||||
@echo .SH LICENSE >> ./$@
|
@echo .SH LICENSE >> ./$@
|
||||||
@echo Apache License Version 2.0, January 2004 >> ./$@
|
@echo Apache License Version 2.0, January 2004 >> ./$@
|
||||||
@ -556,4 +537,4 @@ endif
|
|||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o *.so *~ a.out core core.[1-9][0-9]* .test2 test-instr .test-instr0 .test-instr1 *.dwo
|
rm -f *.o *.so *~ a.out core core.[1-9][0-9]* .test2 test-instr .test-instr0 .test-instr1 *.dwo
|
||||||
rm -f $(PROGS) afl-common.o ./afl-c++ ./afl-lto ./afl-lto++ ./afl-clang-lto* ./afl-clang-fast* ./afl-clang*.8 ./ld ./afl-ld ./afl-compiler-rt*.o ./afl-llvm-rt*.o instrumentation/*.o
|
rm -f $(PROGS) afl-common.o ./afl-c++ ./afl-lto ./afl-lto++ ./afl-clang-lto* ./afl-clang-fast* ./afl-clang*.8 ./ld ./afl-ld ./afl-llvm-rt*.o instrumentation/*.o
|
||||||
|
64
README.md
64
README.md
@ -1,24 +1,22 @@
|
|||||||
# American Fuzzy Lop plus plus (AFL++)
|
# American Fuzzy Lop plus plus (AFL++)
|
||||||
|
|
||||||
<img align="right" src="https://raw.githubusercontent.com/AFLplusplus/Website/main/static/aflpp_bg.svg" alt="AFL++ logo" width="250" heigh="250">
|
<img align="right" src="https://raw.githubusercontent.com/andreafioraldi/AFLplusplus-website/master/static/logo_256x256.png" alt="AFL++ logo">
|
||||||
|
|
||||||
Release version: [4.10c](https://github.com/AFLplusplus/AFLplusplus/releases)
|
Release version: [3.14c](https://github.com/AFLplusplus/AFLplusplus/releases)
|
||||||
|
|
||||||
GitHub version: 4.10c
|
GitHub version: 3.15a
|
||||||
|
|
||||||
Repository:
|
Repository:
|
||||||
[https://github.com/AFLplusplus/AFLplusplus](https://github.com/AFLplusplus/AFLplusplus)
|
[https://github.com/AFLplusplus/AFLplusplus](https://github.com/AFLplusplus/AFLplusplus)
|
||||||
|
|
||||||
AFL++ is maintained by:
|
AFL++ is maintained by:
|
||||||
|
|
||||||
* Marc "van Hauser" Heuse <mh@mh-sec.de>
|
* Marc "van Hauser" Heuse <mh@mh-sec.de>,
|
||||||
* Dominik Maier <mail@dmnk.co>
|
* Heiko "hexcoder-" Eißfeldt <heiko.eissfeldt@hexco.de>,
|
||||||
* Andrea Fioraldi <andreafioraldi@gmail.com>
|
* Andrea Fioraldi <andreafioraldi@gmail.com> and
|
||||||
* Heiko "hexcoder-" Eissfeldt <heiko.eissfeldt@hexco.de>
|
* Dominik Maier <mail@dmnk.co>.
|
||||||
* frida_mode is maintained by @Worksbutnottested
|
|
||||||
* Documentation: Jana Aydinbas <jana.aydinbas@gmail.com>
|
|
||||||
|
|
||||||
Originally developed by Michal "lcamtuf" Zalewski.
|
Originally developed by Michał "lcamtuf" Zalewski.
|
||||||
|
|
||||||
AFL++ is a superior fork to Google's AFL - more speed, more and better
|
AFL++ is a superior fork to Google's AFL - more speed, more and better
|
||||||
mutations, more and better instrumentation, custom module support, etc.
|
mutations, more and better instrumentation, custom module support, etc.
|
||||||
@ -30,14 +28,9 @@ terms of the Apache-2.0 License. See the [LICENSE](LICENSE) for details.
|
|||||||
|
|
||||||
Here is some information to get you started:
|
Here is some information to get you started:
|
||||||
|
|
||||||
* For an overview of the AFL++ documentation and a very helpful graphical guide,
|
|
||||||
please visit [docs/README.md](docs/README.md).
|
|
||||||
* To get you started with tutorials, go to
|
|
||||||
[docs/tutorials.md](docs/tutorials.md).
|
|
||||||
* For releases, see the
|
* For releases, see the
|
||||||
[Releases tab](https://github.com/AFLplusplus/AFLplusplus/releases) and
|
[Releases tab](https://github.com/AFLplusplus/AFLplusplus/releases) and
|
||||||
[branches](#branches). The best branches to use are, however, `stable` or
|
[branches](#branches). Also take a look at the list of
|
||||||
`dev` - depending on your risk appetite. Also take a look at the list of
|
|
||||||
[important changes in AFL++](docs/important_changes.md) and the list of
|
[important changes in AFL++](docs/important_changes.md) and the list of
|
||||||
[features](docs/features.md).
|
[features](docs/features.md).
|
||||||
* If you want to use AFL++ for your academic work, check the
|
* If you want to use AFL++ for your academic work, check the
|
||||||
@ -47,26 +40,24 @@ Here is some information to get you started:
|
|||||||
`afl-clang-fast` with `AFL_LLVM_CMPLOG=1`. You can find the `aflplusplus`
|
`afl-clang-fast` with `AFL_LLVM_CMPLOG=1`. You can find the `aflplusplus`
|
||||||
default configuration on Google's
|
default configuration on Google's
|
||||||
[fuzzbench](https://github.com/google/fuzzbench/tree/master/fuzzers/aflplusplus).
|
[fuzzbench](https://github.com/google/fuzzbench/tree/master/fuzzers/aflplusplus).
|
||||||
|
* To get you started with tutorials, go to
|
||||||
|
[docs/tutorials.md](docs/tutorials.md).
|
||||||
|
|
||||||
## Building and installing AFL++
|
## Building and installing AFL++
|
||||||
|
|
||||||
To have AFL++ easily available with everything compiled, pull the image directly
|
To have AFL++ easily available with everything compiled, pull the image directly
|
||||||
from the Docker Hub (available for both x86_64 and arm64):
|
from the Docker Hub:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
docker pull aflplusplus/aflplusplus
|
docker pull aflplusplus/aflplusplus
|
||||||
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
|
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
|
||||||
```
|
```
|
||||||
|
|
||||||
This image is automatically published when a push to the stable branch happens
|
This image is automatically generated when a push to the stable repo happens
|
||||||
(see [branches](#branches)). If you use the command above, you will find your
|
(see [branches](#branches)). You will find your target source code in `/src` in
|
||||||
target source code in `/src` in the container.
|
the container.
|
||||||
|
|
||||||
Note: you can also pull `aflplusplus/aflplusplus:dev` which is the most current
|
To build AFL++ yourself, continue at [docs/INSTALL.md](docs/INSTALL.md).
|
||||||
development state of AFL++.
|
|
||||||
|
|
||||||
To build AFL++ yourself - *which we recommend* - continue at
|
|
||||||
[docs/INSTALL.md](docs/INSTALL.md).
|
|
||||||
|
|
||||||
## Quick start: Fuzzing with AFL++
|
## Quick start: Fuzzing with AFL++
|
||||||
|
|
||||||
@ -116,7 +107,7 @@ Step-by-step quick start:
|
|||||||
|
|
||||||
5. You will find found crashes and hangs in the subdirectories `crashes/` and
|
5. You will find found crashes and hangs in the subdirectories `crashes/` and
|
||||||
`hangs/` in the `-o output_dir` directory. You can replay the crashes by
|
`hangs/` in the `-o output_dir` directory. You can replay the crashes by
|
||||||
feeding them to the target, e.g. if your target is using stdin:
|
feeding them to the target, e.g.:
|
||||||
|
|
||||||
```
|
```
|
||||||
cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]
|
cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]
|
||||||
@ -124,24 +115,20 @@ Step-by-step quick start:
|
|||||||
|
|
||||||
You can generate cores or use gdb directly to follow up the crashes.
|
You can generate cores or use gdb directly to follow up the crashes.
|
||||||
|
|
||||||
6. We cannot stress this enough - if you want to fuzz effectively, read the
|
|
||||||
[docs/fuzzing_in_depth.md](docs/fuzzing_in_depth.md) document!
|
|
||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
|
|
||||||
Questions? Concerns? Bug reports?
|
Questions? Concerns? Bug reports?
|
||||||
|
|
||||||
* The contributors can be reached via (e.g., by creating an issue):
|
* The contributors can be reached via
|
||||||
[https://github.com/AFLplusplus/AFLplusplus](https://github.com/AFLplusplus/AFLplusplus).
|
[https://github.com/AFLplusplus/AFLplusplus](https://github.com/AFLplusplus/AFLplusplus).
|
||||||
* Take a look at our [FAQ](docs/FAQ.md). If you find an interesting or important
|
* Take a look at our [FAQ](docs/FAQ.md). If you find an interesting or important
|
||||||
question missing, submit it via
|
question missing, submit it via
|
||||||
[https://github.com/AFLplusplus/AFLplusplus/discussions](https://github.com/AFLplusplus/AFLplusplus/discussions).
|
[https://github.com/AFLplusplus/AFLplusplus/discussions](https://github.com/AFLplusplus/AFLplusplus/discussions).
|
||||||
* Best: join the [Awesome Fuzzing](https://discord.gg/gCraWct) Discord server.
|
* There is a mailing list for the AFL/AFL++ project
|
||||||
* There is a (not really used) mailing list for the AFL/AFL++ project
|
|
||||||
([browse archive](https://groups.google.com/group/afl-users)). To compare
|
([browse archive](https://groups.google.com/group/afl-users)). To compare
|
||||||
notes with other users or to get notified about major new features, send an
|
notes with other users or to get notified about major new features, send an
|
||||||
email to <afl-users+subscribe@googlegroups.com>, but note that this is not
|
email to <afl-users+subscribe@googlegroups.com>.
|
||||||
managed by us.
|
* Or join the [Awesome Fuzzing](https://discord.gg/gCraWct) Discord server.
|
||||||
|
|
||||||
## Branches
|
## Branches
|
||||||
|
|
||||||
@ -154,7 +141,7 @@ The following branches exist:
|
|||||||
stability
|
stability
|
||||||
* [dev](https://github.com/AFLplusplus/AFLplusplus/tree/dev): development state
|
* [dev](https://github.com/AFLplusplus/AFLplusplus/tree/dev): development state
|
||||||
of AFL++ - bleeding edge and you might catch a checkout which does not compile
|
of AFL++ - bleeding edge and you might catch a checkout which does not compile
|
||||||
or has a bug. **We only accept PRs (pull requests) for the 'dev' branch!**
|
or has a bug. *We only accept PRs in dev!!*
|
||||||
* (any other): experimental branches to work on specific features or testing new
|
* (any other): experimental branches to work on specific features or testing new
|
||||||
functionality or changes.
|
functionality or changes.
|
||||||
|
|
||||||
@ -168,7 +155,7 @@ This can be your way to support and contribute to AFL++ - extend it to do
|
|||||||
something cool.
|
something cool.
|
||||||
|
|
||||||
For everyone who wants to contribute (and send pull requests), please read our
|
For everyone who wants to contribute (and send pull requests), please read our
|
||||||
[contributing guidelines](CONTRIBUTING.md) before you submit.
|
[contributing guidelines](CONTRIBUTING.md) before your submit.
|
||||||
|
|
||||||
## Special thanks
|
## Special thanks
|
||||||
|
|
||||||
@ -228,8 +215,7 @@ Thank you! (For people sending pull requests - please add yourself to this list
|
|||||||
Josephine Calliotte Konrad Welc
|
Josephine Calliotte Konrad Welc
|
||||||
Thomas Rooijakkers David Carlier
|
Thomas Rooijakkers David Carlier
|
||||||
Ruben ten Hove Joey Jiao
|
Ruben ten Hove Joey Jiao
|
||||||
fuzzah @intrigus-lgtm
|
fuzzah
|
||||||
Yaakov Saxon Sergej Schumilo
|
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
@ -257,4 +243,4 @@ presented at WOOT'20:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
27
TODO.md
27
TODO.md
@ -1,34 +1,16 @@
|
|||||||
# TODO list for AFL++
|
# TODO list for AFL++
|
||||||
|
|
||||||
## Must
|
|
||||||
|
|
||||||
- UI revamp
|
|
||||||
- hardened_usercopy=0 page_alloc.shuffle=0
|
|
||||||
- add value_profile but only enable after 15 minutes without finds
|
|
||||||
- cmplog max len, cmplog max items envs?
|
|
||||||
- adapt MOpt to new mutation engine
|
|
||||||
- Update afl->pending_not_fuzzed for MOpt
|
|
||||||
- cmplog rtn sanity check on fixed length? currently we ignore the length
|
|
||||||
- afl-showmap -f support
|
|
||||||
- afl-fuzz multicore wrapper script
|
|
||||||
- when trimming then perform crash detection
|
|
||||||
- problem: either -L0 and/or -p mmopt results in zero new coverage
|
|
||||||
|
|
||||||
|
|
||||||
## Should
|
## Should
|
||||||
|
|
||||||
- afl-crash-analysis
|
|
||||||
- support persistent and deferred fork server in afl-showmap?
|
|
||||||
- better autodetection of shifting runtime timeout values
|
- better autodetection of shifting runtime timeout values
|
||||||
|
- Update afl->pending_not_fuzzed for MOpt
|
||||||
- afl-plot to support multiple plot_data
|
- afl-plot to support multiple plot_data
|
||||||
- parallel builds for source-only targets
|
- parallel builds for source-only targets
|
||||||
- get rid of check_binary, replace with more forkserver communication
|
- get rid of check_binary, replace with more forkserver communication
|
||||||
- first fuzzer should be a main automatically? not sure.
|
|
||||||
|
|
||||||
## Maybe
|
## Maybe
|
||||||
|
|
||||||
- forkserver tells afl-fuzz if cmplog is supported and if so enable
|
- afl_custom_fuzz_splice_optin()
|
||||||
it by default, with AFL_CMPLOG_NO=1 (?) set to skip?
|
|
||||||
- afl_custom_splice()
|
- afl_custom_splice()
|
||||||
- cmdline option from-to range for mutations
|
- cmdline option from-to range for mutations
|
||||||
|
|
||||||
@ -38,7 +20,8 @@ QEMU mode/FRIDA mode:
|
|||||||
- non colliding instrumentation
|
- non colliding instrumentation
|
||||||
- rename qemu specific envs to AFL_QEMU (AFL_ENTRYPOINT, AFL_CODE_START/END,
|
- rename qemu specific envs to AFL_QEMU (AFL_ENTRYPOINT, AFL_CODE_START/END,
|
||||||
AFL_COMPCOV_LEVEL?)
|
AFL_COMPCOV_LEVEL?)
|
||||||
- add AFL_QEMU_EXITPOINT (maybe multiple?)
|
- add AFL_QEMU_EXITPOINT (maybe multiple?), maybe pointless as there is
|
||||||
|
persistent mode
|
||||||
|
|
||||||
## Ideas
|
## Ideas
|
||||||
|
|
||||||
@ -46,4 +29,4 @@ QEMU mode/FRIDA mode:
|
|||||||
using cmplog or __sanitizer_cov_trace_cmp*. maybe we can deduct by follow up
|
using cmplog or __sanitizer_cov_trace_cmp*. maybe we can deduct by follow up
|
||||||
edge numbers that both following cmp paths have been found and then disable
|
edge numbers that both following cmp paths have been found and then disable
|
||||||
working on this edge id -> cmplog_intelligence branch
|
working on this edge id -> cmplog_intelligence branch
|
||||||
- use cmplog colorization taint result for havoc locations?
|
- use cmplog colorization taint result for havoc locations?
|
54
afl-addseeds
54
afl-addseeds
@ -1,54 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
test -z "$1" -o "$1" = "-h" -o "$1" = "--help" && {
|
|
||||||
echo Syntax: afl-addseeds -o afl-out-dir [-i seed_file_or_dir] seed_file_or_seed_dir seed_file_or_seed_dir ...
|
|
||||||
echo
|
|
||||||
echo Options:
|
|
||||||
echo " -o afl-out-dir the output directory being used in the fuzzing campaign"
|
|
||||||
echo " -i seed_file_or_dir file or directory of files to add"
|
|
||||||
echo
|
|
||||||
echo Adds new seeds to an existing AFL++ fuzzing campaign.
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
for TOOL in find ls; do
|
|
||||||
X=`which $TOOL`
|
|
||||||
test -n "$X" || { echo "Error: required tool '$TOOL' not found."; exit 1; }
|
|
||||||
done
|
|
||||||
|
|
||||||
TEST=`printf %06d 123 2>/dev/null`
|
|
||||||
test "$TEST" = "000123" || { echo "Error: required tool 'printf' not found."; exit 1; }
|
|
||||||
|
|
||||||
OUT=
|
|
||||||
NEXT=
|
|
||||||
for i in $*; do
|
|
||||||
test -n "$NEXT" && { OUT=$i ; NEXT=""; }
|
|
||||||
test "$i" = "-o" && { NEXT=1; }
|
|
||||||
done
|
|
||||||
|
|
||||||
test -d "$OUT" || { echo Error: $OUT is not an existing directory; exit 1; }
|
|
||||||
OK=`ls $OUT/*/fuzzer_stats 2>/dev/null`
|
|
||||||
test -n "$OK" || { echo "Error: $OUT is not an 'afl-fuzz -o ... ' output directory" ; exit 1; }
|
|
||||||
|
|
||||||
OUTDIR=$OUT/addseeds/queue
|
|
||||||
mkdir -p "$OUTDIR" 2>/dev/null
|
|
||||||
test -d "$OUTDIR" || { echo Error: could not create $OUTDIR ; exit 1 ; }
|
|
||||||
|
|
||||||
echo Adding seeds ...
|
|
||||||
NEXTID=0
|
|
||||||
for i in $*; do
|
|
||||||
test -z "$i" -o "$i" = "$OUT" -o "$i" = "-i" -o "$i" = "-o" || {
|
|
||||||
find "$i" -type f | while read FILE; do
|
|
||||||
N=xxx
|
|
||||||
while [ -n "$N" ]; do
|
|
||||||
ID=$NEXTID
|
|
||||||
N=`ls "$OUTDIR/id:$(printf %06d $ID),"* 2>/dev/null`
|
|
||||||
NEXTID=$(($NEXTID + 1))
|
|
||||||
done
|
|
||||||
FN=`echo "$FILE" | sed 's/.*\///'`
|
|
||||||
cp -v "$FILE" "$OUTDIR/id:$(printf %06d $ID),time:0,execs:0,orig:$FN"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
done
|
|
||||||
|
|
||||||
echo Done.
|
|
223
afl-cmin
223
afl-cmin
@ -1,15 +1,11 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
SYS=$(uname -s)
|
|
||||||
test "$SYS" = "Darwin" && {
|
|
||||||
echo Error: afl-cmin does not work on Apple currently. please use afl-cmin.bash instead.
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
export AFL_QUIET=1
|
export AFL_QUIET=1
|
||||||
export ASAN_OPTIONS=detect_leaks=0
|
export ASAN_OPTIONS=detect_leaks=0
|
||||||
THISPATH=`dirname ${0}`
|
THISPATH=`dirname ${0}`
|
||||||
export PATH="${THISPATH}:$PATH"
|
export PATH="${THISPATH}:$PATH"
|
||||||
awk -f - -- ${@+"$@"} <<'EOF'
|
awk -f - -- ${@+"$@"} <<'EOF'
|
||||||
#!/usr/bin/awk -f
|
#!/usr/bin/awk -f
|
||||||
|
|
||||||
# awk script to minimize a test corpus of input files
|
# awk script to minimize a test corpus of input files
|
||||||
#
|
#
|
||||||
# based on afl-cmin bash script written by Michal Zalewski
|
# based on afl-cmin bash script written by Michal Zalewski
|
||||||
@ -107,38 +103,30 @@ function usage() {
|
|||||||
" -o dir - output directory for minimized files\n" \
|
" -o dir - output directory for minimized files\n" \
|
||||||
"\n" \
|
"\n" \
|
||||||
"Execution control settings:\n" \
|
"Execution control settings:\n" \
|
||||||
" -T tasks - how many parallel tasks to run (default: 1, all=nproc)\n" \
|
|
||||||
" -f file - location read by the fuzzed program (stdin)\n" \
|
" -f file - location read by the fuzzed program (stdin)\n" \
|
||||||
" -m megs - memory limit for child process ("mem_limit" MB)\n" \
|
" -m megs - memory limit for child process ("mem_limit" MB)\n" \
|
||||||
" -t msec - run time limit for child process (default: 5000)\n" \
|
" -t msec - run time limit for child process (none)\n" \
|
||||||
" -O - use binary-only instrumentation (FRIDA mode)\n" \
|
" -O - use binary-only instrumentation (FRIDA mode)\n" \
|
||||||
" -Q - use binary-only instrumentation (QEMU mode)\n" \
|
" -Q - use binary-only instrumentation (QEMU mode)\n" \
|
||||||
" -U - use unicorn-based instrumentation (unicorn mode)\n" \
|
" -U - use unicorn-based instrumentation (unicorn mode)\n" \
|
||||||
" -X - use Nyx mode\n" \
|
|
||||||
"\n" \
|
"\n" \
|
||||||
"Minimization settings:\n" \
|
"Minimization settings:\n" \
|
||||||
" -A - allow crashes and timeouts (not recommended)\n" \
|
|
||||||
" -C - keep crashing inputs, reject everything else\n" \
|
" -C - keep crashing inputs, reject everything else\n" \
|
||||||
" -e - solve for edge coverage only, ignore hit counts\n" \
|
" -e - solve for edge coverage only, ignore hit counts\n" \
|
||||||
"\n" \
|
"\n" \
|
||||||
"For additional tips, please consult README.md\n" \
|
"For additional tips, please consult README.md\n" \
|
||||||
"\n" \
|
"\n" \
|
||||||
"Environment variables used:\n" \
|
"Environment variables used:\n" \
|
||||||
|
"AFL_ALLOW_TMP: allow unsafe use of input/output directories under {/var}/tmp\n" \
|
||||||
"AFL_CRASH_EXITCODE: optional child exit code to be interpreted as crash\n" \
|
"AFL_CRASH_EXITCODE: optional child exit code to be interpreted as crash\n" \
|
||||||
"AFL_FORKSRV_INIT_TMOUT: time the fuzzer waits for the forkserver to come up\n" \
|
"AFL_FORKSRV_INIT_TMOUT: time the fuzzer waits for the forkserver to come up\n" \
|
||||||
"AFL_KEEP_TRACES: leave the temporary <out_dir>/.traces directory\n" \
|
"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_KILL_SIGNAL: Signal delivered to child processes on timeout (default: SIGKILL)\n" \
|
||||||
"AFL_FORK_SERVER_KILL_SIGNAL: Signal delivered to fork server processes on\n" \
|
|
||||||
" termination (default: SIGTERM). If this is not set and AFL_KILL_SIGNAL is\n" \
|
|
||||||
" set, this will be set to the same value as AFL_KILL_SIGNAL.\n" \
|
|
||||||
"AFL_NO_FORKSRV: run target via execve instead of using the forkserver\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_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 " \
|
"AFL_PRINT_FILENAMES: If set, the filename currently processed will be " \
|
||||||
"printed to stdout\n" \
|
"printed to stdout\n" \
|
||||||
"AFL_SKIP_BIN_CHECK: skip afl instrumentation checks for target binary\n"
|
"AFL_SKIP_BIN_CHECK: skip afl instrumentation checks for target binary\n"
|
||||||
"AFL_CUSTOM_MUTATOR_LIBRARY: custom mutator library (post_process and send)\n"
|
|
||||||
"AFL_PYTHON_MODULE: custom mutator library (post_process and send)\n"
|
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,35 +135,22 @@ function exists_and_is_executable(binarypath) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
if (0 != system( "test -t 1")) {
|
print "corpus minimization tool for afl++ (awk version)\n"
|
||||||
redirected = 1
|
|
||||||
} else {
|
|
||||||
redirected = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
print "corpus minimization tool for AFL++ (awk version)\n"
|
|
||||||
|
|
||||||
# defaults
|
# defaults
|
||||||
extra_par = ""
|
extra_par = ""
|
||||||
AFL_CMIN_CRASHES_ONLY = ""
|
AFL_CMIN_CRASHES_ONLY = ""
|
||||||
AFL_CMIN_ALLOW_ANY = ""
|
|
||||||
|
|
||||||
# process options
|
# process options
|
||||||
Opterr = 1 # default is to diagnose
|
Opterr = 1 # default is to diagnose
|
||||||
Optind = 1 # skip ARGV[0]
|
Optind = 1 # skip ARGV[0]
|
||||||
while ((_go_c = getopt(ARGC, ARGV, "hi:o:f:m:t:eACOQUXYT:?")) != -1) {
|
while ((_go_c = getopt(ARGC, ARGV, "hi:o:f:m:t:eCOQU?")) != -1) {
|
||||||
if (_go_c == "i") {
|
if (_go_c == "i") {
|
||||||
if (!Optarg) usage()
|
if (!Optarg) usage()
|
||||||
if (in_dir) { print "Option "_go_c" is only allowed once" > "/dev/stderr"}
|
if (in_dir) { print "Option "_go_c" is only allowed once" > "/dev/stderr"}
|
||||||
in_dir = Optarg
|
in_dir = Optarg
|
||||||
continue
|
continue
|
||||||
} else
|
} else
|
||||||
if (_go_c == "T") {
|
|
||||||
if (!Optarg) usage()
|
|
||||||
if (threads) { print "Option "_go_c" is only allowed once" > "/dev/stderr"}
|
|
||||||
threads = Optarg
|
|
||||||
continue
|
|
||||||
} else
|
|
||||||
if (_go_c == "o") {
|
if (_go_c == "o") {
|
||||||
if (!Optarg) usage()
|
if (!Optarg) usage()
|
||||||
if (out_dir) { print "Option "_go_c" is only allowed once" > "/dev/stderr"}
|
if (out_dir) { print "Option "_go_c" is only allowed once" > "/dev/stderr"}
|
||||||
@ -205,10 +180,6 @@ BEGIN {
|
|||||||
AFL_CMIN_CRASHES_ONLY = "AFL_CMIN_CRASHES_ONLY=1 "
|
AFL_CMIN_CRASHES_ONLY = "AFL_CMIN_CRASHES_ONLY=1 "
|
||||||
continue
|
continue
|
||||||
} else
|
} else
|
||||||
if (_go_c == "A") {
|
|
||||||
AFL_CMIN_ALLOW_ANY = "AFL_CMIN_ALLOW_ANY=1 "
|
|
||||||
continue
|
|
||||||
} else
|
|
||||||
if (_go_c == "e") {
|
if (_go_c == "e") {
|
||||||
extra_par = extra_par " -e"
|
extra_par = extra_par " -e"
|
||||||
continue
|
continue
|
||||||
@ -230,12 +201,6 @@ BEGIN {
|
|||||||
extra_par = extra_par " -U"
|
extra_par = extra_par " -U"
|
||||||
unicorn_mode = 1
|
unicorn_mode = 1
|
||||||
continue
|
continue
|
||||||
} else
|
|
||||||
if (_go_c == "X" || _go_c == "Y") {
|
|
||||||
if (nyx_mode) { print "Option "_go_c" is only allowed once" > "/dev/stderr"}
|
|
||||||
extra_par = extra_par " -X"
|
|
||||||
nyx_mode = 1
|
|
||||||
continue
|
|
||||||
} else
|
} else
|
||||||
if (_go_c == "?") {
|
if (_go_c == "?") {
|
||||||
exit 1
|
exit 1
|
||||||
@ -244,7 +209,7 @@ BEGIN {
|
|||||||
} # while options
|
} # while options
|
||||||
|
|
||||||
if (!mem_limit) mem_limit = "none"
|
if (!mem_limit) mem_limit = "none"
|
||||||
if (!timeout) timeout = "5000"
|
if (!timeout) timeout = "none"
|
||||||
|
|
||||||
# get program args
|
# get program args
|
||||||
i = 0
|
i = 0
|
||||||
@ -252,7 +217,7 @@ BEGIN {
|
|||||||
for (; Optind < ARGC; Optind++) {
|
for (; Optind < ARGC; Optind++) {
|
||||||
prog_args[i++] = ARGV[Optind]
|
prog_args[i++] = ARGV[Optind]
|
||||||
if (i > 1)
|
if (i > 1)
|
||||||
prog_args_string = prog_args_string" '"ARGV[Optind]"'"
|
prog_args_string = prog_args_string" "ARGV[Optind]
|
||||||
}
|
}
|
||||||
|
|
||||||
# sanity checks
|
# sanity checks
|
||||||
@ -271,22 +236,15 @@ BEGIN {
|
|||||||
"pwd" | getline dirlist[4] # current directory
|
"pwd" | getline dirlist[4] # current directory
|
||||||
for (dirind in dirlist) {
|
for (dirind in dirlist) {
|
||||||
dir = dirlist[dirind]
|
dir = dirlist[dirind]
|
||||||
|
|
||||||
if (dir ~ /^(\/var)?\/tmp/) {
|
if (dir ~ /^(\/var)?\/tmp/) {
|
||||||
print "[-] Warning: do not use this script in /tmp or /var/tmp for security reasons." > "/dev/stderr"
|
print "[-] Error: do not use this script in /tmp or /var/tmp." > "/dev/stderr"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete dirlist
|
delete dirlist
|
||||||
}
|
}
|
||||||
|
|
||||||
if (threads && stdin_file) {
|
|
||||||
print "[-] Error: -T and -f cannot be used together." > "/dev/stderr"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!threads && !stdin_file && !nyx_mode) {
|
|
||||||
print "[*] Are you aware of the '-T all' parallelize option that improves the speed for large/slow corpuses?"
|
|
||||||
}
|
|
||||||
|
|
||||||
# If @@ is specified, but there's no -f, let's come up with a temporary input
|
# If @@ is specified, but there's no -f, let's come up with a temporary input
|
||||||
# file name.
|
# file name.
|
||||||
|
|
||||||
@ -317,12 +275,9 @@ BEGIN {
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (target_bin && !exists_and_is_executable(target_bin)) {
|
||||||
|
|
||||||
if (!nyx_mode && target_bin && !exists_and_is_executable(target_bin)) {
|
"command -v "target_bin" 2>/dev/null" | getline tnew
|
||||||
|
|
||||||
cmd = "command -v "target_bin" 2>/dev/null"
|
|
||||||
cmd | getline tnew
|
|
||||||
close(cmd)
|
|
||||||
if (!tnew || !exists_and_is_executable(tnew)) {
|
if (!tnew || !exists_and_is_executable(tnew)) {
|
||||||
print "[-] Error: binary '"target_bin"' not found or not executable." > "/dev/stderr"
|
print "[-] Error: binary '"target_bin"' not found or not executable." > "/dev/stderr"
|
||||||
exit 1
|
exit 1
|
||||||
@ -330,18 +285,7 @@ BEGIN {
|
|||||||
target_bin = tnew
|
target_bin = tnew
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 == system ( "grep -aq AFL_DUMP_MAP_SIZE " target_bin )) {
|
if (!ENVIRON["AFL_SKIP_BIN_CHECK"] && !qemu_mode && !frida_mode && !unicorn_mode) {
|
||||||
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
|
|
||||||
close(get_map_size)
|
|
||||||
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 && !nyx_mode) {
|
|
||||||
if (0 != system( "grep -q __AFL_SHM_ID "target_bin )) {
|
if (0 != system( "grep -q __AFL_SHM_ID "target_bin )) {
|
||||||
print "[-] Error: binary '"target_bin"' doesn't appear to be instrumented." > "/dev/stderr"
|
print "[-] Error: binary '"target_bin"' doesn't appear to be instrumented." > "/dev/stderr"
|
||||||
exit 1
|
exit 1
|
||||||
@ -364,28 +308,12 @@ BEGIN {
|
|||||||
system("rm -rf "trace_dir" 2>/dev/null");
|
system("rm -rf "trace_dir" 2>/dev/null");
|
||||||
system("rm "out_dir"/id[:_]* 2>/dev/null")
|
system("rm "out_dir"/id[:_]* 2>/dev/null")
|
||||||
|
|
||||||
cmd = "ls "out_dir"/* 2>/dev/null | wc -l"
|
"ls "out_dir"/* 2>/dev/null | wc -l" | getline noofentries
|
||||||
cmd | getline noofentries
|
|
||||||
close(cmd)
|
|
||||||
if (0 == system( "test -d "out_dir" -a "noofentries" -gt 0" )) {
|
if (0 == system( "test -d "out_dir" -a "noofentries" -gt 0" )) {
|
||||||
print "[-] Error: directory '"out_dir"' exists and is not empty - delete it first." > "/dev/stderr"
|
print "[-] Error: directory '"out_dir"' exists and is not empty - delete it first." > "/dev/stderr"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if (threads) {
|
|
||||||
cmd = "nproc"
|
|
||||||
cmd | getline nproc
|
|
||||||
close(cmd)
|
|
||||||
if (threads == "all") {
|
|
||||||
threads = nproc
|
|
||||||
} else {
|
|
||||||
if (!(threads > 1 && threads <= nproc)) {
|
|
||||||
print "[-] Error: -T option must be between 1 and "nproc" or \"all\"." > "/dev/stderr"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check for the more efficient way to copy files...
|
# Check for the more efficient way to copy files...
|
||||||
if (0 != system("mkdir -p -m 0700 "trace_dir)) {
|
if (0 != system("mkdir -p -m 0700 "trace_dir)) {
|
||||||
print "[-] Error: Cannot create directory "trace_dir > "/dev/stderr"
|
print "[-] Error: Cannot create directory "trace_dir > "/dev/stderr"
|
||||||
@ -395,14 +323,12 @@ BEGIN {
|
|||||||
if (stdin_file) {
|
if (stdin_file) {
|
||||||
# truncate input file
|
# truncate input file
|
||||||
printf "" > stdin_file
|
printf "" > stdin_file
|
||||||
close(stdin_file)
|
close( stdin_file )
|
||||||
}
|
}
|
||||||
|
|
||||||
# First we look in PATH
|
# First we look in PATH
|
||||||
if (0 == system("command -v afl-showmap >/dev/null 2>&1")) {
|
if (0 == system("command -v afl-showmap >/dev/null 2>&1")) {
|
||||||
cmd = "command -v afl-showmap 2>/dev/null"
|
"command -v afl-showmap 2>/dev/null" | getline showmap
|
||||||
cmd | getline showmap
|
|
||||||
close(cmd)
|
|
||||||
} else {
|
} else {
|
||||||
# then we look in the current directory
|
# then we look in the current directory
|
||||||
if (0 == system("test -x ./afl-showmap")) {
|
if (0 == system("test -x ./afl-showmap")) {
|
||||||
@ -424,15 +350,13 @@ BEGIN {
|
|||||||
# yuck, gnu stat is option incompatible to bsd stat
|
# yuck, gnu stat is option incompatible to bsd stat
|
||||||
# we use a heuristic to differentiate between
|
# we use a heuristic to differentiate between
|
||||||
# GNU stat and other stats
|
# GNU stat and other stats
|
||||||
cmd = "stat --version 2>/dev/null"
|
"stat --version 2>/dev/null" | getline statversion
|
||||||
cmd | getline statversion
|
if (statversion ~ /GNU coreutils/) {
|
||||||
close(cmd)
|
|
||||||
if (statversion ~ /GNU coreutils/ || statversion ~ /BusyBox/) {
|
|
||||||
stat_format = "-c '%s %n'" # GNU
|
stat_format = "-c '%s %n'" # GNU
|
||||||
} else {
|
} else {
|
||||||
stat_format = "-f '%z %N'" # *BSD, MacOS
|
stat_format = "-f '%z %N'" # *BSD, MacOS
|
||||||
}
|
}
|
||||||
cmdline = "(cd "in_dir" && find . \\( ! -name \".*\" -a -type d \\) -o -type f -exec stat "stat_format" \\{\\} + | sort -k1n -k2r) | grep -Ev '^0'"
|
cmdline = "(cd "in_dir" && find . \\( ! -name \".*\" -a -type d \\) -o -type f -exec stat "stat_format" \\{\\} + | sort -k1n -k2r)"
|
||||||
#cmdline = "ls "in_dir" | (cd "in_dir" && xargs stat "stat_format" 2>/dev/null) | sort -k1n -k2r"
|
#cmdline = "ls "in_dir" | (cd "in_dir" && xargs stat "stat_format" 2>/dev/null) | sort -k1n -k2r"
|
||||||
#cmdline = "(cd "in_dir" && stat "stat_format" *) | sort -k1n -k2r"
|
#cmdline = "(cd "in_dir" && stat "stat_format" *) | sort -k1n -k2r"
|
||||||
#cmdline = "(cd "in_dir" && ls | xargs stat "stat_format" ) | sort -k1n -k2r"
|
#cmdline = "(cd "in_dir" && ls | xargs stat "stat_format" ) | sort -k1n -k2r"
|
||||||
@ -445,7 +369,6 @@ BEGIN {
|
|||||||
infilesSmallToBigFullMap[infilesSmallToBigFull[i]] = infilesSmallToBig[i]
|
infilesSmallToBigFullMap[infilesSmallToBigFull[i]] = infilesSmallToBig[i]
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
close(cmdline)
|
|
||||||
in_count = i
|
in_count = i
|
||||||
|
|
||||||
first_file = infilesSmallToBigFull[0]
|
first_file = infilesSmallToBigFull[0]
|
||||||
@ -470,10 +393,10 @@ BEGIN {
|
|||||||
print "[*] Testing the target binary..."
|
print "[*] Testing the target binary..."
|
||||||
|
|
||||||
if (!stdin_file) {
|
if (!stdin_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"\"")
|
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"\"")
|
||||||
} else {
|
} else {
|
||||||
system("cp \""in_dir"/"first_file"\" "stdin_file)
|
system("cp \""in_dir"/"first_file"\" "stdin_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" -H \""stdin_file"\" -- \""target_bin"\" "prog_args_string" </dev/null")
|
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")
|
||||||
}
|
}
|
||||||
|
|
||||||
first_count = 0
|
first_count = 0
|
||||||
@ -482,7 +405,6 @@ BEGIN {
|
|||||||
while ((getline < runtest) > 0) {
|
while ((getline < runtest) > 0) {
|
||||||
++first_count
|
++first_count
|
||||||
}
|
}
|
||||||
close(runtest)
|
|
||||||
|
|
||||||
if (first_count) {
|
if (first_count) {
|
||||||
print "[+] OK, "first_count" tuples recorded."
|
print "[+] OK, "first_count" tuples recorded."
|
||||||
@ -495,90 +417,33 @@ BEGIN {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_count < threads) {
|
|
||||||
threads = in_count
|
|
||||||
print "[!] WARNING: less inputs than threads, reducing threads to "threads" and likely the overhead of threading makes things slower..."
|
|
||||||
}
|
|
||||||
|
|
||||||
# Let's roll!
|
# Let's roll!
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
# STEP 1: Collecting traces #
|
# STEP 1: Collecting traces #
|
||||||
#############################
|
#############################
|
||||||
|
|
||||||
if (threads) {
|
|
||||||
|
|
||||||
inputsperfile = int(in_count / threads)
|
|
||||||
if (in_count % threads) {
|
|
||||||
inputsperfile++;
|
|
||||||
}
|
|
||||||
|
|
||||||
cnt = 0;
|
|
||||||
tmpfile=out_dir "/.filelist"
|
|
||||||
for (instance = 1; instance < threads; instance++) {
|
|
||||||
for (i = 0; i < inputsperfile; i++) {
|
|
||||||
print in_dir"/"infilesSmallToBigFull[cnt] >> tmpfile"."instance
|
|
||||||
cnt++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (; cnt < in_count; cnt++) {
|
|
||||||
print in_dir"/"infilesSmallToBigFull[cnt] >> tmpfile"."threads
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
print "[*] Obtaining traces for "in_count" input files in '"in_dir"'."
|
print "[*] Obtaining traces for "in_count" input files in '"in_dir"'."
|
||||||
|
|
||||||
cur = 0;
|
cur = 0;
|
||||||
|
if (!stdin_file) {
|
||||||
if (threads > 1) {
|
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
|
||||||
print "[*] Creating " threads " parallel tasks with about " inputsperfile " items each."
|
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)
|
||||||
for (i = 1; i <= threads; i++) {
|
|
||||||
|
|
||||||
if (!stdin_file) {
|
|
||||||
# print " { "AFL_MAP_SIZE AFL_CMIN_ALLOW_ANY AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"\" -Z "extra_par" -I \""tmpfile"."i"\" -- \""target_bin"\" "prog_args_string"; > "tmpfile"."i".done ; } &"
|
|
||||||
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 \""tmpfile"."i"\" -- \""target_bin"\" "prog_args_string"; > "tmpfile"."i".done ; } &")
|
|
||||||
} else {
|
|
||||||
stdin_file=tmpfile"."i".stdin"
|
|
||||||
# print " { "AFL_MAP_SIZE AFL_CMIN_ALLOW_ANY AFL_CMIN_CRASHES_ONLY"\""showmap"\" -m "mem_limit" -t "timeout" -o \""trace_dir"\" -Z "extra_par" -I \""tmpfile"."i"\" -H \""stdin_file"\" -- \""target_bin"\" "prog_args_string" </dev/null; > "tmpfile"."i".done ; } &"
|
|
||||||
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 \""tmpfile"."i"\" -H \""stdin_file"\" -- \""target_bin"\" "prog_args_string" </dev/null; > "tmpfile"."i".done ; } &")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "[*] Waiting for parallel tasks to complete ..."
|
|
||||||
# wait for all processes to finish
|
|
||||||
ok=0
|
|
||||||
while (ok < threads) {
|
|
||||||
ok=0
|
|
||||||
for (i = 1; i <= threads; i++) {
|
|
||||||
if (system("test -f "tmpfile"."i".done") == 0) {
|
|
||||||
ok++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print "[*] Done!"
|
|
||||||
system("rm -f "tmpfile"*")
|
|
||||||
} else {
|
} else {
|
||||||
if (!stdin_file) {
|
print " Processing "in_count" files (forkserver mode)..."
|
||||||
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_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"
|
# 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_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")
|
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")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retval && !AFL_CMIN_CRASHES_ONLY) {
|
||||||
|
print "[!] Exit code "retval" != 0 received from afl-showmap, terminating..."
|
||||||
|
|
||||||
|
if (!ENVIRON["AFL_KEEP_TRACES"]) {
|
||||||
|
system("rm -rf "trace_dir" 2>/dev/null")
|
||||||
|
system("rmdir "out_dir)
|
||||||
}
|
}
|
||||||
|
exit retval
|
||||||
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")
|
|
||||||
system("rmdir "out_dir)
|
|
||||||
}
|
|
||||||
exit retval
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#######################################################
|
#######################################################
|
||||||
@ -598,19 +463,9 @@ BEGIN {
|
|||||||
while (cur < in_count) {
|
while (cur < in_count) {
|
||||||
fn = infilesSmallToBig[cur]
|
fn = infilesSmallToBig[cur]
|
||||||
++cur
|
++cur
|
||||||
if (redirected == 0) { printf "\r Processing file "cur"/"in_count }
|
printf "\r Processing file "cur"/"in_count
|
||||||
else { print " Processing file "cur"/"in_count }
|
|
||||||
# create path for the trace file from afl-showmap
|
# create path for the trace file from afl-showmap
|
||||||
tracefile_path = trace_dir"/"fn
|
tracefile_path = trace_dir"/"fn
|
||||||
# ensure the file size is not zero
|
|
||||||
cmd = "du -b "tracefile_path
|
|
||||||
"ls -l "tracefile_path
|
|
||||||
cmd | getline output
|
|
||||||
close(cmd)
|
|
||||||
split(output, result, "\t")
|
|
||||||
if (result[1] == 0) {
|
|
||||||
print "[!] WARNING: file "fn" is crashing the target, ignoring..."
|
|
||||||
}
|
|
||||||
# gather all keys, and count them
|
# gather all keys, and count them
|
||||||
while ((getline line < tracefile_path) > 0) {
|
while ((getline line < tracefile_path) > 0) {
|
||||||
key = line
|
key = line
|
||||||
@ -647,9 +502,7 @@ BEGIN {
|
|||||||
key = field[nrFields]
|
key = field[nrFields]
|
||||||
|
|
||||||
++tcnt;
|
++tcnt;
|
||||||
if (redirected == 0) { printf "\r Processing tuple "tcnt"/"tuple_count" with count "key_count[key]"..." }
|
printf "\r Processing tuple "tcnt"/"tuple_count" with count "key_count[key]"..."
|
||||||
else { print " Processing tuple "tcnt"/"tuple_count" with count "key_count[key]"..." }
|
|
||||||
|
|
||||||
if (key in keyAlreadyKnown) {
|
if (key in keyAlreadyKnown) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
234
afl-cmin.bash
234
afl-cmin.bash
@ -7,8 +7,6 @@
|
|||||||
#
|
#
|
||||||
# Copyright 2014, 2015 Google Inc. All rights reserved.
|
# Copyright 2014, 2015 Google Inc. All rights reserved.
|
||||||
#
|
#
|
||||||
# Copyright 2019-2024 AFLplusplus
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
# You may obtain a copy of the License at:
|
# You may obtain a copy of the License at:
|
||||||
@ -38,7 +36,7 @@
|
|||||||
# array sizes.
|
# array sizes.
|
||||||
#
|
#
|
||||||
|
|
||||||
echo "corpus minimization tool for afl-fuzz"
|
echo "corpus minimization tool for afl-fuzz by Michal Zalewski"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
#########
|
#########
|
||||||
@ -48,14 +46,14 @@ echo
|
|||||||
# Process command-line options...
|
# Process command-line options...
|
||||||
|
|
||||||
MEM_LIMIT=none
|
MEM_LIMIT=none
|
||||||
TIMEOUT=5000
|
TIMEOUT=none
|
||||||
|
|
||||||
unset IN_DIR OUT_DIR STDIN_FILE EXTRA_PAR MEM_LIMIT_GIVEN F_ARG \
|
unset IN_DIR OUT_DIR STDIN_FILE EXTRA_PAR MEM_LIMIT_GIVEN \
|
||||||
AFL_CMIN_CRASHES_ONLY AFL_CMIN_ALLOW_ANY QEMU_MODE UNICORN_MODE T_ARG
|
AFL_CMIN_CRASHES_ONLY AFL_CMIN_ALLOW_ANY QEMU_MODE UNICORN_MODE
|
||||||
|
|
||||||
export AFL_QUIET=1
|
export AFL_QUIET=1
|
||||||
|
|
||||||
while getopts "+i:o:f:m:t:T:eOQUAChXY" opt; do
|
while getopts "+i:o:f:m:t:eOQUCh" opt; do
|
||||||
|
|
||||||
case "$opt" in
|
case "$opt" in
|
||||||
|
|
||||||
@ -71,7 +69,6 @@ while getopts "+i:o:f:m:t:T:eOQUAChXY" opt; do
|
|||||||
;;
|
;;
|
||||||
"f")
|
"f")
|
||||||
STDIN_FILE="$OPTARG"
|
STDIN_FILE="$OPTARG"
|
||||||
F_ARG=1
|
|
||||||
;;
|
;;
|
||||||
"m")
|
"m")
|
||||||
MEM_LIMIT="$OPTARG"
|
MEM_LIMIT="$OPTARG"
|
||||||
@ -83,9 +80,6 @@ while getopts "+i:o:f:m:t:T:eOQUAChXY" opt; do
|
|||||||
"e")
|
"e")
|
||||||
EXTRA_PAR="$EXTRA_PAR -e"
|
EXTRA_PAR="$EXTRA_PAR -e"
|
||||||
;;
|
;;
|
||||||
"A")
|
|
||||||
export AFL_CMIN_ALLOW_ANY=1
|
|
||||||
;;
|
|
||||||
"C")
|
"C")
|
||||||
export AFL_CMIN_CRASHES_ONLY=1
|
export AFL_CMIN_CRASHES_ONLY=1
|
||||||
;;
|
;;
|
||||||
@ -97,21 +91,10 @@ while getopts "+i:o:f:m:t:T:eOQUAChXY" opt; do
|
|||||||
EXTRA_PAR="$EXTRA_PAR -Q"
|
EXTRA_PAR="$EXTRA_PAR -Q"
|
||||||
QEMU_MODE=1
|
QEMU_MODE=1
|
||||||
;;
|
;;
|
||||||
"Y")
|
|
||||||
EXTRA_PAR="$EXTRA_PAR -X"
|
|
||||||
NYX_MODE=1
|
|
||||||
;;
|
|
||||||
"X")
|
|
||||||
EXTRA_PAR="$EXTRA_PAR -X"
|
|
||||||
NYX_MODE=1
|
|
||||||
;;
|
|
||||||
"U")
|
"U")
|
||||||
EXTRA_PAR="$EXTRA_PAR -U"
|
EXTRA_PAR="$EXTRA_PAR -U"
|
||||||
UNICORN_MODE=1
|
UNICORN_MODE=1
|
||||||
;;
|
;;
|
||||||
"T")
|
|
||||||
T_ARG="$OPTARG"
|
|
||||||
;;
|
|
||||||
"?")
|
"?")
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
@ -136,18 +119,15 @@ Required parameters:
|
|||||||
|
|
||||||
Execution control settings:
|
Execution control settings:
|
||||||
|
|
||||||
-T tasks - how many parallel processes to create (default=1, "all"=nproc)
|
-f file - location read by the fuzzed program (stdin)
|
||||||
-f file - location read by the fuzzed program (default: stdin)
|
-m megs - memory limit for child process ($MEM_LIMIT MB)
|
||||||
-m megs - memory limit for child process (default=$MEM_LIMIT MB)
|
-t msec - run time limit for child process (none)
|
||||||
-t msec - run time limit for child process (default: 5000ms)
|
|
||||||
-O - use binary-only instrumentation (FRIDA mode)
|
-O - use binary-only instrumentation (FRIDA mode)
|
||||||
-Q - use binary-only instrumentation (QEMU mode)
|
-Q - use binary-only instrumentation (QEMU mode)
|
||||||
-U - use unicorn-based instrumentation (Unicorn mode)
|
-U - use unicorn-based instrumentation (Unicorn mode)
|
||||||
-X - use Nyx mode
|
|
||||||
|
|
||||||
Minimization settings:
|
Minimization settings:
|
||||||
|
|
||||||
-A - allow crashing and timeout inputs
|
|
||||||
-C - keep crashing inputs, reject everything else
|
-C - keep crashing inputs, reject everything else
|
||||||
-e - solve for edge coverage only, ignore hit counts
|
-e - solve for edge coverage only, ignore hit counts
|
||||||
|
|
||||||
@ -158,8 +138,6 @@ AFL_KEEP_TRACES: leave the temporary <out_dir>\.traces directory
|
|||||||
AFL_NO_FORKSRV: run target via execve instead of using the forkserver
|
AFL_NO_FORKSRV: run target via execve instead of using the forkserver
|
||||||
AFL_PATH: last resort location to find the afl-showmap binary
|
AFL_PATH: last resort location to find the afl-showmap binary
|
||||||
AFL_SKIP_BIN_CHECK: skip check for target binary
|
AFL_SKIP_BIN_CHECK: skip check for target binary
|
||||||
AFL_CUSTOM_MUTATOR_LIBRARY: custom mutator library (post_process and send)
|
|
||||||
AFL_PYTHON_MODULE: custom mutator library (post_process and send)
|
|
||||||
_EOF_
|
_EOF_
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@ -167,28 +145,29 @@ fi
|
|||||||
# Do a sanity check to discourage the use of /tmp, since we can't really
|
# Do a sanity check to discourage the use of /tmp, since we can't really
|
||||||
# handle this safely from a shell script.
|
# handle this safely from a shell script.
|
||||||
|
|
||||||
if [ "$AFL_ALLOW_TMP" = "" ]; then
|
#if [ "$AFL_ALLOW_TMP" = "" ]; then
|
||||||
|
#
|
||||||
echo "$IN_DIR" | grep -qE '^(/var)?/tmp/'
|
# echo "$IN_DIR" | grep -qE '^(/var)?/tmp/'
|
||||||
T1="$?"
|
# T1="$?"
|
||||||
|
#
|
||||||
echo "$TARGET_BIN" | grep -qE '^(/var)?/tmp/'
|
# echo "$TARGET_BIN" | grep -qE '^(/var)?/tmp/'
|
||||||
T2="$?"
|
# T2="$?"
|
||||||
|
#
|
||||||
echo "$OUT_DIR" | grep -qE '^(/var)?/tmp/'
|
# echo "$OUT_DIR" | grep -qE '^(/var)?/tmp/'
|
||||||
T3="$?"
|
# T3="$?"
|
||||||
|
#
|
||||||
echo "$STDIN_FILE" | grep -qE '^(/var)?/tmp/'
|
# echo "$STDIN_FILE" | grep -qE '^(/var)?/tmp/'
|
||||||
T4="$?"
|
# T4="$?"
|
||||||
|
#
|
||||||
echo "$PWD" | grep -qE '^(/var)?/tmp/'
|
# echo "$PWD" | grep -qE '^(/var)?/tmp/'
|
||||||
T5="$?"
|
# T5="$?"
|
||||||
|
#
|
||||||
if [ "$T1" = "0" -o "$T2" = "0" -o "$T3" = "0" -o "$T4" = "0" -o "$T5" = "0" ]; then
|
# if [ "$T1" = "0" -o "$T2" = "0" -o "$T3" = "0" -o "$T4" = "0" -o "$T5" = "0" ]; then
|
||||||
echo "[-] Warning: do not use this script in /tmp or /var/tmp for security reasons." 1>&2
|
# echo "[-] Error: do not use this script in /tmp or /var/tmp." 1>&2
|
||||||
fi
|
# exit 1
|
||||||
|
# fi
|
||||||
fi
|
#
|
||||||
|
#fi
|
||||||
|
|
||||||
# If @@ is specified, but there's no -f, let's come up with a temporary input
|
# If @@ is specified, but there's no -f, let's come up with a temporary input
|
||||||
# file name.
|
# file name.
|
||||||
@ -205,11 +184,6 @@ fi
|
|||||||
|
|
||||||
# Check for obvious errors.
|
# Check for obvious errors.
|
||||||
|
|
||||||
if [ ! "$T_ARG" = "" -a -n "$F_ARG" -a ! "$NYX_MODE" == 1 ]; then
|
|
||||||
echo "[-] Error: -T and -f can not be used together." 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! "$MEM_LIMIT" = "none" ]; then
|
if [ ! "$MEM_LIMIT" = "none" ]; then
|
||||||
|
|
||||||
if [ "$MEM_LIMIT" -lt "5" ]; then
|
if [ "$MEM_LIMIT" -lt "5" ]; then
|
||||||
@ -228,32 +202,20 @@ if [ ! "$TIMEOUT" = "none" ]; then
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$NYX_MODE" = "" ]; then
|
if [ ! -f "$TARGET_BIN" -o ! -x "$TARGET_BIN" ]; then
|
||||||
if [ ! -f "$TARGET_BIN" -o ! -x "$TARGET_BIN" ]; then
|
|
||||||
|
|
||||||
TNEW="`which "$TARGET_BIN" 2>/dev/null`"
|
TNEW="`which "$TARGET_BIN" 2>/dev/null`"
|
||||||
|
|
||||||
if [ ! -f "$TNEW" -o ! -x "$TNEW" ]; then
|
|
||||||
echo "[-] Error: binary '$TARGET_BIN' not found or not executable." 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
TARGET_BIN="$TNEW"
|
|
||||||
|
|
||||||
|
if [ ! -f "$TNEW" -o ! -x "$TNEW" ]; then
|
||||||
|
echo "[-] Error: binary '$TARGET_BIN' not found or not executable." 1>&2
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
TARGET_BIN="$TNEW"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
grep -aq AFL_DUMP_MAP_SIZE "$TARGET_BIN" && {
|
if [ "$AFL_SKIP_BIN_CHECK" = "" -a "$QEMU_MODE" = "" -a "$FRIDA_MODE" = "" -a "$UNICORN_MODE" = "" ]; then
|
||||||
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" = "" -a "$NYX_MODE" = "" ]; then
|
|
||||||
|
|
||||||
if ! grep -qF "__AFL_SHM_ID" "$TARGET_BIN"; then
|
if ! grep -qF "__AFL_SHM_ID" "$TARGET_BIN"; then
|
||||||
echo "[-] Error: binary '$TARGET_BIN' doesn't appear to be instrumented." 1>&2
|
echo "[-] Error: binary '$TARGET_BIN' doesn't appear to be instrumented." 1>&2
|
||||||
@ -310,41 +272,14 @@ if [ ! -x "$SHOWMAP" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
THREADS=
|
|
||||||
if [ ! "$T_ARG" = "" ]; then
|
|
||||||
if [ "$T_ARG" = "all" ]; then
|
|
||||||
THREADS=$(nproc)
|
|
||||||
else
|
|
||||||
if [ "$T_ARG" -gt 1 -a "$T_ARG" -le "$(nproc)" ]; then
|
|
||||||
THREADS=$T_ARG
|
|
||||||
else
|
|
||||||
echo "[-] Error: -T parameter must between 2 and $(nproc) or \"all\"." 1>&2
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ -z "$F_ARG" ]; then
|
|
||||||
echo "[*] Are you aware of the '-T all' parallelize option that massively improves the speed?"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
IN_COUNT=$((`ls -- "$IN_DIR" 2>/dev/null | wc -l`))
|
IN_COUNT=$((`ls -- "$IN_DIR" 2>/dev/null | wc -l`))
|
||||||
|
|
||||||
if [ "$IN_COUNT" = "0" ]; then
|
if [ "$IN_COUNT" = "0" ]; then
|
||||||
echo "[-] Hmm, no inputs in the target directory. Nothing to be done."
|
echo "[+] Hmm, no inputs in the target directory. Nothing to be done."
|
||||||
rm -rf "$TRACE_DIR"
|
rm -rf "$TRACE_DIR"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "[*] Are you aware that afl-cmin is faster than this afl-cmin.bash script?"
|
|
||||||
echo "[+] Found $IN_COUNT files for minimizing."
|
|
||||||
|
|
||||||
if [ -n "$THREADS" ]; then
|
|
||||||
if [ "$IN_COUNT" -lt "$THREADS" ]; then
|
|
||||||
THREADS=$IN_COUNT
|
|
||||||
echo "[!] WARNING: less inputs than threads, reducing threads to $THREADS and likely the overhead of threading makes things slower..."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
FIRST_FILE=`ls "$IN_DIR" | head -1`
|
FIRST_FILE=`ls "$IN_DIR" | head -1`
|
||||||
|
|
||||||
# Make sure that we're not dealing with a directory.
|
# Make sure that we're not dealing with a directory.
|
||||||
@ -393,18 +328,6 @@ else
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
TMPFILE=$OUT_DIR/.list.$$
|
|
||||||
if [ ! "$THREADS" = "" ]; then
|
|
||||||
ls -- "$IN_DIR" > $TMPFILE 2>/dev/null
|
|
||||||
IN_COUNT=$(cat $TMPFILE | wc -l)
|
|
||||||
SPLIT=$(($IN_COUNT / $THREADS))
|
|
||||||
if [ "$(($IN_COUNT % $THREADS))" -gt 0 ]; then
|
|
||||||
SPLIT=$(($SPLIT + 1))
|
|
||||||
fi
|
|
||||||
echo "[+] Splitting workload into $THREADS tasks with $SPLIT items on average each."
|
|
||||||
split -l $SPLIT $TMPFILE $TMPFILE.
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Let's roll!
|
# Let's roll!
|
||||||
|
|
||||||
#############################
|
#############################
|
||||||
@ -413,7 +336,6 @@ fi
|
|||||||
|
|
||||||
echo "[*] Obtaining traces for input files in '$IN_DIR'..."
|
echo "[*] Obtaining traces for input files in '$IN_DIR'..."
|
||||||
|
|
||||||
if [ "$THREADS" = "" ]; then
|
|
||||||
(
|
(
|
||||||
|
|
||||||
CUR=0
|
CUR=0
|
||||||
@ -422,14 +344,10 @@ if [ "$THREADS" = "" ]; then
|
|||||||
|
|
||||||
ls "$IN_DIR" | while read -r fn; do
|
ls "$IN_DIR" | while read -r fn; do
|
||||||
|
|
||||||
if [ -s "$IN_DIR/$fn" ]; then
|
CUR=$((CUR+1))
|
||||||
|
printf "\\r Processing file $CUR/$IN_COUNT... "
|
||||||
|
|
||||||
CUR=$((CUR+1))
|
"$SHOWMAP" -m "$MEM_LIMIT" -t "$TIMEOUT" -o "$TRACE_DIR/$fn" -Z $EXTRA_PAR -- "$@" <"$IN_DIR/$fn"
|
||||||
printf "\\r Processing file $CUR/$IN_COUNT... "
|
|
||||||
|
|
||||||
"$SHOWMAP" -m "$MEM_LIMIT" -t "$TIMEOUT" -o "$TRACE_DIR/$fn" -Z $EXTRA_PAR -- "$@" <"$IN_DIR/$fn"
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
@ -437,73 +355,21 @@ if [ "$THREADS" = "" ]; then
|
|||||||
|
|
||||||
ls "$IN_DIR" | while read -r fn; do
|
ls "$IN_DIR" | while read -r fn; do
|
||||||
|
|
||||||
if [ -s "$IN_DIR/$fn" ]; then
|
CUR=$((CUR+1))
|
||||||
|
printf "\\r Processing file $CUR/$IN_COUNT... "
|
||||||
|
|
||||||
CUR=$((CUR+1))
|
cp "$IN_DIR/$fn" "$STDIN_FILE"
|
||||||
printf "\\r Processing file $CUR/$IN_COUNT... "
|
|
||||||
|
|
||||||
cp "$IN_DIR/$fn" "$STDIN_FILE"
|
"$SHOWMAP" -m "$MEM_LIMIT" -t "$TIMEOUT" -o "$TRACE_DIR/$fn" -Z $EXTRA_PAR -H "$STDIN_FILE" -- "$@" </dev/null
|
||||||
"$SHOWMAP" -m "$MEM_LIMIT" -t "$TIMEOUT" -o "$TRACE_DIR/$fn" -Z $EXTRA_PAR -H "$STDIN_FILE" -- "$@" </dev/null
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
fi
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
else
|
echo
|
||||||
|
|
||||||
PIDS=
|
|
||||||
CNT=0
|
|
||||||
for inputs in $(ls ${TMPFILE}.*); do
|
|
||||||
|
|
||||||
(
|
|
||||||
|
|
||||||
if [ "$STDIN_FILE" = "" ]; then
|
|
||||||
|
|
||||||
cat $inputs | while read -r fn; do
|
|
||||||
|
|
||||||
if [ -s "$IN_DIR/$fn" ]; then
|
|
||||||
|
|
||||||
"$SHOWMAP" -m "$MEM_LIMIT" -t "$TIMEOUT" -o "$TRACE_DIR/$fn" -Z $EXTRA_PAR -- "$@" <"$IN_DIR/$fn"
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
if [ -s "$IN_DIR/$fn" ]; then
|
|
||||||
STDIN_FILE="$inputs.$$"
|
|
||||||
cat $inputs | while read -r fn; do
|
|
||||||
|
|
||||||
cp "$IN_DIR/$fn" "$STDIN_FILE"
|
|
||||||
"$SHOWMAP" -m "$MEM_LIMIT" -t "$TIMEOUT" -o "$TRACE_DIR/$fn" -Z $EXTRA_PAR -H "$STDIN_FILE" -- "$@" </dev/null
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
) &
|
|
||||||
|
|
||||||
PIDS="$PIDS $!"
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "[+] Waiting for running tasks IDs:$PIDS"
|
|
||||||
wait
|
|
||||||
echo "[+] all $THREADS running tasks completed."
|
|
||||||
rm -f ${TMPFILE}*
|
|
||||||
|
|
||||||
#echo trace dir files: $(ls $TRACE_DIR/*|wc -l)
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
##########################
|
##########################
|
||||||
# STEP 2: SORTING TUPLES #
|
# STEP 2: SORTING TUPLES #
|
||||||
@ -544,8 +410,6 @@ ls -rS "$IN_DIR" | while read -r fn; do
|
|||||||
|
|
||||||
sed "s#\$# $fn#" "$TRACE_DIR/$fn" >>"$TRACE_DIR/.candidate_list"
|
sed "s#\$# $fn#" "$TRACE_DIR/$fn" >>"$TRACE_DIR/.candidate_list"
|
||||||
|
|
||||||
test -s "$TRACE_DIR/$fn" || echo Warning: $fn is ignored because of crashing the target
|
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# written by jhertz
|
# written by jhertz
|
||||||
#
|
#
|
||||||
|
|
||||||
test "$1" = "-h" -o "$1" = "-hh" -o "$1" = "--help" && {
|
test "$1" = "-h" -o "$1" = "-hh" && {
|
||||||
echo 'afl-persistent-config'
|
echo 'afl-persistent-config'
|
||||||
echo
|
echo
|
||||||
echo $0
|
echo $0
|
||||||
@ -17,11 +17,6 @@ test "$1" = "-h" -o "$1" = "-hh" -o "$1" = "--help" && {
|
|||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ $# -ne 0 ]; then
|
|
||||||
echo "ERROR: Unknown option(s): $@"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "WARNING: This scripts makes permanent configuration changes to the system to"
|
echo "WARNING: This scripts makes permanent configuration changes to the system to"
|
||||||
echo " increase the performance for fuzzing. As a result, the system also"
|
echo " increase the performance for fuzzing. As a result, the system also"
|
||||||
@ -38,7 +33,6 @@ fi
|
|||||||
|
|
||||||
echo
|
echo
|
||||||
PLATFORM=`uname -s`
|
PLATFORM=`uname -s`
|
||||||
ARCH=`uname -m`
|
|
||||||
|
|
||||||
# check that we're on Mac
|
# check that we're on Mac
|
||||||
if [[ "$PLATFORM" = "Darwin" ]] ; then
|
if [[ "$PLATFORM" = "Darwin" ]] ; then
|
||||||
@ -88,13 +82,6 @@ if [[ "$PLATFORM" = "Darwin" ]] ; then
|
|||||||
</plist>
|
</plist>
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
if [[ "$ARCH" = "x86_64" ]]; then
|
|
||||||
echo "Disabling ASLR system wide"
|
|
||||||
nvram boot-args="no_aslr=1"
|
|
||||||
else
|
|
||||||
echo NOTICE: on ARM64 we do not know currently how to disable system wide ASLR, please report if you know how.
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "Reboot and enjoy your fuzzing"
|
echo "Reboot and enjoy your fuzzing"
|
||||||
exit 0
|
exit 0
|
||||||
@ -111,9 +98,9 @@ if [[ "$PLATFORM" = "Linux" ]] ; then
|
|||||||
echo "Checks passed."
|
echo "Checks passed."
|
||||||
|
|
||||||
test -d /etc/sysctl.d || echo Error: /etc/sysctl.d directory not found, cannot install shmem config
|
test -d /etc/sysctl.d || echo Error: /etc/sysctl.d directory not found, cannot install shmem config
|
||||||
test -d /etc/sysctl.d -a '!' -e /etc/sysctl.d/99-fuzzing.conf && {
|
test -d /etc/sysctl.d -a '!' -e /etc/sysctl.d/99-fuzzing && {
|
||||||
echo "Installing /etc/sysctl.d/99-fuzzing.conf"
|
echo "Installing /etc/sysctl.d/99-fuzzing"
|
||||||
cat << EOF > /etc/sysctl.d/99-fuzzing.conf
|
cat << EOF > /etc/sysctl.d/99-fuzzing
|
||||||
kernel.core_uses_pid=0
|
kernel.core_uses_pid=0
|
||||||
kernel.core_pattern=core
|
kernel.core_pattern=core
|
||||||
kernel.randomize_va_space=0
|
kernel.randomize_va_space=0
|
||||||
@ -124,12 +111,12 @@ kernel.sched_latency_ns=250000000
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
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
|
||||||
grep -E -q '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub 2>/dev/null && {
|
egrep -q '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub 2>/dev/null && {
|
||||||
grep -E '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub | grep -E -q 'noibrs pcid nopti' || {
|
egrep '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub | egrep -q hardened_usercopy=off || {
|
||||||
echo "Configuring performance boot options"
|
echo "Configuring performance boot options"
|
||||||
LINE=`grep -E '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub | sed 's/^GRUB_CMDLINE_LINUX_DEFAULT=//' | tr -d '"'`
|
LINE=`egrep '^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 pcid nopti nospec_store_bypass_disable nospectre_v1 nospectre_v2 pcid=on 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"
|
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\"
|
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
|
sed -i "s|^GRUB_CMDLINE_LINUX_DEFAULT=.*|GRUB_CMDLINE_LINUX_DEFAULT=\"$OPTIONS\"|" /etc/default/grub
|
||||||
}
|
}
|
||||||
|
19
afl-plot
19
afl-plot
@ -75,17 +75,8 @@ outputdir=`get_abs_path "$2"`
|
|||||||
|
|
||||||
if [ ! -f "$inputdir/plot_data" ]; then
|
if [ ! -f "$inputdir/plot_data" ]; then
|
||||||
|
|
||||||
if [ -f "$inputdir/default/plot_data" ]; then
|
echo "[-] Error: input directory is not valid (missing 'plot_data')." 1>&2
|
||||||
|
exit 1
|
||||||
echo "[-] Error: input directory is not valid (missing 'plot_data'), likely you mean $inputdir/default?" 1>&2
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
echo "[-] Error: input directory is not valid (missing 'plot_data')." 1>&2
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -150,7 +141,7 @@ set output '$outputdir/high_freq.png'
|
|||||||
$GNUPLOT_SETUP
|
$GNUPLOT_SETUP
|
||||||
|
|
||||||
plot '$inputdir/plot_data' using 1:4 with filledcurve x1 title 'corpus count' linecolor rgb '#000000' fillstyle transparent solid 0.2 noborder, \\
|
plot '$inputdir/plot_data' using 1:4 with filledcurve x1 title 'corpus count' linecolor rgb '#000000' fillstyle transparent solid 0.2 noborder, \\
|
||||||
'' using 1:3 with filledcurve x1 title 'current item' linecolor rgb '#f0f0f0' fillstyle transparent solid 0.5 noborder, \\
|
'' using 1:3 with filledcurve x1 title 'current fuzz item' linecolor rgb '#f0f0f0' fillstyle transparent solid 0.5 noborder, \\
|
||||||
'' using 1:5 with lines title 'pending items' linecolor rgb '#0090ff' linewidth 3, \\
|
'' using 1:5 with lines title 'pending items' linecolor rgb '#0090ff' linewidth 3, \\
|
||||||
'' using 1:6 with lines title 'pending favs' linecolor rgb '#c00080' linewidth 3, \\
|
'' using 1:6 with lines title 'pending favs' linecolor rgb '#c00080' linewidth 3, \\
|
||||||
'' using 1:2 with lines title 'cycles done' linecolor rgb '#c000f0' linewidth 3
|
'' using 1:2 with lines title 'cycles done' linecolor rgb '#c000f0' linewidth 3
|
||||||
@ -296,9 +287,9 @@ $PLOT_EG
|
|||||||
|
|
||||||
_EOF_
|
_EOF_
|
||||||
|
|
||||||
) | gnuplot || echo "Note: if you see errors concerning 'unknown or ambiguous terminal type' then you need to use a gnuplot that has png support compiled in."
|
) | gnuplot
|
||||||
|
|
||||||
echo "[?] You can also use -g flag to view the plots in an GUI window, and interact with the plots (if you have built afl-plot-ui). Run \"afl-plot -h\" to know more."
|
echo "[?] You can also use -g flag to view the plots in an GUI window, and interact with the plots (if you have built afl-plot-ui). Run \"afl-plot-h\" to know more."
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
test "$1" = "-h" -o "$1" = "-hh" -o "$1" = "--help" && {
|
test "$1" = "-h" -o "$1" = "-hh" && {
|
||||||
echo 'afl-system-config by Marc Heuse <mh@mh-sec.de>'
|
echo 'afl-system-config by Marc Heuse <mh@mh-sec.de>'
|
||||||
echo
|
echo
|
||||||
echo $0
|
echo $0
|
||||||
@ -13,10 +13,6 @@ test "$1" = "-h" -o "$1" = "-hh" -o "$1" = "--help" && {
|
|||||||
echo configuration options.
|
echo configuration options.
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
if [ $# -ne 0 ]; then
|
|
||||||
echo "ERROR: Unknown option(s): $@"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
DONE=
|
DONE=
|
||||||
PLATFORM=`uname -s`
|
PLATFORM=`uname -s`
|
||||||
@ -25,7 +21,6 @@ echo "WARNING: this reduces the security of the system!"
|
|||||||
echo
|
echo
|
||||||
if [ '!' "$EUID" = 0 ] && [ '!' `id -u` = 0 ] ; then
|
if [ '!' "$EUID" = 0 ] && [ '!' `id -u` = 0 ] ; then
|
||||||
echo "Warning: you need to be root to run this!"
|
echo "Warning: you need to be root to run this!"
|
||||||
sleep 1
|
|
||||||
# we do not exit as other mechanisms exist that allows to do this than
|
# we do not exit as other mechanisms exist that allows to do this than
|
||||||
# being root. let the errors speak for themselves.
|
# being root. let the errors speak for themselves.
|
||||||
fi
|
fi
|
||||||
@ -52,9 +47,9 @@ if [ "$PLATFORM" = "Linux" ] ; then
|
|||||||
} > /dev/null
|
} > /dev/null
|
||||||
echo Settings applied.
|
echo Settings applied.
|
||||||
echo
|
echo
|
||||||
dmesg | grep -E -q 'noibrs pcid nopti' || {
|
dmesg | egrep -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 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 pcid nopti nospec_store_bypass_disable nospectre_v1 nospectre_v2 pcid=on 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 ' /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
|
echo
|
||||||
}
|
}
|
||||||
echo If you run fuzzing instances in docker, run them with \"--security-opt seccomp=unconfined\" for more speed.
|
echo If you run fuzzing instances in docker, run them with \"--security-opt seccomp=unconfined\" for more speed.
|
||||||
@ -81,9 +76,6 @@ EOF
|
|||||||
DONE=1
|
DONE=1
|
||||||
fi
|
fi
|
||||||
if [ "$PLATFORM" = "OpenBSD" ] ; then
|
if [ "$PLATFORM" = "OpenBSD" ] ; then
|
||||||
doas sysctl vm.malloc_conf=
|
|
||||||
echo 'Freecheck on allocation in particular can be detrimental to performance.'
|
|
||||||
echo 'Also we might not want necessarily to abort at any allocation failure.'
|
|
||||||
echo 'System security features cannot be disabled on OpenBSD.'
|
echo 'System security features cannot be disabled on OpenBSD.'
|
||||||
echo
|
echo
|
||||||
DONE=1
|
DONE=1
|
||||||
@ -115,16 +107,15 @@ if [ "$PLATFORM" = "Darwin" ] ; then
|
|||||||
sysctl kern.sysv.shmall=131072000
|
sysctl kern.sysv.shmall=131072000
|
||||||
echo Settings applied.
|
echo Settings applied.
|
||||||
echo
|
echo
|
||||||
if $(launchctl list 2>/dev/null | grep -q '\.ReportCrash\>') ; then
|
if [ $(launchctl list 2>/dev/null | grep -q '\.ReportCrash$') ] ; then
|
||||||
echo
|
echo
|
||||||
echo Unloading the default crash reporter
|
echo Unloading the default crash reporter
|
||||||
SL=/System/Library; PL=com.apple.ReportCrash
|
SL=/System/Library; PL=com.apple.ReportCrash
|
||||||
sudo -u "$SUDO_USER" launchctl unload -w ${SL}/LaunchAgents/${PL}.plist
|
launchctl unload -w ${SL}/LaunchAgents/${PL}.plist >/dev/null 2>&1
|
||||||
launchctl unload -w ${SL}/LaunchDaemons/${PL}.Root.plist
|
sudo launchctl unload -w ${SL}/LaunchDaemons/${PL}.Root.plist >/dev/null 2>&1
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
echo It is recommended to disable System Integrity Protection for increased performance.
|
echo It is recommended to disable System Integration Protection for increased performance.
|
||||||
echo See: https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection
|
|
||||||
echo
|
echo
|
||||||
DONE=1
|
DONE=1
|
||||||
fi
|
fi
|
||||||
|
425
afl-whatsup
425
afl-whatsup
@ -6,7 +6,7 @@
|
|||||||
# Originally written by Michal Zalewski
|
# Originally written by Michal Zalewski
|
||||||
#
|
#
|
||||||
# Copyright 2015 Google Inc. All rights reserved.
|
# Copyright 2015 Google Inc. All rights reserved.
|
||||||
# Copyright 2019-2024 AFLplusplus Project. All rights reserved.
|
# Copyright 2019-2020 AFLplusplus Project. All rights reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@ -18,98 +18,64 @@
|
|||||||
# instances of afl-fuzz.
|
# instances of afl-fuzz.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
echo "$0 status check tool for afl-fuzz by Michal Zalewski"
|
||||||
|
echo
|
||||||
test "$1" = "-h" -o "$1" = "-hh" && {
|
test "$1" = "-h" -o "$1" = "-hh" && {
|
||||||
echo "$0 status check tool for afl-fuzz by Michal Zalewski"
|
|
||||||
echo
|
|
||||||
echo "Usage: $0 [-s] [-d] afl_output_directory"
|
echo "Usage: $0 [-s] [-d] afl_output_directory"
|
||||||
echo
|
echo
|
||||||
echo Options:
|
echo Options:
|
||||||
echo " -d - include dead fuzzer stats"
|
|
||||||
echo " -m - just show minimal stats"
|
|
||||||
echo " -n - no color output"
|
|
||||||
echo " -s - skip details and output summary results only"
|
echo " -s - skip details and output summary results only"
|
||||||
|
echo " -d - include dead fuzzer stats"
|
||||||
echo
|
echo
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
unset MINIMAL_ONLY
|
|
||||||
unset NO_COLOR
|
|
||||||
unset PROCESS_DEAD
|
|
||||||
unset SUMMARY_ONLY
|
unset SUMMARY_ONLY
|
||||||
unset RED
|
unset PROCESS_DEAD
|
||||||
unset GREEN
|
|
||||||
unset YELLOW
|
|
||||||
unset BLUE
|
|
||||||
unset NC
|
|
||||||
unset RESET
|
|
||||||
|
|
||||||
if [ -z "$TERM" ]; then export TERM=vt220; fi
|
while [ "$1" = "-s" -o "$1" = "-d" ]; do
|
||||||
|
|
||||||
|
if [ "$1" = "-s" ]; then
|
||||||
|
SUMMARY_ONLY=1
|
||||||
|
fi
|
||||||
|
|
||||||
while [ "$1" = "-d" -o "$1" = "-m" -o "$1" = "-n" -o "$1" = "-s" ]; do
|
|
||||||
|
|
||||||
if [ "$1" = "-d" ]; then
|
if [ "$1" = "-d" ]; then
|
||||||
PROCESS_DEAD=1
|
PROCESS_DEAD=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$1" = "-m" ]; then
|
|
||||||
MINIMAL_ONLY=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "-n" ]; then
|
|
||||||
NO_COLOR=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "-s" ]; then
|
|
||||||
SUMMARY_ONLY=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
shift
|
shift
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
DIR="$1"
|
DIR="$1"
|
||||||
|
|
||||||
if [ "$DIR" = "" -o "$DIR" = "-h" -o "$DIR" = "--help" ]; then
|
if [ "$DIR" = "" ]; then
|
||||||
|
|
||||||
echo "$0 status check tool for afl-fuzz by Michal Zalewski" 1>&2
|
echo "Usage: $0 [-s] [-d] afl_output_directory" 1>&2
|
||||||
echo 1>&2
|
|
||||||
echo "Usage: $0 [-d] [-m] [-n] [-s] afl_output_directory" 1>&2
|
|
||||||
echo 1>&2
|
echo 1>&2
|
||||||
echo Options: 1>&2
|
echo Options: 1>&2
|
||||||
echo " -d - include dead fuzzer stats" 1>&2
|
|
||||||
echo " -m - just show minimal stats" 1>&2
|
|
||||||
echo " -n - no color output" 1>&2
|
|
||||||
echo " -s - skip details and output summary results only" 1>&2
|
echo " -s - skip details and output summary results only" 1>&2
|
||||||
|
echo " -d - include dead fuzzer stats" 1>&2
|
||||||
echo 1>&2
|
echo 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$MINIMAL_ONLY" ]; then
|
|
||||||
echo "$0 status check tool for afl-fuzz by Michal Zalewski"
|
|
||||||
echo
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd "$DIR" || exit 1
|
cd "$DIR" || exit 1
|
||||||
|
|
||||||
if [ -d queue ]; then
|
if [ -d queue ]; then
|
||||||
|
|
||||||
echo "[-] Error: parameter is an individual output directory, not a sync dir." 1>&2
|
echo "[-] Error: parameter is an individual output directory, not a sync dir." 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
BC=`which bc 2>/dev/null`
|
RED=`tput setaf 9 1 1`
|
||||||
FUSER=`which fuser 2>/dev/null`
|
GREEN=`tput setaf 2 1 1`
|
||||||
|
BLUE=`tput setaf 4 1 1`
|
||||||
if [ -z "$NO_COLOR" ]; then
|
YELLOW=`tput setaf 11 1 1`
|
||||||
RED=`tput setaf 9 1 1 2>/dev/null`
|
NC=`tput sgr0`
|
||||||
GREEN=`tput setaf 2 1 1 2>/dev/null`
|
RESET="$NC"
|
||||||
BLUE=`tput setaf 4 1 1 2>/dev/null`
|
|
||||||
YELLOW=`tput setaf 11 1 1 2>/dev/null`
|
|
||||||
NC=`tput sgr0`
|
|
||||||
RESET="$NC"
|
|
||||||
fi
|
|
||||||
|
|
||||||
CUR_TIME=`date +%s`
|
CUR_TIME=`date +%s`
|
||||||
|
|
||||||
@ -117,29 +83,26 @@ TMP=`mktemp -t .afl-whatsup-XXXXXXXX` || TMP=`mktemp -p /data/local/tmp .afl-wha
|
|||||||
|
|
||||||
ALIVE_CNT=0
|
ALIVE_CNT=0
|
||||||
DEAD_CNT=0
|
DEAD_CNT=0
|
||||||
START_CNT=0
|
|
||||||
|
|
||||||
TOTAL_TIME=0
|
TOTAL_TIME=0
|
||||||
TOTAL_EXECS=0
|
TOTAL_EXECS=0
|
||||||
TOTAL_EPS=0
|
TOTAL_EPS=0
|
||||||
TOTAL_CRASHES=0
|
TOTAL_CRASHES=0
|
||||||
TOTAL_HANGS=0
|
|
||||||
TOTAL_PFAV=0
|
TOTAL_PFAV=0
|
||||||
TOTAL_PENDING=0
|
TOTAL_PENDING=0
|
||||||
TOTAL_COVERAGE=
|
|
||||||
|
|
||||||
# Time since last find / crash / hang, formatted as string
|
# Time since last path / crash / hang, formatted as string
|
||||||
FMT_TIME="0 days 0 hours"
|
FMT_TIME="0 days 0 hours"
|
||||||
FMT_FIND="${RED}none seen yet${NC}"
|
FMT_PATH="${RED}none seen yet${NC}"
|
||||||
FMT_CRASH="none seen yet"
|
FMT_CRASH="none seen yet"
|
||||||
FMT_HANG="none seen yet"
|
FMT_HANG="none seen yet"
|
||||||
|
|
||||||
if [ "$SUMMARY_ONLY" = "" ]; then
|
if [ "$SUMMARY_ONLY" = "" ]; then
|
||||||
|
|
||||||
echo "Individual fuzzers"
|
echo "Individual fuzzers"
|
||||||
echo "=================="
|
echo "=================="
|
||||||
echo
|
echo
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fmt_duration()
|
fmt_duration()
|
||||||
@ -148,22 +111,22 @@ fmt_duration()
|
|||||||
if [ $1 -le 0 ]; then
|
if [ $1 -le 0 ]; then
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local duration=$((CUR_TIME - $1))
|
local duration=$((CUR_TIME - $1))
|
||||||
local days=$((duration / 60 / 60 / 24))
|
local days=$((duration / 60 / 60 / 24))
|
||||||
local hours=$(((duration / 60 / 60) % 24))
|
local hours=$(((duration / 60 / 60) % 24))
|
||||||
local minutes=$(((duration / 60) % 60))
|
local minutes=$(((duration / 60) % 60))
|
||||||
local seconds=$((duration % 60))
|
local seconds=$((duration % 60))
|
||||||
|
|
||||||
if [ $duration -le 0 ]; then
|
if [ $duration -le 0 ]; then
|
||||||
DUR_STRING="0 seconds"
|
DUR_STRING="0 seconds"
|
||||||
elif [ $duration -eq 1 ]; then
|
elif [ $duration -eq 1 ]; then
|
||||||
DUR_STRING="1 second"
|
DUR_STRING="1 second"
|
||||||
elif [ $days -gt 0 ]; then
|
elif [ $days -gt 0 ]; then
|
||||||
DUR_STRING="$days days, $hours hours"
|
DUR_STRING="$days days, $hours hours"
|
||||||
elif [ $hours -gt 0 ]; then
|
elif [ $hours -gt 0 ]; then
|
||||||
DUR_STRING="$hours hours, $minutes minutes"
|
DUR_STRING="$hours hours, $minutes minutes"
|
||||||
elif [ $minutes -gt 0 ]; then
|
elif [ $minutes -gt 0 ]; then
|
||||||
DUR_STRING="$minutes minutes, $seconds seconds"
|
DUR_STRING="$minutes minutes, $seconds seconds"
|
||||||
else
|
else
|
||||||
DUR_STRING="$seconds seconds"
|
DUR_STRING="$seconds seconds"
|
||||||
@ -172,192 +135,115 @@ fmt_duration()
|
|||||||
|
|
||||||
FIRST=true
|
FIRST=true
|
||||||
TOTAL_WCOP=
|
TOTAL_WCOP=
|
||||||
TOTAL_LAST_FIND=0
|
TOTAL_LAST_PATH=0
|
||||||
|
|
||||||
|
for i in `find . -maxdepth 2 -iname fuzzer_stats | sort`; do
|
||||||
|
|
||||||
|
sed 's/^command_line.*$/_skip:1/;s/[ ]*:[ ]*/="/;s/$/"/' "$i" >"$TMP"
|
||||||
|
. "$TMP"
|
||||||
|
|
||||||
|
RUN_UNIX=$run_time
|
||||||
|
RUN_DAYS=$((RUN_UNIX / 60 / 60 / 24))
|
||||||
|
RUN_HRS=$(((RUN_UNIX / 60 / 60) % 24))
|
||||||
|
|
||||||
|
test -n "$cycles_wo_finds" && {
|
||||||
|
test -z "$FIRST" && TOTAL_WCOP="${TOTAL_WCOP}/"
|
||||||
|
TOTAL_WCOP="${TOTAL_WCOP}${cycles_wo_finds}"
|
||||||
|
FIRST=
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$SUMMARY_ONLY" = "" ]; then
|
||||||
|
|
||||||
|
echo ">>> $afl_banner ($RUN_DAYS days, $RUN_HRS hrs) fuzzer PID: $fuzzer_pid <<<"
|
||||||
|
echo
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! kill -0 "$fuzzer_pid" 2>/dev/null; then
|
||||||
|
|
||||||
for j in `find . -maxdepth 2 -iname fuzzer_setup | sort`; do
|
|
||||||
|
|
||||||
DIR=$(dirname "$j")
|
|
||||||
i=$DIR/fuzzer_stats
|
|
||||||
|
|
||||||
if [ -f "$i" ]; then
|
|
||||||
|
|
||||||
sed 's/^command_line.*$/_skip:1/;s/[ ]*:[ ]*/="/;s/$/"/' "$i" >"$TMP"
|
|
||||||
. "$TMP"
|
|
||||||
DIRECTORY=$DIR
|
|
||||||
DIR=${DIR##*/}
|
|
||||||
RUN_UNIX=$run_time
|
|
||||||
RUN_DAYS=$((RUN_UNIX / 60 / 60 / 24))
|
|
||||||
RUN_HRS=$(((RUN_UNIX / 60 / 60) % 24))
|
|
||||||
COVERAGE=$(echo $bitmap_cvg|tr -d %)
|
|
||||||
if [ -n "$TOTAL_COVERAGE" -a -n "$COVERAGE" -a -n "$BC" ]; then
|
|
||||||
if [ "$(echo "$TOTAL_COVERAGE < $COVERAGE" | bc)" -eq 1 ]; then
|
|
||||||
TOTAL_COVERAGE=$COVERAGE
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [ -z "$TOTAL_COVERAGE" ]; then TOTAL_COVERAGE=$COVERAGE ; fi
|
|
||||||
|
|
||||||
test -n "$cycles_wo_finds" && {
|
|
||||||
test -z "$FIRST" && TOTAL_WCOP="${TOTAL_WCOP}/"
|
|
||||||
TOTAL_WCOP="${TOTAL_WCOP}${cycles_wo_finds}"
|
|
||||||
FIRST=
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ "$SUMMARY_ONLY" = "" ]; then
|
if [ "$SUMMARY_ONLY" = "" ]; then
|
||||||
|
|
||||||
echo ">>> $afl_banner instance: $DIR ($RUN_DAYS days, $RUN_HRS hrs) fuzzer PID: $fuzzer_pid <<<"
|
echo " Instance is dead or running remotely, skipping."
|
||||||
echo
|
echo
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! kill -0 "$fuzzer_pid" 2>/dev/null; then
|
|
||||||
|
|
||||||
IS_STARTING=
|
|
||||||
IS_DEAD=
|
|
||||||
|
|
||||||
if [ -e "$i" ] && [ -e "$j" ] && [ -n "$FUSER" ]; then
|
|
||||||
|
|
||||||
if [ "$i" -ot "$j" ]; then
|
|
||||||
|
|
||||||
# fuzzer_setup is newer than fuzzer_stats, maybe the instance is starting?
|
|
||||||
TMP_PID=`fuser -v "$DIRECTORY" 2>&1 | grep afl-fuzz`
|
|
||||||
|
|
||||||
if [ -n "$TMP_PID" ]; then
|
|
||||||
|
|
||||||
if [ "$SUMMARY_ONLY" = "" ]; then
|
|
||||||
|
|
||||||
echo " Instance is still starting up, skipping."
|
|
||||||
echo
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
START_CNT=$((START_CNT + 1))
|
|
||||||
last_find=0
|
|
||||||
IS_STARTING=1
|
|
||||||
|
|
||||||
if [ "$PROCESS_DEAD" = "" ]; then
|
|
||||||
|
|
||||||
continue
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$IS_STARTING" ]; then
|
|
||||||
|
|
||||||
if [ "$SUMMARY_ONLY" = "" ]; then
|
|
||||||
|
|
||||||
echo " Instance is dead or running remotely, skipping."
|
|
||||||
echo
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
DEAD_CNT=$((DEAD_CNT + 1))
|
|
||||||
IS_DEAD=1
|
|
||||||
last_find=0
|
|
||||||
|
|
||||||
if [ "$PROCESS_DEAD" = "" ]; then
|
|
||||||
|
|
||||||
continue
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
ALIVE_CNT=$((ALIVE_CNT + 1))
|
|
||||||
|
|
||||||
EXEC_SEC=0
|
|
||||||
test -z "$RUN_UNIX" -o "$RUN_UNIX" = 0 || EXEC_SEC=$((execs_done / RUN_UNIX))
|
|
||||||
PATH_PERC=$((cur_item * 100 / corpus_count))
|
|
||||||
|
|
||||||
TOTAL_TIME=$((TOTAL_TIME + RUN_UNIX))
|
|
||||||
TOTAL_EPS=$((TOTAL_EPS + EXEC_SEC))
|
|
||||||
TOTAL_EXECS=$((TOTAL_EXECS + execs_done))
|
|
||||||
TOTAL_CRASHES=$((TOTAL_CRASHES + saved_crashes))
|
|
||||||
TOTAL_HANGS=$((TOTAL_HANGS + saved_hangs))
|
|
||||||
TOTAL_PENDING=$((TOTAL_PENDING + pending_total))
|
|
||||||
TOTAL_PFAV=$((TOTAL_PFAV + pending_favs))
|
|
||||||
|
|
||||||
if [ "$last_find" -gt "$TOTAL_LAST_FIND" ]; then
|
|
||||||
TOTAL_LAST_FIND=$last_find
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$SUMMARY_ONLY" = "" ]; then
|
|
||||||
|
|
||||||
# Warnings in red
|
|
||||||
TIMEOUT_PERC=$((exec_timeout * 100 / execs_done))
|
|
||||||
if [ $TIMEOUT_PERC -ge 10 ]; then
|
|
||||||
echo " ${RED}timeout_ratio $TIMEOUT_PERC%${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $EXEC_SEC -eq 0 ]; then
|
|
||||||
echo " ${YELLOW}no data yet, 0 execs/sec${NC}"
|
|
||||||
elif [ $EXEC_SEC -lt 100 ]; then
|
|
||||||
echo " ${RED}slow execution, $EXEC_SEC execs/sec${NC}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
fmt_duration $last_find && FMT_FIND=$DUR_STRING
|
|
||||||
fmt_duration $last_crash && FMT_CRASH=$DUR_STRING
|
|
||||||
fmt_duration $last_hang && FMT_HANG=$DUR_STRING
|
|
||||||
FMT_CWOP="not available"
|
|
||||||
test -n "$cycles_wo_finds" && {
|
|
||||||
test "$cycles_wo_finds" = 0 && FMT_CWOP="$cycles_wo_finds"
|
|
||||||
test "$cycles_wo_finds" -gt 10 && FMT_CWOP="${YELLOW}$cycles_wo_finds${NC}"
|
|
||||||
test "$cycles_wo_finds" -gt 50 && FMT_CWOP="${RED}$cycles_wo_finds${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
echo " last_find : $FMT_FIND"
|
|
||||||
echo " last_crash : $FMT_CRASH"
|
|
||||||
if [ -z "$MINIMAL_ONLY" ]; then
|
|
||||||
echo " last_hang : $FMT_HANG"
|
|
||||||
echo " cycles_wo_finds : $FMT_CWOP"
|
|
||||||
fi
|
|
||||||
echo " coverage : $COVERAGE%"
|
|
||||||
|
|
||||||
if [ -z "$MINIMAL_ONLY" ]; then
|
|
||||||
|
|
||||||
CPU_USAGE=$(ps aux | grep -w $fuzzer_pid | grep -v grep | awk '{print $3}')
|
|
||||||
MEM_USAGE=$(ps aux | grep -w $fuzzer_pid | grep -v grep | awk '{print $4}')
|
|
||||||
|
|
||||||
echo " cpu usage $CPU_USAGE%, memory usage $MEM_USAGE%"
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo " cycles $((cycles_done + 1)), lifetime speed $EXEC_SEC execs/sec, items $cur_item/$corpus_count (${PATH_PERC}%)"
|
|
||||||
|
|
||||||
if [ "$saved_crashes" = "0" ]; then
|
|
||||||
echo " pending $pending_favs/$pending_total, coverage $bitmap_cvg, no crashes yet"
|
|
||||||
else
|
|
||||||
echo " pending $pending_favs/$pending_total, coverage $bitmap_cvg, crashes saved $saved_crashes (!)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
else
|
DEAD_CNT=$((DEAD_CNT + 1))
|
||||||
|
last_path=0
|
||||||
|
|
||||||
if [ ! -e "$i" -a -e "$j" ]; then
|
if [ "$PROCESS_DEAD" = "" ]; then
|
||||||
|
|
||||||
|
continue
|
||||||
|
|
||||||
if [ '!' "$PROCESS_DEAD" = "" ]; then
|
|
||||||
ALIVE_CNT=$((ALIVE_CNT + 1))
|
|
||||||
fi
|
|
||||||
START_CNT=$((START_CNT + 1))
|
|
||||||
last_find=0
|
|
||||||
IS_STARTING=1
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
ALIVE_CNT=$((ALIVE_CNT + 1))
|
||||||
|
|
||||||
|
EXEC_SEC=0
|
||||||
|
test -z "$RUN_UNIX" -o "$RUN_UNIX" = 0 || EXEC_SEC=$((execs_done / RUN_UNIX))
|
||||||
|
PATH_PERC=$((cur_path * 100 / paths_total))
|
||||||
|
|
||||||
|
TOTAL_TIME=$((TOTAL_TIME + RUN_UNIX))
|
||||||
|
TOTAL_EPS=$((TOTAL_EPS + EXEC_SEC))
|
||||||
|
TOTAL_EXECS=$((TOTAL_EXECS + execs_done))
|
||||||
|
TOTAL_CRASHES=$((TOTAL_CRASHES + unique_crashes))
|
||||||
|
TOTAL_PENDING=$((TOTAL_PENDING + pending_total))
|
||||||
|
TOTAL_PFAV=$((TOTAL_PFAV + pending_favs))
|
||||||
|
|
||||||
|
if [ "$last_path" -gt "$TOTAL_LAST_PATH" ]; then
|
||||||
|
TOTAL_LAST_PATH=$last_path
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$SUMMARY_ONLY" = "" ]; then
|
||||||
|
|
||||||
|
# Warnings in red
|
||||||
|
TIMEOUT_PERC=$((exec_timeout * 100 / execs_done))
|
||||||
|
if [ $TIMEOUT_PERC -ge 10 ]; then
|
||||||
|
echo " ${RED}timeout_ratio $TIMEOUT_PERC%${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $EXEC_SEC -eq 0 ]; then
|
||||||
|
echo " ${YELLOW}no data yet, 0 execs/sec${NC}"
|
||||||
|
elif [ $EXEC_SEC -lt 100 ]; then
|
||||||
|
echo " ${RED}slow execution, $EXEC_SEC execs/sec${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
fmt_duration $last_path && FMT_PATH=$DUR_STRING
|
||||||
|
fmt_duration $last_crash && FMT_CRASH=$DUR_STRING
|
||||||
|
fmt_duration $last_hang && FMT_HANG=$DUR_STRING
|
||||||
|
FMT_CWOP="not available"
|
||||||
|
test -n "$cycles_wo_finds" && {
|
||||||
|
test "$cycles_wo_finds" = 0 && FMT_CWOP="$cycles_wo_finds"
|
||||||
|
test "$cycles_wo_finds" -gt 10 && FMT_CWOP="${YELLOW}$cycles_wo_finds${NC}"
|
||||||
|
test "$cycles_wo_finds" -gt 50 && FMT_CWOP="${RED}$cycles_wo_finds${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo " last_path : $FMT_PATH"
|
||||||
|
echo " last_crash : $FMT_CRASH"
|
||||||
|
echo " last_hang : $FMT_HANG"
|
||||||
|
echo " cycles_wo_finds : $FMT_CWOP"
|
||||||
|
|
||||||
|
CPU_USAGE=$(ps aux | grep $fuzzer_pid | grep -v grep | awk '{print $3}')
|
||||||
|
MEM_USAGE=$(ps aux | grep $fuzzer_pid | grep -v grep | awk '{print $4}')
|
||||||
|
|
||||||
|
echo " cpu usage $CPU_USAGE%, memory usage $MEM_USAGE%"
|
||||||
|
echo " cycle $((cycles_done + 1)), lifetime speed $EXEC_SEC execs/sec, path $cur_path/$paths_total (${PATH_PERC}%)"
|
||||||
|
|
||||||
|
if [ "$unique_crashes" = "0" ]; then
|
||||||
|
echo " pending $pending_favs/$pending_total, coverage $bitmap_cvg, no crashes yet"
|
||||||
|
else
|
||||||
|
echo " pending $pending_favs/$pending_total, coverage $bitmap_cvg, crash count $unique_crashes (!)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# Formatting for total time, time since last find, crash, and hang
|
# Formatting for total time, time since last path, crash, and hang
|
||||||
fmt_duration $((CUR_TIME - TOTAL_TIME)) && FMT_TIME=$DUR_STRING
|
fmt_duration $((CUR_TIME - TOTAL_TIME)) && FMT_TIME=$DUR_STRING
|
||||||
# Formatting for total execution
|
# Formatting for total execution
|
||||||
FMT_EXECS="0 millions"
|
FMT_EXECS="0 millions"
|
||||||
@ -365,7 +251,7 @@ EXECS_MILLION=$((TOTAL_EXECS / 1000 / 1000))
|
|||||||
EXECS_THOUSAND=$((TOTAL_EXECS / 1000 % 1000))
|
EXECS_THOUSAND=$((TOTAL_EXECS / 1000 % 1000))
|
||||||
if [ $EXECS_MILLION -gt 9 ]; then
|
if [ $EXECS_MILLION -gt 9 ]; then
|
||||||
FMT_EXECS="$EXECS_MILLION millions"
|
FMT_EXECS="$EXECS_MILLION millions"
|
||||||
elif [ $EXECS_MILLION -gt 0 ]; then
|
elif [ $EXECS_MILLION -gt 0 ]; then
|
||||||
FMT_EXECS="$EXECS_MILLION millions, $EXECS_THOUSAND thousands"
|
FMT_EXECS="$EXECS_MILLION millions, $EXECS_THOUSAND thousands"
|
||||||
else
|
else
|
||||||
FMT_EXECS="$EXECS_THOUSAND thousands"
|
FMT_EXECS="$EXECS_THOUSAND thousands"
|
||||||
@ -377,62 +263,45 @@ TOTAL_DAYS=$((TOTAL_TIME / 60 / 60 / 24))
|
|||||||
TOTAL_HRS=$(((TOTAL_TIME / 60 / 60) % 24))
|
TOTAL_HRS=$(((TOTAL_TIME / 60 / 60) % 24))
|
||||||
|
|
||||||
test -z "$TOTAL_WCOP" && TOTAL_WCOP="not available"
|
test -z "$TOTAL_WCOP" && TOTAL_WCOP="not available"
|
||||||
fmt_duration $TOTAL_LAST_FIND && TOTAL_LAST_FIND=$DUR_STRING
|
fmt_duration $TOTAL_LAST_PATH && TOTAL_LAST_PATH=$DUR_STRING
|
||||||
|
|
||||||
test "$TOTAL_TIME" = "0" && TOTAL_TIME=1
|
test "$TOTAL_TIME" = "0" && TOTAL_TIME=1
|
||||||
|
|
||||||
if [ "$PROCESS_DEAD" = "" ]; then
|
if [ "$PROCESS_DEAD" = "" ]; then
|
||||||
|
|
||||||
TXT="excluded from stats"
|
TXT="excluded from stats"
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
TXT="included in stats"
|
TXT="included in stats"
|
||||||
ALIVE_CNT=$(($ALIVE_CNT - $DEAD_CNT - $START_CNT))
|
ALIVE_CNT=$(($ALIVE_CNT - $DEAD_CNT))
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Summary stats"
|
echo "Summary stats"
|
||||||
echo "============="
|
echo "============="
|
||||||
if [ -z "$SUMMARY_ONLY" -o -z "$MINIMAL_ONLY" ]; then
|
echo
|
||||||
echo
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo " Fuzzers alive : $ALIVE_CNT"
|
echo " Fuzzers alive : $ALIVE_CNT"
|
||||||
|
|
||||||
if [ ! "$START_CNT" = "0" ]; then
|
|
||||||
echo " Starting up : $START_CNT ($TXT)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! "$DEAD_CNT" = "0" ]; then
|
if [ ! "$DEAD_CNT" = "0" ]; then
|
||||||
echo " Dead or remote : $DEAD_CNT ($TXT)"
|
echo " Dead or remote : $DEAD_CNT ($TXT)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo " Total run time : $FMT_TIME"
|
echo " Total run time : $FMT_TIME"
|
||||||
if [ -z "$MINIMAL_ONLY" ]; then
|
echo " Total execs : $FMT_EXECS"
|
||||||
echo " Total execs : $FMT_EXECS"
|
echo " Cumulative speed : $TOTAL_EPS execs/sec"
|
||||||
echo " Cumulative speed : $TOTAL_EPS execs/sec"
|
|
||||||
fi
|
|
||||||
if [ "$ALIVE_CNT" -gt "0" ]; then
|
if [ "$ALIVE_CNT" -gt "0" ]; then
|
||||||
echo " Average speed : $((TOTAL_EPS / ALIVE_CNT)) execs/sec"
|
echo " Average speed : $((TOTAL_EPS / ALIVE_CNT)) execs/sec"
|
||||||
fi
|
fi
|
||||||
if [ -z "$MINIMAL_ONLY" ]; then
|
echo " Pending paths : $TOTAL_PFAV faves, $TOTAL_PENDING total"
|
||||||
echo " Pending items : $TOTAL_PFAV faves, $TOTAL_PENDING total"
|
|
||||||
|
if [ "$ALIVE_CNT" -gt "1" ]; then
|
||||||
|
echo " Pending per fuzzer : $((TOTAL_PFAV/ALIVE_CNT)) faves, $((TOTAL_PENDING/ALIVE_CNT)) total (on average)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$ALIVE_CNT" -gt "1" -o -n "$MINIMAL_ONLY" ]; then
|
echo " Crashes found : $TOTAL_CRASHES locally unique"
|
||||||
if [ "$ALIVE_CNT" -gt "0" ]; then
|
echo "Cycles without finds : $TOTAL_WCOP"
|
||||||
echo " Pending per fuzzer : $((TOTAL_PFAV/ALIVE_CNT)) faves, $((TOTAL_PENDING/ALIVE_CNT)) total (on average)"
|
echo " Time without finds : $TOTAL_LAST_PATH"
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo " Coverage reached : ${TOTAL_COVERAGE}%"
|
|
||||||
echo " Crashes saved : $TOTAL_CRASHES"
|
|
||||||
if [ -z "$MINIMAL_ONLY" ]; then
|
|
||||||
echo " Hangs saved : $TOTAL_HANGS"
|
|
||||||
echo "Cycles without finds : $TOTAL_WCOP"
|
|
||||||
fi
|
|
||||||
echo " Time without finds : $TOTAL_LAST_FIND"
|
|
||||||
echo
|
echo
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
CPU | MHz | threads | singlecore | multicore | afl-*-config |
|
|
||||||
====================================================|=======|=========|============|===========|==============|
|
|
||||||
Raspberry Pi 5 | 2400 | 4 | 25786 | 101114 | both |
|
|
||||||
AMD EPYC 7282 16-Core Processor | 3194 | 32 | 87199 | 769001 | both |
|
|
||||||
AMD Ryzen 5 PRO 4650G with Radeon Graphics | 3700 | 12 | 95356 | 704840 | both |
|
|
||||||
Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz | 4995 | 16 | 120064 | 1168943 | both |
|
|
||||||
12th Gen Intel(R) Core(TM) i7-1270P | 4761 | 16 | 149778 | 641219 | both |
|
|
||||||
AMD Ryzen 9 5950X 16-Core Processor | 4792 | 32 | 161690 | 2339763 | both |
|
|
||||||
Apple Mac Studio M2 Ultra 2023, Linux VM guest | 3500 | 16 | 163570 | 1157465 | both |
|
|
@ -1,59 +0,0 @@
|
|||||||
# American Fuzzy Lop plus plus (AFL++)
|
|
||||||
|
|
||||||
## benchmarking
|
|
||||||
|
|
||||||
This directory contains benchmarking tools that allow you to compare one machine
|
|
||||||
with another in terms of raw ability to execute a fuzzing target repeatedly.
|
|
||||||
|
|
||||||
To achieve this, we use a sample program ("test-instr.c") where each path is
|
|
||||||
equally likely, supply it a single seed, and tell AFL to exit after one run of
|
|
||||||
deterministic mutations against that seed.
|
|
||||||
|
|
||||||
**Note that this is not a real-world scenario!**
|
|
||||||
Because the target does basically nothing this is rather a stress test on
|
|
||||||
Kernel I/O / context switching.
|
|
||||||
For this reason you will not see a difference if you run the multicore test
|
|
||||||
with 20 or 40 threads - or even see the performance decline the more threads
|
|
||||||
(`-f` parameter) you use. In a real-world scenario you can expect to gain
|
|
||||||
exec/s until 40-60 threads (if you have that many available on your CPU).
|
|
||||||
|
|
||||||
Usage example:
|
|
||||||
|
|
||||||
```
|
|
||||||
cd aflplusplus/benchmark
|
|
||||||
python3 benchmark.py
|
|
||||||
[*] Ready, starting benchmark...
|
|
||||||
[*] Compiling the test-instr-persist-shmem fuzzing harness for the benchmark to use.
|
|
||||||
[*] singlecore test-instr-persist-shmem run 1 of 2, execs/s: 124883.62
|
|
||||||
[*] singlecore test-instr-persist-shmem run 2 of 2, execs/s: 126704.93
|
|
||||||
[*] Average execs/sec for this test across all runs was: 125794.28
|
|
||||||
[*] Using 16 fuzzers for multicore fuzzing (use --fuzzers to override).
|
|
||||||
[*] multicore test-instr-persist-shmem run 1 of 2, execs/s: 1179822.66
|
|
||||||
[*] multicore test-instr-persist-shmem run 2 of 2, execs/s: 1175584.09
|
|
||||||
[*] Average execs/sec for this test across all runs was: 1177703.38
|
|
||||||
[*] Results have been written to the benchmark-results.jsonl file.
|
|
||||||
[*] Results have been written to the COMPARISON.md file.
|
|
||||||
```
|
|
||||||
|
|
||||||
By default, the script will use a number of parallel fuzzers equal to your
|
|
||||||
available CPUs/threads (change with `--fuzzers`), and will perform each test
|
|
||||||
three times and average the result (change with `--runs`).
|
|
||||||
|
|
||||||
The script will use multicore fuzzing instead of singlecore by default (change
|
|
||||||
with `--mode singlecore`) and use a persistent-mode shared memory harness for
|
|
||||||
optimal speed (change with `--target test-instr`).
|
|
||||||
|
|
||||||
Feel free to submit the resulting line for your CPU added to the COMPARISON.md
|
|
||||||
and benchmark-results.jsonl files back to AFL++ in a pull request.
|
|
||||||
|
|
||||||
Each run writes results to [benchmark-results.jsonl](benchmark-results.jsonl)
|
|
||||||
in [JSON Lines](https://jsonlines.org/) format, ready to be pulled in to other
|
|
||||||
tools such as [jq -cs](https://jqlang.github.io/jq/) or
|
|
||||||
[pandas](https://pandas.pydata.org/) for analysis.
|
|
||||||
|
|
||||||
## Data analysis
|
|
||||||
|
|
||||||
There is sample data in [benchmark-results.jsonl](benchmark-results.jsonl), and
|
|
||||||
a Jupyter notebook for exploring the results and suggesting their meaning at
|
|
||||||
[benchmark.ipynb](benchmark.ipynb).
|
|
||||||
|
|
@ -1,420 +0,0 @@
|
|||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4788.77, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"singlecore": {"execs_per_sec": 9845.64, "execs_total": 98545, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4989.281, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"singlecore": {"execs_per_sec": 125682.73, "execs_total": 1257330, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4799.415, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 120293.77, "execs_total": 1203058, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4703.293, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 231429.96, "execs_total": 2314531, "fuzzers_used": 2}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4800.375, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 346759.33, "execs_total": 3468290, "fuzzers_used": 3}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4915.27, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 455340.06, "execs_total": 4554427, "fuzzers_used": 4}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4701.051, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 568405.15, "execs_total": 5685076, "fuzzers_used": 5}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4704.999, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 678030.96, "execs_total": 6781781, "fuzzers_used": 6}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4800.438, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 782585.04, "execs_total": 7827974, "fuzzers_used": 7}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4794.851, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 893618.35, "execs_total": 8938405, "fuzzers_used": 8}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.383, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 956026.15, "execs_total": 9562791, "fuzzers_used": 9}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.352, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 984942.13, "execs_total": 9853724, "fuzzers_used": 10}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4987.681, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1016758.62, "execs_total": 10172892, "fuzzers_used": 11}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.196, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1053087.9, "execs_total": 10536439, "fuzzers_used": 12}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.211, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1085797.87, "execs_total": 10865305, "fuzzers_used": 13}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.577, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1110640.2, "execs_total": 11114033, "fuzzers_used": 14}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4799.955, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1138984.22, "execs_total": 11397389, "fuzzers_used": 15}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.247, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1168943.19, "execs_total": 11699439, "fuzzers_used": 16}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4994.207, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1135093.91, "execs_total": 11360219, "fuzzers_used": 17}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4994.47, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1160430.45, "execs_total": 11614570, "fuzzers_used": 18}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4991.188, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1155769.97, "execs_total": 11569540, "fuzzers_used": 19}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.63, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1150156.26, "execs_total": 11509407, "fuzzers_used": 20}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.227, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1136873.58, "execs_total": 11377110, "fuzzers_used": 21}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.317, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1112404.25, "execs_total": 11134086, "fuzzers_used": 22}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5000.851, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1143131.72, "execs_total": 11440024, "fuzzers_used": 23}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.261, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1143931.38, "execs_total": 11448786, "fuzzers_used": 24}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.259, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1102090.61, "execs_total": 11028561, "fuzzers_used": 25}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.149, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1116518.7, "execs_total": 11172681, "fuzzers_used": 26}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4801.01, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1099224.19, "execs_total": 11000537, "fuzzers_used": 27}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.448, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1114945.37, "execs_total": 11158802, "fuzzers_used": 28}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.663, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1110889.91, "execs_total": 11118113, "fuzzers_used": 29}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.741, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1058548.28, "execs_total": 10595540, "fuzzers_used": 30}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.852, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1119804.85, "execs_total": 11208645, "fuzzers_used": 31}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.417, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1118828.99, "execs_total": 11197813, "fuzzers_used": 32}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5000.682, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1093426.61, "execs_total": 10942324, "fuzzers_used": 33}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.248, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1108123.59, "execs_total": 11090315, "fuzzers_used": 34}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.053, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1041486.52, "execs_total": 10422413, "fuzzers_used": 35}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.299, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1092395.61, "execs_total": 10932107, "fuzzers_used": 36}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.081, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"singlecore": {"execs_per_sec": 8278.64, "execs_total": 82894, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4994.118, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 90641.62, "execs_total": 906960, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.588, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 178184.19, "execs_total": 1782109, "fuzzers_used": 2}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.204, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 262652.86, "execs_total": 2627228, "fuzzers_used": 3}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.829, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 339119.32, "execs_total": 3391956, "fuzzers_used": 4}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.205, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 420239.94, "execs_total": 4202989, "fuzzers_used": 5}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.0, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 498062.02, "execs_total": 4981367, "fuzzers_used": 6}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5000.407, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 578495.44, "execs_total": 5786691, "fuzzers_used": 7}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5002.997, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 661836.22, "execs_total": 6620265, "fuzzers_used": 8}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.952, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 684808.49, "execs_total": 6850000, "fuzzers_used": 9}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.99, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 707094.65, "execs_total": 7074048, "fuzzers_used": 10}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.003, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 732106.17, "execs_total": 7325352, "fuzzers_used": 11}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.488, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 752910.17, "execs_total": 7533775, "fuzzers_used": 12}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5003.679, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 776179.85, "execs_total": 7767507, "fuzzers_used": 13}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.45, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 797520.58, "execs_total": 7981534, "fuzzers_used": 14}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.313, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 822235.41, "execs_total": 8228941, "fuzzers_used": 15}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.723, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 843897.51, "execs_total": 8445693, "fuzzers_used": 16}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.488, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 843177.15, "execs_total": 8438493, "fuzzers_used": 17}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.299, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 844779.09, "execs_total": 8456834, "fuzzers_used": 18}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.662, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 846060.74, "execs_total": 8465728, "fuzzers_used": 19}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.922, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 847556.23, "execs_total": 8482537, "fuzzers_used": 20}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.098, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 844022.97, "execs_total": 8447616, "fuzzers_used": 21}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.352, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 845818.7, "execs_total": 8464237, "fuzzers_used": 22}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.457, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 844118.27, "execs_total": 8448858, "fuzzers_used": 23}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.019, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 837189.02, "execs_total": 8379746, "fuzzers_used": 24}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.513, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 834712.31, "execs_total": 8354719, "fuzzers_used": 25}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.891, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 836344.12, "execs_total": 8370166, "fuzzers_used": 26}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.494, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 827784.91, "execs_total": 8283782, "fuzzers_used": 27}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.761, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 828641.27, "execs_total": 8293602, "fuzzers_used": 28}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.115, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 826123.67, "execs_total": 8268211, "fuzzers_used": 29}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4993.515, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 817765.77, "execs_total": 8184720, "fuzzers_used": 30}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.555, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 816556.66, "execs_total": 8171816, "fuzzers_used": 31}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.999, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 812661.77, "execs_total": 8132767, "fuzzers_used": 32}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.561, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 805352.16, "execs_total": 8060482, "fuzzers_used": 33}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.938, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 815888.26, "execs_total": 8164454, "fuzzers_used": 34}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.951, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 812348.56, "execs_total": 8129441, "fuzzers_used": 35}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4999.444, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 817278.03, "execs_total": 8178918, "fuzzers_used": 36}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.133, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 91247.98, "execs_total": 912571, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.029, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 177503.74, "execs_total": 1775569, "fuzzers_used": 2}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.516, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 263559.94, "execs_total": 2635863, "fuzzers_used": 3}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.946, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 339880.84, "execs_total": 3399660, "fuzzers_used": 4}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.539, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 418569.46, "execs_total": 4186780, "fuzzers_used": 5}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.53, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 496208.2, "execs_total": 4962992, "fuzzers_used": 6}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.015, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 580870.62, "execs_total": 5809953, "fuzzers_used": 7}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.662, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 662910.24, "execs_total": 6631172, "fuzzers_used": 8}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.8, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 683654.43, "execs_total": 6838092, "fuzzers_used": 9}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.849, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 707555.71, "execs_total": 7078261, "fuzzers_used": 10}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5007.628, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 732211.35, "execs_total": 7325661, "fuzzers_used": 11}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4981.601, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 756121.92, "execs_total": 7565074, "fuzzers_used": 12}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.041, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 774101.97, "execs_total": 7745053, "fuzzers_used": 13}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5004.554, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 796439.54, "execs_total": 7972225, "fuzzers_used": 14}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.433, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 822652.36, "execs_total": 8232836, "fuzzers_used": 15}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.063, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 846458.67, "execs_total": 8473949, "fuzzers_used": 16}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.85, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 847285.31, "execs_total": 8479183, "fuzzers_used": 17}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.627, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 847278.34, "execs_total": 8481577, "fuzzers_used": 18}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5002.007, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 849345.2, "execs_total": 8500890, "fuzzers_used": 19}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.497, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 848498.04, "execs_total": 8491840, "fuzzers_used": 20}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.084, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 848737.28, "execs_total": 8494747, "fuzzers_used": 21}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.872, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 847610.49, "execs_total": 8484864, "fuzzers_used": 22}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.036, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 846329.82, "execs_total": 8471670, "fuzzers_used": 23}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.731, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 839140.26, "execs_total": 8397496, "fuzzers_used": 24}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4988.743, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 843648.98, "execs_total": 8444091, "fuzzers_used": 25}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5004.084, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 835215.19, "execs_total": 8359949, "fuzzers_used": 26}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.828, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 833416.5, "execs_total": 8340275, "fuzzers_used": 27}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.795, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 826512.71, "execs_total": 8272574, "fuzzers_used": 28}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.022, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 828656.04, "execs_total": 8292856, "fuzzers_used": 29}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.939, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 823292.55, "execs_total": 8239885, "fuzzers_used": 30}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.233, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 824657.95, "execs_total": 8252812, "fuzzers_used": 31}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.909, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 817807.44, "execs_total": 8183838, "fuzzers_used": 32}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.834, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 815344.89, "execs_total": 8160193, "fuzzers_used": 33}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.968, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 814327.97, "execs_total": 8149984, "fuzzers_used": 34}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.625, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 819612.64, "execs_total": 8202605, "fuzzers_used": 35}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.404, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 813155.19, "execs_total": 8137546, "fuzzers_used": 36}}}}
|
|
||||||
{"config": {"afl_persistent_config": false, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5001.911, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"singlecore": {"execs_per_sec": 8391.52, "execs_total": 83932, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4980.444, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"singlecore": {"execs_per_sec": 10754.79, "execs_total": 107720, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 5000.011, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 126201.28, "execs_total": 1262139, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4993.941, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 245701.79, "execs_total": 2457750, "fuzzers_used": 2}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4983.297, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 361167.18, "execs_total": 3612273, "fuzzers_used": 3}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4994.008, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 475221.97, "execs_total": 4752815, "fuzzers_used": 4}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.977, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 586393.43, "execs_total": 5865460, "fuzzers_used": 5}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.97, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 690946.36, "execs_total": 6910846, "fuzzers_used": 6}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.017, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 801029.31, "execs_total": 8011774, "fuzzers_used": 7}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.617, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 913876.89, "execs_total": 9140715, "fuzzers_used": 8}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.997, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 946293.38, "execs_total": 9464848, "fuzzers_used": 9}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.162, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 980031.45, "execs_total": 9803628, "fuzzers_used": 10}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4994.223, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1015241.63, "execs_total": 10157948, "fuzzers_used": 11}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4994.761, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1042290.69, "execs_total": 10427527, "fuzzers_used": 12}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.045, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1073567.99, "execs_total": 10739590, "fuzzers_used": 13}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.484, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1119312.88, "execs_total": 11199130, "fuzzers_used": 14}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4994.729, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1156363.75, "execs_total": 11573213, "fuzzers_used": 15}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.146, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1183713.3, "execs_total": 11848245, "fuzzers_used": 16}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.048, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1187603.56, "execs_total": 11886825, "fuzzers_used": 17}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4986.845, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1190369.21, "execs_total": 11914954, "fuzzers_used": 18}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4985.364, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1188828.6, "execs_total": 11902947, "fuzzers_used": 19}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.108, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1187617.46, "execs_total": 11887934, "fuzzers_used": 20}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.754, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1188490.16, "execs_total": 11894967, "fuzzers_used": 21}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.129, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1184138.92, "execs_total": 11850653, "fuzzers_used": 22}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.048, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1189374.23, "execs_total": 11903803, "fuzzers_used": 23}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.261, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1178947.43, "execs_total": 11800850, "fuzzers_used": 24}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.422, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1173540.28, "execs_total": 11743120, "fuzzers_used": 25}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.909, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1168471.78, "execs_total": 11696401, "fuzzers_used": 26}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4966.966, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1169320.61, "execs_total": 11703900, "fuzzers_used": 27}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.207, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1165434.17, "execs_total": 11661131, "fuzzers_used": 28}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4999.554, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1161113.26, "execs_total": 11619771, "fuzzers_used": 29}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4994.822, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1155066.44, "execs_total": 11560147, "fuzzers_used": 30}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.061, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1145196.35, "execs_total": 11461349, "fuzzers_used": 31}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.006, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1151794.28, "execs_total": 11526764, "fuzzers_used": 32}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4995.939, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1151652.84, "execs_total": 11526720, "fuzzers_used": 33}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.002, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1153215.56, "execs_total": 11539780, "fuzzers_used": 34}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.456, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1146882.5, "execs_total": 11478112, "fuzzers_used": 35}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": false, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.183, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1155253.95, "execs_total": 11561694, "fuzzers_used": 36}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4848.974, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 10714.79, "execs_total": 107180, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.353, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 20493.07, "execs_total": 205279, "fuzzers_used": 2}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.198, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 29660.06, "execs_total": 297006, "fuzzers_used": 3}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.015, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 37875.57, "execs_total": 379078, "fuzzers_used": 4}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.975, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 46326.75, "execs_total": 463731, "fuzzers_used": 5}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.579, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 54595.48, "execs_total": 546283, "fuzzers_used": 6}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4983.814, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 62720.98, "execs_total": 628151, "fuzzers_used": 7}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.617, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 70777.99, "execs_total": 708505, "fuzzers_used": 8}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.286, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 74236.02, "execs_total": 743157, "fuzzers_used": 9}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4799.516, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 78134.94, "execs_total": 782272, "fuzzers_used": 10}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4911.536, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 81886.33, "execs_total": 819649, "fuzzers_used": 11}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.199, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 85923.44, "execs_total": 860033, "fuzzers_used": 12}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.447, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 89696.95, "execs_total": 897746, "fuzzers_used": 13}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.496, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 93540.52, "execs_total": 936217, "fuzzers_used": 14}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.936, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 97641.51, "execs_total": 977546, "fuzzers_used": 15}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4991.829, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 101692.65, "execs_total": 1017683, "fuzzers_used": 16}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.489, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 101236.75, "execs_total": 1013188, "fuzzers_used": 17}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.352, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 101006.28, "execs_total": 1011004, "fuzzers_used": 18}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4999.894, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 99952.26, "execs_total": 1000431, "fuzzers_used": 19}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4942.12, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 99798.64, "execs_total": 998795, "fuzzers_used": 20}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.686, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 99018.86, "execs_total": 991012, "fuzzers_used": 21}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.308, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 98600.87, "execs_total": 986643, "fuzzers_used": 22}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.683, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 98634.02, "execs_total": 987082, "fuzzers_used": 23}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.457, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 98352.9, "execs_total": 984071, "fuzzers_used": 24}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.733, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 98118.63, "execs_total": 981865, "fuzzers_used": 25}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4994.474, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 97752.45, "execs_total": 978192, "fuzzers_used": 26}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4853.378, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 97864.07, "execs_total": 979334, "fuzzers_used": 27}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.484, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 97821.8, "execs_total": 978814, "fuzzers_used": 28}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4996.738, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 97564.87, "execs_total": 976335, "fuzzers_used": 29}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.341, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 98508.1, "execs_total": 985853, "fuzzers_used": 30}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.773, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 98238.96, "execs_total": 983062, "fuzzers_used": 31}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.037, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 98363.93, "execs_total": 984411, "fuzzers_used": 32}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.448, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 96758.69, "execs_total": 968157, "fuzzers_used": 33}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.238, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 96327.0, "execs_total": 964046, "fuzzers_used": 34}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4997.619, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 95913.98, "execs_total": 959817, "fuzzers_used": 35}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "i9-9900k, 16GB DDR4-3000, Arch Linux", "compiler": "clang version 16.0.6", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4998.076, "cpu_model": "Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz", "cpu_threads": 16}, "targets": {"test-instr": {"multicore": {"execs_per_sec": 95871.39, "execs_total": 959318, "fuzzers_used": 36}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr": {"singlecore": {"execs_per_sec": 5741.89, "execs_total": 57505, "fuzzers_used": 1}}, "test-instr-persist-shmem": {"singlecore": {"execs_per_sec": 163570.34, "execs_total": 1635867, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 164224.43, "execs_total": 1642737, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 167222.58, "execs_total": 1672393, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 306547.24, "execs_total": 3065934, "fuzzers_used": 2}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 436010.2, "execs_total": 4360827, "fuzzers_used": 3}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 536415.92, "execs_total": 5365101, "fuzzers_used": 4}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 622104.43, "execs_total": 6222784, "fuzzers_used": 5}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 729436.2, "execs_total": 7295214, "fuzzers_used": 6}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 820258.88, "execs_total": 8203409, "fuzzers_used": 7}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 884746.31, "execs_total": 8848458, "fuzzers_used": 8}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 947308.55, "execs_total": 9474351, "fuzzers_used": 9}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 985953.62, "execs_total": 9860922, "fuzzers_used": 10}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1009716.71, "execs_total": 10098454, "fuzzers_used": 11}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1041437.1, "execs_total": 10415844, "fuzzers_used": 12}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1068180.17, "execs_total": 10683116, "fuzzers_used": 13}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1108873.82, "execs_total": 11089926, "fuzzers_used": 14}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1134135.0, "execs_total": 11354464, "fuzzers_used": 15}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1157465.79, "execs_total": 11582583, "fuzzers_used": 16}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1122785.14, "execs_total": 11235138, "fuzzers_used": 17}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1094132.3, "execs_total": 10950326, "fuzzers_used": 18}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1041102.04, "execs_total": 10420102, "fuzzers_used": 19}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1022474.0, "execs_total": 10236560, "fuzzers_used": 20}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 960681.48, "execs_total": 9618077, "fuzzers_used": 21}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 853680.22, "execs_total": 8545665, "fuzzers_used": 22}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 799719.75, "execs_total": 8005071, "fuzzers_used": 23}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 797512.71, "execs_total": 7983371, "fuzzers_used": 24}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 659476.15, "execs_total": 6601599, "fuzzers_used": 25}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 560625.96, "execs_total": 5612503, "fuzzers_used": 26}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 537839.62, "execs_total": 5381649, "fuzzers_used": 27}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 510072.53, "execs_total": 5106056, "fuzzers_used": 28}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 408667.49, "execs_total": 4091795, "fuzzers_used": 29}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 453849.79, "execs_total": 4542311, "fuzzers_used": 30}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 405935.72, "execs_total": 4064268, "fuzzers_used": 31}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 579312.77, "execs_total": 5798912, "fuzzers_used": 32}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 470961.79, "execs_total": 4715503, "fuzzers_used": 33}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 436380.3, "execs_total": 4368099, "fuzzers_used": 34}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 439819.17, "execs_total": 4405705, "fuzzers_used": 35}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "Apple Mac Studio M2 Ultra 2023, Linux VM guest, 16 threads assigned to VM", "compiler": "Ubuntu clang version 16.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3500.0, "cpu_model": "Apple Mac Studio M2 Ultra 2023", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 407460.31, "execs_total": 4084528, "fuzzers_used": 36}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3514.326, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 119469.35, "execs_total": 1194813, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.748, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 237177.2, "execs_total": 2372250, "fuzzers_used": 2}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3455.647, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 358305.9, "execs_total": 3583655, "fuzzers_used": 3}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.67, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 475974.21, "execs_total": 4760218, "fuzzers_used": 4}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.813, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 594372.12, "execs_total": 5944793, "fuzzers_used": 5}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3584.545, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 711732.18, "execs_total": 7118626, "fuzzers_used": 6}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.377, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 824314.1, "execs_total": 8245020, "fuzzers_used": 7}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.535, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 936358.89, "execs_total": 9365349, "fuzzers_used": 8}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3469.977, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1010050.77, "execs_total": 10102421, "fuzzers_used": 9}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.644, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1087333.72, "execs_total": 10875294, "fuzzers_used": 10}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3473.935, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1180500.37, "execs_total": 11807345, "fuzzers_used": 11}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3334.193, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1284695.8, "execs_total": 12849848, "fuzzers_used": 12}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3436.186, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1377659.89, "execs_total": 13779252, "fuzzers_used": 13}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.27, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1471828.49, "execs_total": 14721973, "fuzzers_used": 14}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3466.893, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1557812.41, "execs_total": 15581135, "fuzzers_used": 15}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3561.127, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1634678.08, "execs_total": 16349952, "fuzzers_used": 16}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.848, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1518908.2, "execs_total": 15192488, "fuzzers_used": 17}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3591.34, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1470513.71, "execs_total": 14709207, "fuzzers_used": 18}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.619, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1414625.05, "execs_total": 14156400, "fuzzers_used": 19}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.99, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1355481.53, "execs_total": 13565462, "fuzzers_used": 20}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.232, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1292684.55, "execs_total": 12934801, "fuzzers_used": 21}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3442.34, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1234478.66, "execs_total": 12352256, "fuzzers_used": 22}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.796, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1174550.37, "execs_total": 11752094, "fuzzers_used": 23}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3494.124, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1125218.66, "execs_total": 11258330, "fuzzers_used": 24}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3350.261, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 1022021.81, "execs_total": 10226548, "fuzzers_used": 25}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.929, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 990339.75, "execs_total": 9908883, "fuzzers_used": 26}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3484.153, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 953861.38, "execs_total": 9543479, "fuzzers_used": 27}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3393.24, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 942151.65, "execs_total": 9426176, "fuzzers_used": 28}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3434.881, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 927072.1, "execs_total": 9275954, "fuzzers_used": 29}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3444.453, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 908669.71, "execs_total": 9092225, "fuzzers_used": 30}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3442.593, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 893432.26, "execs_total": 8938840, "fuzzers_used": 31}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3380.389, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 876618.01, "execs_total": 8770325, "fuzzers_used": 32}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3586.135, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 834676.33, "execs_total": 8350992, "fuzzers_used": 33}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.956, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 830200.25, "execs_total": 8306463, "fuzzers_used": 34}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.94, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 821667.96, "execs_total": 8220135, "fuzzers_used": 35}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3591.052, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 829075.87, "execs_total": 8294543, "fuzzers_used": 36}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3573.541, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 814422.62, "execs_total": 8148191, "fuzzers_used": 37}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.902, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 806770.85, "execs_total": 8071030, "fuzzers_used": 38}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3488.496, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 794433.8, "execs_total": 7947600, "fuzzers_used": 39}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3470.314, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 781022.61, "execs_total": 7813248, "fuzzers_used": 40}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.761, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 754394.26, "execs_total": 7546321, "fuzzers_used": 41}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.125, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 763116.33, "execs_total": 7634125, "fuzzers_used": 42}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.437, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 759323.54, "execs_total": 7596118, "fuzzers_used": 43}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.079, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 764198.14, "execs_total": 7644920, "fuzzers_used": 44}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.619, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 757777.51, "execs_total": 7580317, "fuzzers_used": 45}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3425.09, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 749357.06, "execs_total": 7496189, "fuzzers_used": 46}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.567, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 732083.87, "execs_total": 7323543, "fuzzers_used": 47}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.365, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 721133.28, "execs_total": 7214084, "fuzzers_used": 48}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.699, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 658925.82, "execs_total": 6591967, "fuzzers_used": 49}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.889, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 659890.97, "execs_total": 6601888, "fuzzers_used": 50}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3381.676, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 655176.63, "execs_total": 6554987, "fuzzers_used": 51}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3587.51, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 660889.12, "execs_total": 6612265, "fuzzers_used": 52}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3546.407, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 651803.54, "execs_total": 6520961, "fuzzers_used": 53}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3439.83, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 659012.17, "execs_total": 6593396, "fuzzers_used": 54}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3387.899, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 660016.18, "execs_total": 6603558, "fuzzers_used": 55}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3444.077, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 655931.36, "execs_total": 6561865, "fuzzers_used": 56}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.775, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 618906.23, "execs_total": 6192465, "fuzzers_used": 57}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.33, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 614008.28, "execs_total": 6143464, "fuzzers_used": 58}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.487, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 622400.85, "execs_total": 6227304, "fuzzers_used": 59}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.123, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 624883.06, "execs_total": 6251875, "fuzzers_used": 60}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3590.657, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 628668.94, "execs_total": 6289966, "fuzzers_used": 61}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.335, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 628892.17, "execs_total": 6292361, "fuzzers_used": 62}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.368, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 622065.07, "execs_total": 6224119, "fuzzers_used": 63}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3413.262, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 625528.06, "execs_total": 6258762, "fuzzers_used": 64}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.18, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 602248.19, "execs_total": 6025927, "fuzzers_used": 65}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3591.981, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 597615.89, "execs_total": 5979708, "fuzzers_used": 66}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3600.012, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 607270.98, "execs_total": 6076233, "fuzzers_used": 67}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3507.753, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 608945.09, "execs_total": 6092446, "fuzzers_used": 68}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.845, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 611736.03, "execs_total": 6121207, "fuzzers_used": 69}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3412.629, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 615031.23, "execs_total": 6153592, "fuzzers_used": 70}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3443.261, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 608202.64, "execs_total": 6084885, "fuzzers_used": 71}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.439, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 614339.09, "execs_total": 6146152, "fuzzers_used": 72}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3379.556, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 587046.59, "execs_total": 5873881, "fuzzers_used": 73}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.574, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 587238.27, "execs_total": 5875646, "fuzzers_used": 74}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.098, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 594097.56, "execs_total": 5944036, "fuzzers_used": 75}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3587.762, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 598450.35, "execs_total": 5987756, "fuzzers_used": 76}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.629, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 600430.29, "execs_total": 6007598, "fuzzers_used": 77}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3362.161, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 602014.19, "execs_total": 6023649, "fuzzers_used": 78}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3588.173, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 606146.9, "execs_total": 6065033, "fuzzers_used": 79}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3591.159, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 599360.46, "execs_total": 5997023, "fuzzers_used": 80}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3503.299, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 574792.78, "execs_total": 5751470, "fuzzers_used": 81}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3584.593, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 578265.29, "execs_total": 5785927, "fuzzers_used": 82}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3401.073, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 589985.07, "execs_total": 5903506, "fuzzers_used": 83}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3468.764, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 589281.87, "execs_total": 5895767, "fuzzers_used": 84}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3466.115, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 596581.77, "execs_total": 5969747, "fuzzers_used": 85}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3590.706, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 589017.68, "execs_total": 5893108, "fuzzers_used": 86}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3521.556, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 593403.75, "execs_total": 5937422, "fuzzers_used": 87}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.254, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 601611.06, "execs_total": 6019864, "fuzzers_used": 88}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.211, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 576056.15, "execs_total": 5763322, "fuzzers_used": 89}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.489, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 576151.97, "execs_total": 5764687, "fuzzers_used": 90}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.444, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 583769.1, "execs_total": 5841115, "fuzzers_used": 91}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3446.364, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 585285.47, "execs_total": 5856103, "fuzzers_used": 92}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3562.852, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 581524.67, "execs_total": 5818808, "fuzzers_used": 93}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.403, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 596383.31, "execs_total": 5967460, "fuzzers_used": 94}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3421.421, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 596239.29, "execs_total": 5965882, "fuzzers_used": 95}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3276.519, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 595382.67, "execs_total": 5957136, "fuzzers_used": 96}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.029, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 586144.68, "execs_total": 5865411, "fuzzers_used": 97}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3590.48, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 579467.06, "execs_total": 5798123, "fuzzers_used": 98}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.89, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 572801.45, "execs_total": 5731838, "fuzzers_used": 99}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.31, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 573916.1, "execs_total": 5742901, "fuzzers_used": 100}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3589.943, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 565823.06, "execs_total": 5660910, "fuzzers_used": 101}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3391.191, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 561854.84, "execs_total": 5621778, "fuzzers_used": 102}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3372.775, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 562717.02, "execs_total": 5630085, "fuzzers_used": 103}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3365.142, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 559273.67, "execs_total": 5596400, "fuzzers_used": 104}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3591.44, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 553209.58, "execs_total": 5535044, "fuzzers_used": 105}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3563.12, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 547678.42, "execs_total": 5480061, "fuzzers_used": 106}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3477.381, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 552316.36, "execs_total": 5526570, "fuzzers_used": 107}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.467, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 545257.97, "execs_total": 5455157, "fuzzers_used": 108}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3344.258, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 549190.03, "execs_total": 5495511, "fuzzers_used": 109}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3421.467, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 546845.0, "execs_total": 5472086, "fuzzers_used": 110}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.157, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 545239.46, "execs_total": 5455236, "fuzzers_used": 111}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.389, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 543139.24, "execs_total": 5434484, "fuzzers_used": 112}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3461.931, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 543252.43, "execs_total": 5435319, "fuzzers_used": 113}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3354.728, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 538720.77, "execs_total": 5390315, "fuzzers_used": 114}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.185, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 536681.55, "execs_total": 5369963, "fuzzers_used": 115}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.862, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 540956.43, "execs_total": 5412850, "fuzzers_used": 116}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.403, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 536348.84, "execs_total": 5367054, "fuzzers_used": 117}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.449, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 534734.41, "execs_total": 5350358, "fuzzers_used": 118}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.736, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 536060.28, "execs_total": 5363892, "fuzzers_used": 119}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3590.738, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 533480.83, "execs_total": 5338193, "fuzzers_used": 120}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.482, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 514271.98, "execs_total": 5145571, "fuzzers_used": 121}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.864, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 503271.79, "execs_total": 5035794, "fuzzers_used": 122}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3586.097, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 496011.52, "execs_total": 4963063, "fuzzers_used": 123}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3587.507, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 490784.42, "execs_total": 4910734, "fuzzers_used": 124}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.718, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 488441.09, "execs_total": 4887140, "fuzzers_used": 125}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.035, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 481281.33, "execs_total": 4815386, "fuzzers_used": 126}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.332, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 469294.96, "execs_total": 4695183, "fuzzers_used": 127}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3589.346, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 465563.78, "execs_total": 4657841, "fuzzers_used": 128}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.943, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 459922.67, "execs_total": 4601391, "fuzzers_used": 129}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3280.928, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 459384.3, "execs_total": 4596590, "fuzzers_used": 130}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.875, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 453310.58, "execs_total": 4535383, "fuzzers_used": 131}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3600.179, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 460246.7, "execs_total": 4604954, "fuzzers_used": 132}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3601.396, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 457201.82, "execs_total": 4574474, "fuzzers_used": 133}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3600.942, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 452487.43, "execs_total": 4527226, "fuzzers_used": 134}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3458.573, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 450514.18, "execs_total": 4507745, "fuzzers_used": 135}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.922, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 449479.52, "execs_total": 4496843, "fuzzers_used": 136}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.911, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 444691.06, "execs_total": 4449491, "fuzzers_used": 137}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.654, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 443497.81, "execs_total": 4437339, "fuzzers_used": 138}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.626, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 437981.1, "execs_total": 4382263, "fuzzers_used": 139}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.124, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 443055.68, "execs_total": 4432987, "fuzzers_used": 140}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.978, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 438908.41, "execs_total": 4391393, "fuzzers_used": 141}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3453.125, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 442841.02, "execs_total": 4430878, "fuzzers_used": 142}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3214.708, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 441891.92, "execs_total": 4421776, "fuzzers_used": 143}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.764, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 441860.76, "execs_total": 4421068, "fuzzers_used": 144}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3443.44, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 426935.73, "execs_total": 4272029, "fuzzers_used": 145}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3586.383, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 427322.41, "execs_total": 4275938, "fuzzers_used": 146}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3424.014, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 426914.69, "execs_total": 4271924, "fuzzers_used": 147}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.58, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 433246.64, "execs_total": 4335165, "fuzzers_used": 148}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.546, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 435016.77, "execs_total": 4352822, "fuzzers_used": 149}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.587, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 432197.7, "execs_total": 4324740, "fuzzers_used": 150}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3537.464, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 434928.88, "execs_total": 4351767, "fuzzers_used": 151}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.135, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 435174.29, "execs_total": 4354184, "fuzzers_used": 152}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3371.959, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 426852.22, "execs_total": 4271150, "fuzzers_used": 153}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.413, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 431241.89, "execs_total": 4315307, "fuzzers_used": 154}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3590.69, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 430842.14, "execs_total": 4311025, "fuzzers_used": 155}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3591.29, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 434156.3, "execs_total": 4344575, "fuzzers_used": 156}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3583.517, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 430896.1, "execs_total": 4311642, "fuzzers_used": 157}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.926, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 435704.89, "execs_total": 4360326, "fuzzers_used": 158}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.395, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 438155.8, "execs_total": 4384203, "fuzzers_used": 159}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3396.521, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 442883.53, "execs_total": 4432039, "fuzzers_used": 160}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.95, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 433993.37, "execs_total": 4342838, "fuzzers_used": 161}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.614, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 437174.96, "execs_total": 4374708, "fuzzers_used": 162}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.894, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 435745.93, "execs_total": 4360320, "fuzzers_used": 163}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.633, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 441564.58, "execs_total": 4418619, "fuzzers_used": 164}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.069, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 445500.18, "execs_total": 4457810, "fuzzers_used": 165}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3581.223, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 445887.53, "execs_total": 4461995, "fuzzers_used": 166}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.249, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 443509.97, "execs_total": 4438012, "fuzzers_used": 167}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.106, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 446851.67, "execs_total": 4471572, "fuzzers_used": 168}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3417.764, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 447685.22, "execs_total": 4479536, "fuzzers_used": 169}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3589.058, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 446730.72, "execs_total": 4470322, "fuzzers_used": 170}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.116, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 448668.48, "execs_total": 4489967, "fuzzers_used": 171}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3587.905, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 450972.11, "execs_total": 4513110, "fuzzers_used": 172}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.114, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 450615.23, "execs_total": 4509271, "fuzzers_used": 173}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.851, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 458016.89, "execs_total": 4583318, "fuzzers_used": 174}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.106, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 460677.5, "execs_total": 4609716, "fuzzers_used": 175}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3374.143, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 460763.9, "execs_total": 4610640, "fuzzers_used": 176}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.42, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 452298.55, "execs_total": 4526006, "fuzzers_used": 177}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.801, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 456748.89, "execs_total": 4570571, "fuzzers_used": 178}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.709, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 451289.94, "execs_total": 4516046, "fuzzers_used": 179}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.769, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 463235.15, "execs_total": 4635628, "fuzzers_used": 180}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3330.854, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 464366.11, "execs_total": 4646649, "fuzzers_used": 181}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.585, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 469453.17, "execs_total": 4697909, "fuzzers_used": 182}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.242, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 467300.47, "execs_total": 4676077, "fuzzers_used": 183}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.952, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 475115.57, "execs_total": 4754150, "fuzzers_used": 184}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3583.539, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 472179.98, "execs_total": 4724913, "fuzzers_used": 185}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3598.57, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 465528.62, "execs_total": 4658439, "fuzzers_used": 186}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3587.126, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 476194.69, "execs_total": 4765385, "fuzzers_used": 187}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3423.033, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 475886.86, "execs_total": 4762069, "fuzzers_used": 188}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.32, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 473599.91, "execs_total": 4739128, "fuzzers_used": 189}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3597.599, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 476949.52, "execs_total": 4772500, "fuzzers_used": 190}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3437.101, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 474259.76, "execs_total": 4745505, "fuzzers_used": 191}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "AWS EC2 r6a.48xlarge spot instance", "compiler": "clang version 15.0.7 (Amazon Linux 15.0.7-3.amzn2023.0.1)", "target_arch": "x86_64-amazon-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3599.17, "cpu_model": "AMD EPYC 7R13 Processor", "cpu_threads": 192}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 479848.23, "execs_total": 4801111, "fuzzers_used": 192}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "", "compiler": "Debian clang version 17.0.4 (++20231031083102+309d55140c46-1~exp1~20231031083155.63)", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4761.063, "cpu_model": "12th Gen Intel(R) Core(TM) i7-1270P", "cpu_threads": 16}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 641219.02, "execs_total": 19251242, "fuzzers_used": 16}, "singlecore": {"execs_per_sec": 149778.22, "execs_total": 4493796, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "", "compiler": "Ubuntu clang version 17.0.2 (++20231003073128+b2417f51dbbd-1~exp1~20231003073233.51)", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3193.942, "cpu_model": "AMD EPYC 7282 16-Core Processor", "cpu_threads": 64}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 769000.8, "execs_total": 23084516, "fuzzers_used": 32}, "singlecore": {"execs_per_sec": 87198.85, "execs_total": 2616227, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.08a", "comment": "", "compiler": "Ubuntu clang version 14.0.0-1ubuntu1.1", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 3700.0, "cpu_model": "AMD Ryzen 5 PRO 4650G with Radeon Graphics", "cpu_threads": 12}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 704840.16, "execs_total": 21163992, "fuzzers_used": 12}, "singlecore": {"execs_per_sec": 95356.14, "execs_total": 2862114, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.09a", "comment": "", "compiler": "Debian clang version 14.0.6", "target_arch": "aarch64-unknown-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 2400.0, "cpu_model": "Raspberry Pi 5", "cpu_threads": 4}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 101114.23, "execs_total": 3036637, "fuzzers_used": 4}, "singlecore": {"execs_per_sec": 25786.11, "execs_total": 774460, "fuzzers_used": 1}}}}
|
|
||||||
{"config": {"afl_persistent_config": true, "afl_system_config": true, "afl_version": "++4.07a", "comment": "", "compiler": "Debian clang version 17.0.0 (++20230417071830+ae77aceba5ad-1~exp1~20230417071935.630)", "target_arch": "x86_64-pc-linux-gnu"}, "hardware": {"cpu_fastest_core_mhz": 4792.073, "cpu_model": "AMD Ryzen 9 5950X 16-Core Processor", "cpu_threads": 32}, "targets": {"test-instr-persist-shmem": {"multicore": {"execs_per_sec": 2339762.91, "execs_total": 70253164, "fuzzers_used": 32}, "singlecore": {"execs_per_sec": 161690.07, "execs_total": 4851838, "fuzzers_used": 1}}}}
|
|
File diff suppressed because one or more lines are too long
@ -1,281 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# Part of the aflplusplus project, requires Python 3.8+.
|
|
||||||
# Author: Chris Ball <chris@printf.net>, ported from Marc "van Hauser" Heuse's "benchmark.sh".
|
|
||||||
import argparse, asyncio, json, multiprocessing, os, platform, re, shutil, sys
|
|
||||||
from dataclasses import asdict, dataclass
|
|
||||||
from decimal import Decimal
|
|
||||||
from enum import Enum, auto
|
|
||||||
from pathlib import Path
|
|
||||||
from typing import Dict, List, Optional, Tuple
|
|
||||||
|
|
||||||
blue = lambda text: f"\033[1;94m{text}\033[0m"; gray = lambda text: f"\033[1;90m{text}\033[0m"
|
|
||||||
green = lambda text: f"\033[0;32m{text}\033[0m"; red = lambda text: f"\033[0;31m{text}\033[0m"
|
|
||||||
yellow = lambda text: f"\033[0;33m{text}\033[0m"
|
|
||||||
|
|
||||||
class Mode(Enum):
|
|
||||||
multicore = auto()
|
|
||||||
singlecore = auto()
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Target:
|
|
||||||
source: Path
|
|
||||||
binary: Path
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Run:
|
|
||||||
execs_per_sec: float
|
|
||||||
execs_total: float
|
|
||||||
fuzzers_used: int
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Config:
|
|
||||||
afl_persistent_config: bool
|
|
||||||
afl_system_config: bool
|
|
||||||
afl_version: Optional[str]
|
|
||||||
comment: str
|
|
||||||
compiler: str
|
|
||||||
target_arch: str
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Hardware:
|
|
||||||
cpu_fastest_core_mhz: float
|
|
||||||
cpu_model: str
|
|
||||||
cpu_threads: int
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Results:
|
|
||||||
config: Optional[Config]
|
|
||||||
hardware: Optional[Hardware]
|
|
||||||
targets: Dict[str, Dict[str, Optional[Run]]]
|
|
||||||
|
|
||||||
all_modes = [Mode.singlecore, Mode.multicore]
|
|
||||||
all_targets = [
|
|
||||||
Target(source=Path("../utils/persistent_mode/test-instr.c").resolve(), binary=Path("test-instr-persist-shmem")),
|
|
||||||
Target(source=Path("../test-instr.c").resolve(), binary=Path("test-instr"))
|
|
||||||
]
|
|
||||||
modes = [mode.name for mode in all_modes]
|
|
||||||
targets = [str(target.binary) for target in all_targets]
|
|
||||||
cpu_count = multiprocessing.cpu_count()
|
|
||||||
env_vars = {
|
|
||||||
"AFL_DISABLE_TRIM": "1", "AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES": "1", "AFL_FAST_CAL": "1",
|
|
||||||
"AFL_NO_UI": "1", "AFL_TRY_AFFINITY": "1", "PATH": f'{str(Path("../").resolve())}:{os.environ["PATH"]}',
|
|
||||||
}
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
||||||
parser.add_argument("-b", "--basedir", help="directory to use for temp files", type=str, default="/tmp/aflpp-benchmark")
|
|
||||||
parser.add_argument("-d", "--debug", help="show verbose debugging output", action="store_true")
|
|
||||||
parser.add_argument("-r", "--runs", help="how many runs to average results over", type=int, default=3)
|
|
||||||
parser.add_argument("-f", "--fuzzers", help="how many afl-fuzz workers to use", type=int, default=cpu_count)
|
|
||||||
parser.add_argument("-m", "--mode", help="pick modes", action="append", default=modes, choices=modes)
|
|
||||||
parser.add_argument("-c", "--comment", help="add a comment about your setup", type=str, default="")
|
|
||||||
parser.add_argument("--cpu", help="override the detected CPU model name", type=str, default="")
|
|
||||||
parser.add_argument("--mhz", help="override the detected CPU MHz", type=str, default="")
|
|
||||||
parser.add_argument(
|
|
||||||
"-t", "--target", help="pick targets", action="append", default=["test-instr-persist-shmem"], choices=targets
|
|
||||||
)
|
|
||||||
args = parser.parse_args()
|
|
||||||
# Really unsatisfying argparse behavior: we want a default and to allow multiple choices, but if there's a manual choice
|
|
||||||
# it should override the default. Seems like we have to remove the default to get that and have correct help text?
|
|
||||||
if len(args.target) > 1:
|
|
||||||
args.target = args.target[1:]
|
|
||||||
if len(args.mode) > 2:
|
|
||||||
args.mode = args.mode[2:]
|
|
||||||
|
|
||||||
chosen_modes = [mode for mode in all_modes if mode.name in args.mode]
|
|
||||||
chosen_targets = [target for target in all_targets if str(target.binary) in args.target]
|
|
||||||
results = Results(config=None, hardware=None, targets={
|
|
||||||
str(t.binary): {m.name: None for m in chosen_modes} for t in chosen_targets}
|
|
||||||
)
|
|
||||||
debug = lambda text: args.debug and print(blue(text))
|
|
||||||
|
|
||||||
async def clean_up_tempfiles() -> None:
|
|
||||||
shutil.rmtree(f"{args.basedir}/in")
|
|
||||||
for target in chosen_targets:
|
|
||||||
target.binary.unlink()
|
|
||||||
for mode in chosen_modes:
|
|
||||||
shutil.rmtree(f"{args.basedir}/out-{mode.name}-{str(target.binary)}")
|
|
||||||
|
|
||||||
async def check_afl_persistent() -> bool:
|
|
||||||
with open("/proc/cmdline", "r") as cmdline:
|
|
||||||
return "mitigations=off" in cmdline.read().strip().split(" ")
|
|
||||||
|
|
||||||
async def check_afl_system() -> bool:
|
|
||||||
sysctl = next((s for s in ["sysctl", "/sbin/sysctl"] if shutil.which(s)), None)
|
|
||||||
if sysctl:
|
|
||||||
(returncode, stdout, _) = await run_command([sysctl, "kernel.randomize_va_space"])
|
|
||||||
return returncode == 0 and stdout.decode().rstrip().split(" = ")[1] == "0"
|
|
||||||
return False
|
|
||||||
|
|
||||||
async def prep_env() -> None:
|
|
||||||
Path(f"{args.basedir}/in").mkdir(exist_ok=True, parents=True)
|
|
||||||
with open(f"{args.basedir}/in/in.txt", "wb") as seed:
|
|
||||||
seed.write(b"\x00" * 10240)
|
|
||||||
|
|
||||||
async def compile_target(source: Path, binary: Path) -> None:
|
|
||||||
print(f" [*] Compiling the {binary} fuzzing harness for the benchmark to use.")
|
|
||||||
(returncode, stdout, stderr) = await run_command(
|
|
||||||
[str(Path("../afl-clang-lto").resolve()), "-o", str(Path(binary.resolve())), str(Path(source).resolve())]
|
|
||||||
)
|
|
||||||
if returncode == 0:
|
|
||||||
return
|
|
||||||
print(yellow(f" [*] afl-clang-lto was unable to compile; falling back to afl-cc."))
|
|
||||||
(returncode, stdout, stderr) = await run_command(
|
|
||||||
[str(Path("../afl-cc").resolve()), "-o", str(Path(binary.resolve())), str(Path(source).resolve())]
|
|
||||||
)
|
|
||||||
if returncode != 0:
|
|
||||||
sys.exit(red(f" [*] Error: afl-cc is unable to compile: {stderr.decode()} {stdout.decode()}"))
|
|
||||||
|
|
||||||
async def run_command(cmd: List[str]) -> Tuple[Optional[int], bytes, bytes]:
|
|
||||||
debug(f"Launching command: {cmd} with env {env_vars}")
|
|
||||||
p = await asyncio.create_subprocess_exec(
|
|
||||||
*cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, env=env_vars
|
|
||||||
)
|
|
||||||
stdout, stderr = await p.communicate()
|
|
||||||
debug(f"Output: {stdout.decode()} {stderr.decode()}")
|
|
||||||
return (p.returncode, stdout, stderr)
|
|
||||||
|
|
||||||
async def check_deps() -> None:
|
|
||||||
if not (plat := platform.system()) == "Linux": sys.exit(red(f" [*] {plat} is not supported by this script yet."))
|
|
||||||
if not os.access(Path("../afl-fuzz").resolve(), os.X_OK) and os.access(Path("../afl-cc").resolve(), os.X_OK) and (
|
|
||||||
os.path.exists(Path("../SanitizerCoveragePCGUARD.so").resolve())):
|
|
||||||
sys.exit(red(" [*] Compile AFL++: we need afl-fuzz, afl-clang-fast and SanitizerCoveragePCGUARD.so built."))
|
|
||||||
|
|
||||||
(returncode, stdout, stderr) = await run_command([str(Path("../afl-cc").resolve()), "-v"])
|
|
||||||
if returncode != 0:
|
|
||||||
sys.exit(red(f" [*] Error: afl-cc -v returned: {stderr.decode()} {stdout.decode()}"))
|
|
||||||
compiler = ""
|
|
||||||
target_arch = ""
|
|
||||||
for line in stderr.decode().split("\n"):
|
|
||||||
if "clang version" in line:
|
|
||||||
compiler = line
|
|
||||||
elif m := re.match(r"^Target: (.*)", line):
|
|
||||||
target_arch = m.group(1)
|
|
||||||
|
|
||||||
# Pick some sample settings from afl-{persistent,system}-config to try to see whether they were run.
|
|
||||||
afl_pc = await check_afl_persistent()
|
|
||||||
afl_sc = await check_afl_system()
|
|
||||||
if not afl_pc:
|
|
||||||
print(yellow(f" [*] afl-persistent-config did not run; run it to improve performance (and decrease security)."))
|
|
||||||
if not afl_sc:
|
|
||||||
print(yellow(f" [*] afl-system-config did not run; run it to improve performance (and decrease security)."))
|
|
||||||
results.config = Config(afl_persistent_config=afl_pc, afl_system_config=afl_sc, afl_version="",
|
|
||||||
comment=args.comment, compiler=compiler, target_arch=target_arch)
|
|
||||||
|
|
||||||
async def colon_values(filename: str, searchKey: str) -> List[str]:
|
|
||||||
"""Return a colon-separated value given a key in a file, e.g. 'cpu MHz : 4976.109')"""
|
|
||||||
with open(filename, "r") as fh:
|
|
||||||
kv_pairs = (line.split(": ", 1) for line in fh if ": " in line)
|
|
||||||
v_list = [v.rstrip() for k, v in kv_pairs if k.rstrip() == searchKey]
|
|
||||||
return v_list
|
|
||||||
|
|
||||||
async def describe_afl_config() -> str:
|
|
||||||
if results.config is None:
|
|
||||||
return "unknown"
|
|
||||||
elif results.config.afl_persistent_config and results.config.afl_system_config:
|
|
||||||
return "both"
|
|
||||||
elif results.config.afl_persistent_config:
|
|
||||||
return "persistent"
|
|
||||||
elif results.config.afl_system_config:
|
|
||||||
return "system"
|
|
||||||
else:
|
|
||||||
return "none"
|
|
||||||
|
|
||||||
async def save_benchmark_results() -> None:
|
|
||||||
"""Append a single row to the benchmark results in JSON Lines format (which is simple to write and diff)."""
|
|
||||||
with open("benchmark-results.jsonl", "a") as jsonfile:
|
|
||||||
json.dump(asdict(results), jsonfile, sort_keys=True)
|
|
||||||
jsonfile.write("\n")
|
|
||||||
print(blue(f" [*] Results have been written to the {jsonfile.name} file."))
|
|
||||||
with open("COMPARISON.md", "r+") as comparisonfile:
|
|
||||||
described_config = await describe_afl_config()
|
|
||||||
aflconfig = described_config.ljust(12)
|
|
||||||
if results.hardware is None:
|
|
||||||
return
|
|
||||||
cpu_model = results.hardware.cpu_model.ljust(51)
|
|
||||||
if cpu_model in comparisonfile.read():
|
|
||||||
print(blue(f" [*] Results have not been written to the COMPARISON.md file; this CPU is already present."))
|
|
||||||
return
|
|
||||||
cpu_mhz = str(round(results.hardware.cpu_fastest_core_mhz)).ljust(5)
|
|
||||||
if not "test-instr-persist-shmem" in results.targets or \
|
|
||||||
not "multicore" in results.targets["test-instr-persist-shmem"] or \
|
|
||||||
not "singlecore" in results.targets["test-instr-persist-shmem"] or \
|
|
||||||
results.targets["test-instr-persist-shmem"]["singlecore"] is None or \
|
|
||||||
results.targets["test-instr-persist-shmem"]["multicore"] is None:
|
|
||||||
return
|
|
||||||
single = str(round(results.targets["test-instr-persist-shmem"]["singlecore"].execs_per_sec)).ljust(10)
|
|
||||||
multi = str(round(results.targets["test-instr-persist-shmem"]["multicore"].execs_per_sec)).ljust(9)
|
|
||||||
cores = str(args.fuzzers).ljust(7)
|
|
||||||
comparisonfile.write(f"{cpu_model} | {cpu_mhz} | {cores} | {single} | {multi} | {aflconfig} |\n")
|
|
||||||
print(blue(f" [*] Results have been written to the COMPARISON.md file."))
|
|
||||||
with open("COMPARISON.md", "r") as comparisonfile:
|
|
||||||
print(comparisonfile.read())
|
|
||||||
|
|
||||||
|
|
||||||
async def main() -> None:
|
|
||||||
try:
|
|
||||||
await clean_up_tempfiles()
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
await check_deps()
|
|
||||||
if args.mhz:
|
|
||||||
cpu_mhz = float(args.mhz)
|
|
||||||
else:
|
|
||||||
cpu_mhz_str = await colon_values("/proc/cpuinfo", "cpu MHz")
|
|
||||||
if len(cpu_mhz_str) == 0:
|
|
||||||
cpu_mhz_str.append("0")
|
|
||||||
cpu_mhz = max([float(c) for c in cpu_mhz_str]) # use the fastest CPU MHz for now
|
|
||||||
if args.cpu:
|
|
||||||
cpu_model = [args.cpu]
|
|
||||||
else:
|
|
||||||
cpu_model = await colon_values("/proc/cpuinfo", "model name") or [""]
|
|
||||||
results.hardware = Hardware(cpu_fastest_core_mhz=cpu_mhz, cpu_model=cpu_model[0], cpu_threads=cpu_count)
|
|
||||||
await prep_env()
|
|
||||||
print(f" [*] Ready, starting benchmark...")
|
|
||||||
for target in chosen_targets:
|
|
||||||
await compile_target(target.source, target.binary)
|
|
||||||
binary = str(target.binary)
|
|
||||||
for mode in chosen_modes:
|
|
||||||
if mode == Mode.multicore:
|
|
||||||
print(blue(f" [*] Using {args.fuzzers} fuzzers for multicore fuzzing "), end="")
|
|
||||||
print(blue("(use --fuzzers to override)." if args.fuzzers == cpu_count else f"(the default is {cpu_count})"))
|
|
||||||
execs_per_sec, execs_total = ([] for _ in range(2))
|
|
||||||
for run_idx in range(0, args.runs):
|
|
||||||
print(gray(f" [*] {mode.name} {binary} run {run_idx+1} of {args.runs}, execs/s: "), end="", flush=True)
|
|
||||||
fuzzers = range(0, args.fuzzers if mode == Mode.multicore else 1)
|
|
||||||
outdir = f"{args.basedir}/out-{mode.name}-{binary}"
|
|
||||||
cmds = []
|
|
||||||
for fuzzer_idx, afl in enumerate(fuzzers):
|
|
||||||
name = ["-o", outdir, "-M" if fuzzer_idx == 0 else "-S", str(afl)]
|
|
||||||
cmds.append(["afl-fuzz", "-i", f"{args.basedir}/in"] + name + ["-s", "123", "-V10", "-D", f"./{binary}"])
|
|
||||||
# Prepare the afl-fuzz tasks, and then block while waiting for them to finish.
|
|
||||||
fuzztasks = [run_command(cmds[cpu]) for cpu in fuzzers]
|
|
||||||
await asyncio.gather(*fuzztasks)
|
|
||||||
afl_versions = await colon_values(f"{outdir}/0/fuzzer_stats", "afl_version")
|
|
||||||
if results.config:
|
|
||||||
results.config.afl_version = afl_versions[0]
|
|
||||||
# Our score is the sum of all execs_per_sec entries in fuzzer_stats files for the run.
|
|
||||||
sectasks = [colon_values(f"{outdir}/{afl}/fuzzer_stats", "execs_per_sec") for afl in fuzzers]
|
|
||||||
all_execs_per_sec = await asyncio.gather(*sectasks)
|
|
||||||
execs = sum([Decimal(count[0]) for count in all_execs_per_sec])
|
|
||||||
print(green(execs))
|
|
||||||
execs_per_sec.append(execs)
|
|
||||||
# Also gather execs_total and total_run_time for this run.
|
|
||||||
exectasks = [colon_values(f"{outdir}/{afl}/fuzzer_stats", "execs_done") for afl in fuzzers]
|
|
||||||
all_execs_total = await asyncio.gather(*exectasks)
|
|
||||||
execs_total.append(sum([Decimal(count[0]) for count in all_execs_total]))
|
|
||||||
|
|
||||||
# (Using float() because Decimal() is not JSON-serializable.)
|
|
||||||
avg_afl_execs_per_sec = round(Decimal(sum(execs_per_sec) / len(execs_per_sec)), 2)
|
|
||||||
afl_execs_total = int(sum([Decimal(execs) for execs in execs_total]))
|
|
||||||
run = Run(execs_per_sec=float(avg_afl_execs_per_sec), execs_total=afl_execs_total, fuzzers_used=len(fuzzers))
|
|
||||||
results.targets[binary][mode.name] = run
|
|
||||||
print(f" [*] Average execs/sec for this test across all runs was: {green(avg_afl_execs_per_sec)}")
|
|
||||||
if (((max(execs_per_sec) - min(execs_per_sec)) / avg_afl_execs_per_sec) * 100) > 15:
|
|
||||||
print(yellow(" [*] The difference between your slowest and fastest runs was >15%, maybe try again?"))
|
|
||||||
|
|
||||||
await clean_up_tempfiles()
|
|
||||||
await save_benchmark_results()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
asyncio.run(main())
|
|
||||||
|
|
@ -54,7 +54,7 @@ $(GLIBC_LDSO): | $(GLIBC_NAME).tar.xz
|
|||||||
$(MAKE) install
|
$(MAKE) install
|
||||||
|
|
||||||
$(GLIBC_NAME).tar.xz:
|
$(GLIBC_NAME).tar.xz:
|
||||||
wget -qO $@ $(GLIBC_URL_BASE)/$@
|
wget -O $@ $(GLIBC_URL_BASE)/$@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) -C $(CS_TRACE) clean
|
$(MAKE) -C $(CS_TRACE) clean
|
||||||
|
Submodule coresight_mode/coresight-trace updated: fe8b26ea4b...ec0fd61047
Submodule coresight_mode/patchelf updated: be0cc30a59...7ec8edbe09
@ -11,6 +11,19 @@ The `./examples` folder contains examples for custom mutators in python and C.
|
|||||||
|
|
||||||
In `./rust`, you will find rust bindings, including a simple example in `./rust/example` and an example for structured fuzzing, based on lain, in`./rust/example_lain`.
|
In `./rust`, you will find rust bindings, including a simple example in `./rust/example` and an example for structured fuzzing, based on lain, in`./rust/example_lain`.
|
||||||
|
|
||||||
|
## The AFL++ Grammar Mutator
|
||||||
|
|
||||||
|
If you use git to clone AFL++, then the following will incorporate our
|
||||||
|
excellent grammar custom mutator:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git submodule update --init
|
||||||
|
```
|
||||||
|
|
||||||
|
Read the README in the [Grammar-Mutator] repository on how to use it.
|
||||||
|
|
||||||
|
[Grammar-Mutator]: https://github.com/AFLplusplus/Grammar-Mutator
|
||||||
|
|
||||||
## Production-Ready Custom Mutators
|
## Production-Ready Custom Mutators
|
||||||
|
|
||||||
This directory holds ready to use custom mutators.
|
This directory holds ready to use custom mutators.
|
||||||
@ -24,42 +37,6 @@ and add `AFL_CUSTOM_MUTATOR_ONLY=1` if you only want to use the custom mutator.
|
|||||||
|
|
||||||
Multiple custom mutators can be used by separating their paths with `:` in the environment variable.
|
Multiple custom mutators can be used by separating their paths with `:` in the environment variable.
|
||||||
|
|
||||||
### The AFL++ grammar agnostic grammar mutator
|
|
||||||
|
|
||||||
In `./autotokens` you find a token-level fuzzer that does not need to know
|
|
||||||
anything about the grammar of an input as long as it is in ascii and allows
|
|
||||||
whitespace.
|
|
||||||
It is very fast and effective.
|
|
||||||
|
|
||||||
If you are looking for an example of how to effectively create a custom
|
|
||||||
mutator take a look at this one.
|
|
||||||
|
|
||||||
### The AFL++ Grammar Mutator
|
|
||||||
|
|
||||||
If you use git to clone AFL++, then the following will incorporate our
|
|
||||||
excellent grammar custom mutator:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
git submodule update --init
|
|
||||||
```
|
|
||||||
|
|
||||||
Read the README in the [Grammar-Mutator] repository on how to use it.
|
|
||||||
|
|
||||||
[Grammar-Mutator]: https://github.com/AFLplusplus/Grammar-Mutator
|
|
||||||
|
|
||||||
Note that this custom mutator is not very good though!
|
|
||||||
|
|
||||||
### Other Mutators
|
|
||||||
|
|
||||||
atnwalk and gramatron are grammar custom mutators. Example grammars are
|
|
||||||
provided.
|
|
||||||
|
|
||||||
honggfuzz, libfuzzer and libafl are partial implementations based on the
|
|
||||||
mutator implementations of the respective fuzzers.
|
|
||||||
More for playing than serious usage.
|
|
||||||
|
|
||||||
radamsa is slow and not very good.
|
|
||||||
|
|
||||||
## 3rd Party Custom Mutators
|
## 3rd Party Custom Mutators
|
||||||
|
|
||||||
### Superion Mutators
|
### Superion Mutators
|
||||||
@ -70,17 +47,14 @@ requires cmake (among other things):
|
|||||||
|
|
||||||
### libprotobuf Mutators
|
### libprotobuf Mutators
|
||||||
|
|
||||||
There are three WIP protobuf projects, that require work to be working though:
|
There are two WIP protobuf projects, that require work to be working though:
|
||||||
|
|
||||||
ASN.1 example:
|
|
||||||
[https://github.com/airbus-seclab/AFLplusplus-blogpost/tree/main/src/mutator](https://github.com/airbus-seclab/AFLplusplus-blogpost/tree/main/src/mutator)
|
|
||||||
|
|
||||||
transforms protobuf raw:
|
transforms protobuf raw:
|
||||||
[https://github.com/bruce30262/libprotobuf-mutator_fuzzing_learning/tree/master/4_libprotobuf_aflpp_custom_mutator](https://github.com/bruce30262/libprotobuf-mutator_fuzzing_learning/tree/master/4_libprotobuf_aflpp_custom_mutator)
|
https://github.com/bruce30262/libprotobuf-mutator_fuzzing_learning/tree/master/4_libprotobuf_aflpp_custom_mutator
|
||||||
|
|
||||||
has a transform function you need to fill for your protobuf format, however
|
has a transform function you need to fill for your protobuf format, however
|
||||||
needs to be ported to the updated AFL++ custom mutator API (not much work):
|
needs to be ported to the updated AFL++ custom mutator API (not much work):
|
||||||
[https://github.com/thebabush/afl-libprotobuf-mutator](https://github.com/thebabush/afl-libprotobuf-mutator)
|
https://github.com/thebabush/afl-libprotobuf-mutator
|
||||||
|
|
||||||
same as above but is for current AFL++:
|
same as above but is for current AFL++:
|
||||||
[https://github.com/P1umer/AFLplusplus-protobuf-mutator](https://github.com/P1umer/AFLplusplus-protobuf-mutator)
|
https://github.com/P1umer/AFLplusplus-protobuf-mutator
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
|
|
||||||
CFLAGS = -O3 -funroll-loops -fPIC -Wl,-Bsymbolic
|
|
||||||
|
|
||||||
all: aflpp-mutator.so
|
|
||||||
|
|
||||||
aflpp-mutator.so: aflpp.c
|
|
||||||
$(CC) $(CFLAGS) -I../../include -I. -shared -o aflpp-mutator.so aflpp.c ../../src/afl-performance.c
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o *~ *.so core
|
|
@ -1,8 +0,0 @@
|
|||||||
# custum mutator: AFL++
|
|
||||||
|
|
||||||
this is the AFL++ havoc mutator as a custom mutator module for AFL++.
|
|
||||||
|
|
||||||
just type `make` to build
|
|
||||||
|
|
||||||
```AFL_CUSTOM_MUTATOR_LIBRARY=custom_mutators/aflpp/aflpp-mutator.so afl-fuzz ...```
|
|
||||||
|
|
@ -1,89 +0,0 @@
|
|||||||
#include "afl-mutations.h"
|
|
||||||
|
|
||||||
typedef struct my_mutator {
|
|
||||||
|
|
||||||
afl_state_t *afl;
|
|
||||||
u8 *buf;
|
|
||||||
u32 buf_size;
|
|
||||||
|
|
||||||
} my_mutator_t;
|
|
||||||
|
|
||||||
my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|
||||||
|
|
||||||
(void)seed;
|
|
||||||
|
|
||||||
my_mutator_t *data = calloc(1, sizeof(my_mutator_t));
|
|
||||||
if (!data) {
|
|
||||||
|
|
||||||
perror("afl_custom_init alloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((data->buf = malloc(MAX_FILE)) == NULL) {
|
|
||||||
|
|
||||||
perror("afl_custom_init alloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
data->buf_size = MAX_FILE;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->afl = afl;
|
|
||||||
|
|
||||||
return data;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* here we run the AFL++ mutator, which is the best! */
|
|
||||||
|
|
||||||
size_t afl_custom_fuzz(my_mutator_t *data, uint8_t *buf, size_t buf_size,
|
|
||||||
u8 **out_buf, uint8_t *add_buf, size_t add_buf_size,
|
|
||||||
size_t max_size) {
|
|
||||||
|
|
||||||
if (max_size > data->buf_size) {
|
|
||||||
|
|
||||||
u8 *ptr = realloc(data->buf, max_size);
|
|
||||||
|
|
||||||
if (ptr) {
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
data->buf = ptr;
|
|
||||||
data->buf_size = max_size;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 havoc_steps = 1 + rand_below(data->afl, 16);
|
|
||||||
|
|
||||||
/* set everything up, costly ... :( */
|
|
||||||
memcpy(data->buf, buf, buf_size);
|
|
||||||
|
|
||||||
/* the mutation */
|
|
||||||
u32 out_buf_len = afl_mutate(data->afl, data->buf, buf_size, havoc_steps,
|
|
||||||
false, true, add_buf, add_buf_size, max_size);
|
|
||||||
|
|
||||||
/* return size of mutated data */
|
|
||||||
*out_buf = data->buf;
|
|
||||||
return out_buf_len;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deinitialize everything
|
|
||||||
*
|
|
||||||
* @param data The data ptr from afl_custom_init
|
|
||||||
*/
|
|
||||||
void afl_custom_deinit(my_mutator_t *data) {
|
|
||||||
|
|
||||||
free(data->buf);
|
|
||||||
free(data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
|
|
||||||
CFLAGS = -O3 -funroll-loops -fPIC
|
|
||||||
|
|
||||||
all: aflpp-standalone
|
|
||||||
|
|
||||||
aflpp-standalone: aflpp-standalone.c
|
|
||||||
$(CC) $(CFLAGS) -I../../../include -I. -o aflpp-standalone aflpp-standalone.c ../../../src/afl-performance.c
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o *~ aflpp-standalone core
|
|
@ -1,10 +0,0 @@
|
|||||||
# AFL++ standalone mutator
|
|
||||||
|
|
||||||
this is the AFL++ havoc mutator as a standalone mutator
|
|
||||||
|
|
||||||
just type `make` to build.
|
|
||||||
|
|
||||||
```
|
|
||||||
aflpp-standalone inputfile outputfile [splicefile]
|
|
||||||
```
|
|
||||||
|
|
@ -1,166 +0,0 @@
|
|||||||
#include "afl-mutations.h"
|
|
||||||
|
|
||||||
s8 interesting_8[] = {INTERESTING_8};
|
|
||||||
s16 interesting_16[] = {INTERESTING_8, INTERESTING_16};
|
|
||||||
s32 interesting_32[] = {INTERESTING_8, INTERESTING_16, INTERESTING_32};
|
|
||||||
|
|
||||||
typedef struct my_mutator {
|
|
||||||
|
|
||||||
afl_state_t *afl;
|
|
||||||
u8 *buf;
|
|
||||||
u32 buf_size;
|
|
||||||
|
|
||||||
} my_mutator_t;
|
|
||||||
|
|
||||||
my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|
||||||
|
|
||||||
(void)seed;
|
|
||||||
|
|
||||||
my_mutator_t *data = calloc(1, sizeof(my_mutator_t));
|
|
||||||
if (!data) {
|
|
||||||
|
|
||||||
perror("afl_custom_init alloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((data->buf = malloc(1024*1024)) == NULL) {
|
|
||||||
|
|
||||||
perror("afl_custom_init alloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
data->buf_size = 1024*1024;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fake AFL++ state */
|
|
||||||
data->afl = calloc(1, sizeof(afl_state_t));
|
|
||||||
data->afl->queue_cycle = 1;
|
|
||||||
data->afl->fsrv.dev_urandom_fd = open("/dev/urandom", O_RDONLY);
|
|
||||||
if (data->afl->fsrv.dev_urandom_fd < 0) { PFATAL("Unable to open /dev/urandom"); }
|
|
||||||
rand_set_seed(data->afl, getpid());
|
|
||||||
|
|
||||||
return data;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* here we run the AFL++ mutator, which is the best! */
|
|
||||||
|
|
||||||
size_t afl_custom_fuzz(my_mutator_t *data, uint8_t *buf, size_t buf_size,
|
|
||||||
u8 **out_buf, uint8_t *add_buf, size_t add_buf_size,
|
|
||||||
size_t max_size) {
|
|
||||||
|
|
||||||
if (max_size > data->buf_size) {
|
|
||||||
|
|
||||||
u8 *ptr = realloc(data->buf, max_size);
|
|
||||||
|
|
||||||
if (ptr) {
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
data->buf = ptr;
|
|
||||||
data->buf_size = max_size;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 havoc_steps = 1 + rand_below(data->afl, 16);
|
|
||||||
|
|
||||||
/* set everything up, costly ... :( */
|
|
||||||
memcpy(data->buf, buf, buf_size);
|
|
||||||
|
|
||||||
/* the mutation */
|
|
||||||
u32 out_buf_len = afl_mutate(data->afl, data->buf, buf_size, havoc_steps,
|
|
||||||
false, true, add_buf, add_buf_size, max_size);
|
|
||||||
|
|
||||||
/* return size of mutated data */
|
|
||||||
*out_buf = data->buf;
|
|
||||||
return out_buf_len;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
|
|
||||||
if (argc > 1 && strncmp(argv[1], "-h", 2) == 0) {
|
|
||||||
printf("Syntax: %s [-v] [inputfile [outputfile [splicefile]]]\n\n", argv[0]);
|
|
||||||
printf("Reads a testcase from stdin when no input file (or '-') is specified,\n");
|
|
||||||
printf("mutates according to AFL++'s mutation engine, and write to stdout when '-' or\n");
|
|
||||||
printf("no output filename is given. As an optional third parameter you can give a file\n");
|
|
||||||
printf("for splicing. Maximum input and output length is 1MB.\n");
|
|
||||||
printf("The -v verbose option prints debug output to stderr.\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE *in = stdin, *out = stdout, *splice = NULL;
|
|
||||||
unsigned char *inbuf = malloc(1024 * 1024), *outbuf, *splicebuf = NULL;
|
|
||||||
int verbose = 0, splicelen = 0;
|
|
||||||
|
|
||||||
if (argc > 1 && strcmp(argv[1], "-v") == 0) {
|
|
||||||
verbose = 1;
|
|
||||||
argc--;
|
|
||||||
argv++;
|
|
||||||
fprintf(stderr, "Verbose active\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
my_mutator_t *data = afl_custom_init(NULL, 0);
|
|
||||||
|
|
||||||
if (argc > 1 && strcmp(argv[1], "-") != 0) {
|
|
||||||
if ((in = fopen(argv[1], "r")) == NULL) {
|
|
||||||
perror(argv[1]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (verbose) fprintf(stderr, "Input: %s\n", argv[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t inlen = fread(inbuf, 1, 1024*1024, in);
|
|
||||||
|
|
||||||
if (!inlen) {
|
|
||||||
fprintf(stderr, "Error: empty file %s\n", argv[1] ? argv[1] : "stdin");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (argc > 2 && strcmp(argv[2], "-") != 0) {
|
|
||||||
if ((out = fopen(argv[2], "w")) == NULL) {
|
|
||||||
perror(argv[2]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (verbose) fprintf(stderr, "Output: %s\n", argv[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (argc > 3) {
|
|
||||||
if ((splice = fopen(argv[3], "r")) == NULL) {
|
|
||||||
perror(argv[3]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (verbose) fprintf(stderr, "Splice: %s\n", argv[3]);
|
|
||||||
splicebuf = malloc(1024*1024);
|
|
||||||
size_t splicelen = fread(splicebuf, 1, 1024*1024, splice);
|
|
||||||
if (!splicelen) {
|
|
||||||
fprintf(stderr, "Error: empty file %s\n", argv[3]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (verbose) fprintf(stderr, "Mutation splice length: %zu\n", splicelen);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (verbose) fprintf(stderr, "Mutation input length: %zu\n", inlen);
|
|
||||||
unsigned int outlen = afl_custom_fuzz(data, inbuf, inlen, &outbuf, splicebuf, splicelen, 1024*1024);
|
|
||||||
|
|
||||||
if (outlen == 0 || !outbuf) {
|
|
||||||
fprintf(stderr, "Error: no mutation data returned.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (verbose) fprintf(stderr, "Mutation output length: %zu\n", outlen);
|
|
||||||
|
|
||||||
if (fwrite(outbuf, 1, outlen, out) != outlen) {
|
|
||||||
fprintf(stderr, "Warning: incomplete write.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
# An AFL++ custom mutator using TritonDSE
|
|
||||||
|
|
||||||
## Installing the requirements
|
|
||||||
|
|
||||||
`pip3 install tritondse`
|
|
||||||
|
|
||||||
## How to run with an example
|
|
||||||
|
|
||||||
```
|
|
||||||
../../afl-cc -o ../../test-instr ../../test-instr.c
|
|
||||||
mkdir -p in
|
|
||||||
echo aaaa > in/in
|
|
||||||
AFL_DISABLE_TRIM=1 AFL_CUSTOM_MUTATOR_ONLY=1 AFL_SYNC_TIME=1 AFL_PYTHON_MODULE=aflpp_tritondse PYTHONPATH=. ../../afl-fuzz -i in -o out -- ../../test-instr
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that this custom mutator works differently, new finds are synced
|
|
||||||
after 10-60 seconds to the fuzzing instance. This is necessary because only
|
|
||||||
C/C++ custom mutators have access to the internal AFL++ state.
|
|
||||||
|
|
||||||
Note that you should run first with `AFL_DEBUG` for 5-10 minutes and see if
|
|
||||||
all important libraries and syscalls are hooked (look at `WARNING` and `CRITICAL`
|
|
||||||
output during the run, best use with `AFL_NO_UI=1`)
|
|
@ -1,220 +0,0 @@
|
|||||||
import sys
|
|
||||||
import os
|
|
||||||
import logging
|
|
||||||
import hashlib
|
|
||||||
|
|
||||||
from tritondse import CleLoader
|
|
||||||
from tritondse import CompositeData
|
|
||||||
from tritondse import Config
|
|
||||||
from tritondse import CoverageStrategy
|
|
||||||
from tritondse import ProcessState
|
|
||||||
from tritondse import Program
|
|
||||||
from tritondse import Seed
|
|
||||||
from tritondse import SeedFormat
|
|
||||||
from tritondse import SymbolicExecutor
|
|
||||||
from tritondse import SymbolicExplorator
|
|
||||||
|
|
||||||
is_debug = False
|
|
||||||
out_path = ""
|
|
||||||
input_file = None
|
|
||||||
prog = None
|
|
||||||
config = None
|
|
||||||
dse = None
|
|
||||||
cycle = 0
|
|
||||||
count = 0
|
|
||||||
finding = 0
|
|
||||||
hashes = set()
|
|
||||||
format = SeedFormat.RAW
|
|
||||||
|
|
||||||
def pre_exec_hook(se: SymbolicExecutor, state: ProcessState):
|
|
||||||
global count
|
|
||||||
global hashes
|
|
||||||
global finding
|
|
||||||
if se.seed.hash not in hashes:
|
|
||||||
hashes.add(se.seed.hash)
|
|
||||||
finding = 1
|
|
||||||
filename = out_path + "/id:" + f"{count:06}" + "," + se.seed.hash
|
|
||||||
if not os.path.exists(filename):
|
|
||||||
if is_debug:
|
|
||||||
print('Creating queue input ' + filename)
|
|
||||||
with open(filename, 'wb') as file:
|
|
||||||
if input_file:
|
|
||||||
file.write(se.seed.content.files[input_file])
|
|
||||||
else:
|
|
||||||
file.write(se.seed.content)
|
|
||||||
count += 1
|
|
||||||
#if input_file:
|
|
||||||
# if is_debug:
|
|
||||||
# print('Writing to ' + input_file + ' the content: ' + str(se.seed.content))
|
|
||||||
# with open(input_file, 'wb') as file:
|
|
||||||
# file.write(se.seed.content)
|
|
||||||
|
|
||||||
|
|
||||||
#def rtn_open(se: SymbolicExecutor, pstate: ProcessState, pc):
|
|
||||||
# """
|
|
||||||
# The open behavior.
|
|
||||||
# """
|
|
||||||
# logging.debug('open hooked')
|
|
||||||
#
|
|
||||||
# # Get arguments
|
|
||||||
# arg0 = pstate.get_argument_value(0) # const char *pathname
|
|
||||||
# flags = pstate.get_argument_value(1) # int flags
|
|
||||||
# mode = pstate.get_argument_value(2) # int mode
|
|
||||||
# arg0s = pstate.memory.read_string(arg0)
|
|
||||||
#
|
|
||||||
# # Concretize the whole path name
|
|
||||||
# pstate.concretize_memory_bytes(arg0, len(arg0s)+1) # Concretize the whole string + \0
|
|
||||||
#
|
|
||||||
# # We use flags as concrete value
|
|
||||||
# pstate.concretize_argument(1)
|
|
||||||
#
|
|
||||||
# # Use the flags to open the file in the write mode.
|
|
||||||
# mode = ""
|
|
||||||
# if (flags & 0xFF) == 0x00: # O_RDONLY
|
|
||||||
# mode = "r"
|
|
||||||
# elif (flags & 0xFF) == 0x01: # O_WRONLY
|
|
||||||
# mode = "w"
|
|
||||||
# elif (flags & 0xFF) == 0x02: # O_RDWR
|
|
||||||
# mode = "r+"
|
|
||||||
#
|
|
||||||
# if (flags & 0x0100): # O_CREAT
|
|
||||||
# mode += "x"
|
|
||||||
# if (flags & 0x0200): # O_APPEND
|
|
||||||
# mode = "a" # replace completely value
|
|
||||||
#
|
|
||||||
# if se.seed.is_file_defined(arg0s) and "r" in mode: # input file and opened in reading
|
|
||||||
# logging.info(f"opening an input file: {arg0s}")
|
|
||||||
# # Program is opening an input
|
|
||||||
# data = se.seed.get_file_input(arg0s)
|
|
||||||
# filedesc = pstate.create_file_descriptor(arg0s, io.BytesIO(data))
|
|
||||||
# fd = filedesc.id
|
|
||||||
# else:
|
|
||||||
# # Try to open it as a regular file
|
|
||||||
# try:
|
|
||||||
# fd = open(arg0s, mode) # use the mode here
|
|
||||||
# filedesc = pstate.create_file_descriptor(arg0s, fd)
|
|
||||||
# fd = filedesc.id
|
|
||||||
# except Exception as e:
|
|
||||||
# logging.debug(f"Failed to open {arg0s} {e}")
|
|
||||||
# fd = pstate.minus_one
|
|
||||||
#
|
|
||||||
# pstate.write_register("rax", fd) # write the return value
|
|
||||||
# pstate.cpu.program_counter = pstate.pop_stack_value() # pop the return value
|
|
||||||
# se.skip_instruction() # skip the current instruction so that the engine go straight fetching the next instruction
|
|
||||||
|
|
||||||
|
|
||||||
def init(seed):
|
|
||||||
global config
|
|
||||||
global dse
|
|
||||||
global format
|
|
||||||
global input_file
|
|
||||||
global is_debug
|
|
||||||
global out_path
|
|
||||||
global prog
|
|
||||||
# Load the program (LIEF-based program loader).
|
|
||||||
prog = CleLoader(os.environ['AFL_CUSTOM_INFO_PROGRAM'])
|
|
||||||
# Process other configuration environment variables.
|
|
||||||
argv = None
|
|
||||||
try:
|
|
||||||
foo = os.environ['AFL_DEBUG']
|
|
||||||
is_debug = True
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if is_debug:
|
|
||||||
logging.basicConfig(level=logging.WARNING)
|
|
||||||
else:
|
|
||||||
logging.basicConfig(level=logging.CRITICAL)
|
|
||||||
try:
|
|
||||||
foo = os.environ['AFL_CUSTOM_INFO_OUT']
|
|
||||||
out_path = foo + '/../tritondse/queue'
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
foo = os.environ['AFL_CUSTOM_INFO_PROGRAM_INPUT']
|
|
||||||
input_file = foo
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
argv_list = os.environ['AFL_CUSTOM_INFO_PROGRAM_ARGV']
|
|
||||||
argv_tmp = [ os.environ['AFL_CUSTOM_INFO_PROGRAM'] ]
|
|
||||||
argv_tmp += argv_list.split()
|
|
||||||
argv = []
|
|
||||||
# now check for @@
|
|
||||||
for item in argv_tmp:
|
|
||||||
if "@@" in item:
|
|
||||||
input_file = out_path + '/../.input'
|
|
||||||
argv.append(input_file)
|
|
||||||
else:
|
|
||||||
argv.append(item)
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
# Create the output directory
|
|
||||||
os.makedirs(out_path, exist_ok=True)
|
|
||||||
# Debug
|
|
||||||
if is_debug:
|
|
||||||
print('DEBUG target: ' + os.environ['AFL_CUSTOM_INFO_PROGRAM'])
|
|
||||||
if argv:
|
|
||||||
print('DEBUG argv: ')
|
|
||||||
print(argv)
|
|
||||||
if input_file:
|
|
||||||
print('DEBUG input_file: ' + input_file)
|
|
||||||
print('DEBUG out_path: ' + out_path)
|
|
||||||
print('')
|
|
||||||
if input_file:
|
|
||||||
format = SeedFormat.COMPOSITE
|
|
||||||
# Now set up TritonDSE
|
|
||||||
config = Config(coverage_strategy = CoverageStrategy.PATH,
|
|
||||||
# debug = is_debug,
|
|
||||||
pipe_stdout = is_debug,
|
|
||||||
pipe_stderr = is_debug,
|
|
||||||
execution_timeout = 1,
|
|
||||||
program_argv = argv,
|
|
||||||
smt_timeout= 50,
|
|
||||||
seed_format = format)
|
|
||||||
# Create an instance of the Symbolic Explorator
|
|
||||||
dse = SymbolicExplorator(config, prog)
|
|
||||||
# Add callbacks.
|
|
||||||
dse.callback_manager.register_pre_execution_callback(pre_exec_hook)
|
|
||||||
#dse.callback_manager.register_function_callback("open", rtn_open)
|
|
||||||
|
|
||||||
|
|
||||||
def fuzz(buf, add_buf, max_size):
|
|
||||||
global finding
|
|
||||||
finding = 1
|
|
||||||
while finding == 1:
|
|
||||||
finding = 0
|
|
||||||
dse.step()
|
|
||||||
return b""
|
|
||||||
|
|
||||||
|
|
||||||
def queue_new_entry(filename_new_queue, filename_orig_queue):
|
|
||||||
global cycle
|
|
||||||
global dse
|
|
||||||
# Add seed to the worklist.
|
|
||||||
with open(filename_new_queue, "rb") as file:
|
|
||||||
data = file.read()
|
|
||||||
hash = hashlib.md5(data).hexdigest()
|
|
||||||
if hash not in hashes:
|
|
||||||
hashes.add(hash)
|
|
||||||
if is_debug:
|
|
||||||
print("NEW FILE " + filename_new_queue + " hash " + hash + " count " + str(cycle))
|
|
||||||
cycle += 1
|
|
||||||
if input_file:
|
|
||||||
seed = Seed(CompositeData(files={"stdin": b"", # nothing on stdin
|
|
||||||
input_file: data}))
|
|
||||||
else:
|
|
||||||
seed = Seed(data)
|
|
||||||
dse.add_input_seed(seed)
|
|
||||||
# Start exploration!
|
|
||||||
#dse.step()
|
|
||||||
#dse.explore()
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# we simulate just doing one single fuzz in the custom mutator
|
|
||||||
def fuzz_count(buf):
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
def splice_optout():
|
|
||||||
pass
|
|
@ -1,7 +0,0 @@
|
|||||||
all: atnwalk.so
|
|
||||||
|
|
||||||
atnwalk.so: atnwalk.c
|
|
||||||
$(CC) -I ../../include/ -shared -fPIC -O3 -o atnwalk.so atnwalk.c
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.so *.o *~ core
|
|
@ -1,43 +0,0 @@
|
|||||||
# ATNwalk: Grammar-Based Fuzzing using Only Bit-Mutations
|
|
||||||
|
|
||||||
This is a custom mutator integration of ATNwalk that works by communicating via UNIX domain sockets.
|
|
||||||
|
|
||||||
Refer to [https://github.com/atnwalk/testbed](https://github.com/atnwalk/testbed) for detailed instructions on how to get ATNwalk running.
|
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
Just type `make` to build `atnwalk.so`.
|
|
||||||
|
|
||||||
## Run
|
|
||||||
|
|
||||||
**NOTE:** The commands below just demonstrate an example how running ATNwalk looks like and require a working [testbed](https://github.com/atnwalk/testbed)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# create the required a random seed first
|
|
||||||
mkdir -p ~/campaign/example/seeds
|
|
||||||
cd ~/campaign/example/seeds
|
|
||||||
head -c1 /dev/urandom | ~/atnwalk/build/javascript/bin/decode -wb > seed.decoded 2> seed.encoded
|
|
||||||
|
|
||||||
# create the required atnwalk directory and copy the seed
|
|
||||||
cd ../
|
|
||||||
mkdir -p atnwalk/in
|
|
||||||
cp ./seeds/seed.encoded atnwalk/in/seed
|
|
||||||
cd atnwalk
|
|
||||||
|
|
||||||
# assign to a single core when benchmarking it, change the CPU number as required
|
|
||||||
CPU_ID=0
|
|
||||||
|
|
||||||
# start the ATNwalk server
|
|
||||||
nohup taskset -c ${CPU_ID} ${HOME}/atnwalk/build/javascript/bin/server 100 > server.log 2>&1 &
|
|
||||||
|
|
||||||
# start AFL++ with ATNwalk
|
|
||||||
AFL_SKIP_CPUFREQ=1 \
|
|
||||||
AFL_DISABLE_TRIM=1 \
|
|
||||||
AFL_CUSTOM_MUTATOR_ONLY=1 \
|
|
||||||
AFL_CUSTOM_MUTATOR_LIBRARY=${HOME}/AFLplusplus/custom_mutators/atnwalk/atnwalk.so \
|
|
||||||
AFL_POST_PROCESS_KEEP_ORIGINAL=1 \
|
|
||||||
~/AFLplusplus/afl-fuzz -t 100 -i in/ -o out -b ${CPU_ID} -- ~/jerryscript/build/bin/jerry
|
|
||||||
|
|
||||||
# make sure to kill the ATNwalk server process after you're done
|
|
||||||
kill "$(cat atnwalk.pid)"
|
|
||||||
```
|
|
@ -1,539 +0,0 @@
|
|||||||
#include "afl-fuzz.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/un.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#define BUF_SIZE_INIT 4096
|
|
||||||
#define SOCKET_NAME "./atnwalk.socket"
|
|
||||||
|
|
||||||
// how many errors (e.g. timeouts) to tolerate until moving on to the next queue
|
|
||||||
// entry
|
|
||||||
#define ATNWALK_ERRORS_MAX 1
|
|
||||||
|
|
||||||
// how many execution timeouts to tolerate until moving on to the next queue
|
|
||||||
// entry
|
|
||||||
#define EXEC_TIMEOUT_MAX 2
|
|
||||||
|
|
||||||
// handshake constants
|
|
||||||
const uint8_t SERVER_ARE_YOU_ALIVE = 213;
|
|
||||||
const uint8_t SERVER_YES_I_AM_ALIVE = 42;
|
|
||||||
|
|
||||||
// control bits
|
|
||||||
const uint8_t SERVER_CROSSOVER_BIT = 0b00000001;
|
|
||||||
const uint8_t SERVER_MUTATE_BIT = 0b00000010;
|
|
||||||
const uint8_t SERVER_DECODE_BIT = 0b00000100;
|
|
||||||
const uint8_t SERVER_ENCODE_BIT = 0b00001000;
|
|
||||||
|
|
||||||
typedef struct atnwalk_mutator {
|
|
||||||
|
|
||||||
afl_state_t *afl;
|
|
||||||
uint8_t atnwalk_error_count;
|
|
||||||
uint64_t prev_timeouts;
|
|
||||||
uint32_t prev_hits;
|
|
||||||
uint32_t stage_havoc_cur;
|
|
||||||
uint32_t stage_havoc_max;
|
|
||||||
uint32_t stage_splice_cur;
|
|
||||||
uint32_t stage_splice_max;
|
|
||||||
uint8_t *fuzz_buf;
|
|
||||||
size_t fuzz_size;
|
|
||||||
uint8_t *post_process_buf;
|
|
||||||
size_t post_process_size;
|
|
||||||
|
|
||||||
} atnwalk_mutator_t;
|
|
||||||
|
|
||||||
int read_all(int fd, uint8_t *buf, size_t buf_size) {
|
|
||||||
|
|
||||||
int n;
|
|
||||||
size_t offset = 0;
|
|
||||||
while (offset < buf_size) {
|
|
||||||
|
|
||||||
n = read(fd, buf + offset, buf_size - offset);
|
|
||||||
if (n == -1) { return 0; }
|
|
||||||
offset += n;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int write_all(int fd, uint8_t *buf, size_t buf_size) {
|
|
||||||
|
|
||||||
int n;
|
|
||||||
size_t offset = 0;
|
|
||||||
while (offset < buf_size) {
|
|
||||||
|
|
||||||
n = write(fd, buf + offset, buf_size - offset);
|
|
||||||
if (n == -1) { return 0; }
|
|
||||||
offset += n;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_uint32(uint8_t *buf, uint32_t val) {
|
|
||||||
|
|
||||||
buf[0] = (uint8_t)(val >> 24);
|
|
||||||
buf[1] = (uint8_t)((val & 0x00ff0000) >> 16);
|
|
||||||
buf[2] = (uint8_t)((val & 0x0000ff00) >> 8);
|
|
||||||
buf[3] = (uint8_t)(val & 0x000000ff);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t to_uint32(uint8_t *buf) {
|
|
||||||
|
|
||||||
uint32_t val = 0;
|
|
||||||
val |= (((uint32_t)buf[0]) << 24);
|
|
||||||
val |= (((uint32_t)buf[1]) << 16);
|
|
||||||
val |= (((uint32_t)buf[2]) << 8);
|
|
||||||
val |= ((uint32_t)buf[3]);
|
|
||||||
return val;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void put_uint64(uint8_t *buf, uint64_t val) {
|
|
||||||
|
|
||||||
buf[0] = (uint8_t)(val >> 56);
|
|
||||||
buf[1] = (uint8_t)((val & 0x00ff000000000000) >> 48);
|
|
||||||
buf[2] = (uint8_t)((val & 0x0000ff0000000000) >> 40);
|
|
||||||
buf[3] = (uint8_t)((val & 0x000000ff00000000) >> 32);
|
|
||||||
buf[4] = (uint8_t)((val & 0x00000000ff000000) >> 24);
|
|
||||||
buf[5] = (uint8_t)((val & 0x0000000000ff0000) >> 16);
|
|
||||||
buf[6] = (uint8_t)((val & 0x000000000000ff00) >> 8);
|
|
||||||
buf[7] = (uint8_t)(val & 0x00000000000000ff);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize this custom mutator
|
|
||||||
*
|
|
||||||
* @param[in] afl a pointer to the internal state object. Can be ignored for
|
|
||||||
* now.
|
|
||||||
* @param[in] seed A seed for this mutator - the same seed should always mutate
|
|
||||||
* in the same way.
|
|
||||||
* @return Pointer to the data object this custom mutator instance should use.
|
|
||||||
* There may be multiple instances of this mutator in one afl-fuzz run!
|
|
||||||
* Return NULL on error.
|
|
||||||
*/
|
|
||||||
atnwalk_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|
||||||
|
|
||||||
srand(seed);
|
|
||||||
atnwalk_mutator_t *data =
|
|
||||||
(atnwalk_mutator_t *)malloc(sizeof(atnwalk_mutator_t));
|
|
||||||
if (!data) {
|
|
||||||
|
|
||||||
perror("afl_custom_init alloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->afl = afl;
|
|
||||||
data->prev_hits = 0;
|
|
||||||
data->fuzz_buf = (uint8_t *)malloc(BUF_SIZE_INIT);
|
|
||||||
data->fuzz_size = BUF_SIZE_INIT;
|
|
||||||
data->post_process_buf = (uint8_t *)malloc(BUF_SIZE_INIT);
|
|
||||||
data->post_process_size = BUF_SIZE_INIT;
|
|
||||||
return data;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int afl_custom_fuzz_count(atnwalk_mutator_t *data,
|
|
||||||
const unsigned char *buf, size_t buf_size) {
|
|
||||||
|
|
||||||
// afl_custom_fuzz_count is called exactly once before entering the
|
|
||||||
// 'stage-loop' for the current queue entry thus, we use it to reset the error
|
|
||||||
// count and to initialize stage variables (somewhat not intended by the API,
|
|
||||||
// but still better than rewriting the whole thing to have a custom mutator
|
|
||||||
// stage)
|
|
||||||
data->atnwalk_error_count = 0;
|
|
||||||
data->prev_timeouts = data->afl->total_tmouts;
|
|
||||||
|
|
||||||
// it might happen that on the last execution of the splice stage a new path
|
|
||||||
// is found we need to fix that here and count it
|
|
||||||
if (data->prev_hits) {
|
|
||||||
|
|
||||||
data->afl->stage_finds[STAGE_SPLICE] +=
|
|
||||||
data->afl->queued_items + data->afl->saved_crashes - data->prev_hits;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->prev_hits = data->afl->queued_items + data->afl->saved_crashes;
|
|
||||||
data->stage_havoc_cur = 0;
|
|
||||||
data->stage_splice_cur = 0;
|
|
||||||
|
|
||||||
// 50% havoc, 50% splice
|
|
||||||
data->stage_havoc_max = data->afl->stage_max >> 1;
|
|
||||||
if (data->stage_havoc_max < HAVOC_MIN) { data->stage_havoc_max = HAVOC_MIN; }
|
|
||||||
data->stage_splice_max = data->stage_havoc_max;
|
|
||||||
return data->stage_havoc_max + data->stage_splice_max;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t fail_fatal(int fd_socket, uint8_t **out_buf) {
|
|
||||||
|
|
||||||
if (fd_socket != -1) { close(fd_socket); }
|
|
||||||
*out_buf = NULL;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t fail_gracefully(int fd_socket, atnwalk_mutator_t *data, uint8_t *buf,
|
|
||||||
size_t buf_size, uint8_t **out_buf) {
|
|
||||||
|
|
||||||
if (fd_socket != -1) { close(fd_socket); }
|
|
||||||
data->atnwalk_error_count++;
|
|
||||||
if (data->atnwalk_error_count > ATNWALK_ERRORS_MAX) {
|
|
||||||
|
|
||||||
data->afl->stage_max = data->afl->stage_cur;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
*out_buf = buf;
|
|
||||||
return buf_size;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform custom mutations on a given input
|
|
||||||
*
|
|
||||||
* (Optional for now. Required in the future)
|
|
||||||
*
|
|
||||||
* @param[in] data pointer returned in afl_custom_init for this fuzz case
|
|
||||||
* @param[in] buf Pointer to input data to be mutated
|
|
||||||
* @param[in] buf_size Size of input data
|
|
||||||
* @param[out] out_buf the buffer we will work on. we can reuse *buf. NULL on
|
|
||||||
* error.
|
|
||||||
* @param[in] add_buf Buffer containing the additional test case
|
|
||||||
* @param[in] add_buf_size Size of the additional test case
|
|
||||||
* @param[in] max_size Maximum size of the mutated output. The mutation must not
|
|
||||||
* produce data larger than max_size.
|
|
||||||
* @return Size of the mutated output.
|
|
||||||
*/
|
|
||||||
size_t afl_custom_fuzz(atnwalk_mutator_t *data, uint8_t *buf, size_t buf_size,
|
|
||||||
uint8_t **out_buf, uint8_t *add_buf, size_t add_buf_size,
|
|
||||||
size_t max_size) {
|
|
||||||
|
|
||||||
struct sockaddr_un addr;
|
|
||||||
int fd_socket;
|
|
||||||
uint8_t ctrl_buf[8];
|
|
||||||
uint8_t wanted;
|
|
||||||
|
|
||||||
// let's display what's going on in a nice way
|
|
||||||
if (data->stage_havoc_cur == 0) {
|
|
||||||
|
|
||||||
data->afl->stage_name = (uint8_t *)"atnwalk - havoc";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data->stage_havoc_cur == data->stage_havoc_max) {
|
|
||||||
|
|
||||||
data->afl->stage_name = (uint8_t *)"atnwalk - splice";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// increase the respective havoc or splice counters
|
|
||||||
if (data->stage_havoc_cur < data->stage_havoc_max) {
|
|
||||||
|
|
||||||
data->stage_havoc_cur++;
|
|
||||||
data->afl->stage_cycles[STAGE_HAVOC]++;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// if there is nothing to splice, continue with havoc and skip splicing this
|
|
||||||
// time
|
|
||||||
if (data->afl->ready_for_splicing_count < 1) {
|
|
||||||
|
|
||||||
data->stage_havoc_max = data->afl->stage_max;
|
|
||||||
data->stage_havoc_cur++;
|
|
||||||
data->afl->stage_cycles[STAGE_HAVOC]++;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
data->stage_splice_cur++;
|
|
||||||
data->afl->stage_cycles[STAGE_SPLICE]++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// keep track of found new corpus seeds per stage
|
|
||||||
if (data->afl->queued_items + data->afl->saved_crashes > data->prev_hits) {
|
|
||||||
|
|
||||||
if (data->stage_splice_cur <= 1) {
|
|
||||||
|
|
||||||
data->afl->stage_finds[STAGE_HAVOC] +=
|
|
||||||
data->afl->queued_items + data->afl->saved_crashes - data->prev_hits;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
data->afl->stage_finds[STAGE_SPLICE] +=
|
|
||||||
data->afl->queued_items + data->afl->saved_crashes - data->prev_hits;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->prev_hits = data->afl->queued_items + data->afl->saved_crashes;
|
|
||||||
|
|
||||||
// check whether this input produces a lot of timeouts, if it does then
|
|
||||||
// abandon this queue entry
|
|
||||||
if (data->afl->total_tmouts - data->prev_timeouts >= EXEC_TIMEOUT_MAX) {
|
|
||||||
|
|
||||||
data->afl->stage_max = data->afl->stage_cur;
|
|
||||||
return fail_gracefully(-1, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// initialize the socket
|
|
||||||
fd_socket = socket(AF_UNIX, SOCK_STREAM, 0);
|
|
||||||
if (fd_socket == -1) { return fail_fatal(fd_socket, out_buf); }
|
|
||||||
memset(&addr, 0, sizeof(addr));
|
|
||||||
addr.sun_family = AF_UNIX;
|
|
||||||
strncpy(addr.sun_path, SOCKET_NAME, sizeof(addr.sun_path) - 1);
|
|
||||||
if (connect(fd_socket, (const struct sockaddr *)&addr, sizeof(addr)) == -1) {
|
|
||||||
|
|
||||||
return fail_fatal(fd_socket, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// ask whether the server is alive
|
|
||||||
ctrl_buf[0] = SERVER_ARE_YOU_ALIVE;
|
|
||||||
if (!write_all(fd_socket, ctrl_buf, 1)) {
|
|
||||||
|
|
||||||
return fail_fatal(fd_socket, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// see whether the server replies as expected
|
|
||||||
if (!read_all(fd_socket, ctrl_buf, 1) ||
|
|
||||||
ctrl_buf[0] != SERVER_YES_I_AM_ALIVE) {
|
|
||||||
|
|
||||||
return fail_fatal(fd_socket, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// tell the server what we want to do
|
|
||||||
wanted = SERVER_MUTATE_BIT | SERVER_ENCODE_BIT;
|
|
||||||
|
|
||||||
// perform a crossover if we are splicing
|
|
||||||
if (data->stage_splice_cur > 0) { wanted |= SERVER_CROSSOVER_BIT; }
|
|
||||||
|
|
||||||
// tell the server what we want and how much data will be sent
|
|
||||||
ctrl_buf[0] = wanted;
|
|
||||||
put_uint32(ctrl_buf + 1, (uint32_t)buf_size);
|
|
||||||
if (!write_all(fd_socket, ctrl_buf, 5)) {
|
|
||||||
|
|
||||||
return fail_fatal(fd_socket, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// send the data to mutate and encode
|
|
||||||
if (!write_all(fd_socket, buf, buf_size)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wanted & SERVER_CROSSOVER_BIT) {
|
|
||||||
|
|
||||||
// since we requested crossover, we will first tell how much additional data
|
|
||||||
// is to be expected
|
|
||||||
put_uint32(ctrl_buf, (uint32_t)add_buf_size);
|
|
||||||
if (!write_all(fd_socket, ctrl_buf, 4)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// send the additional data for crossover
|
|
||||||
if (!write_all(fd_socket, add_buf, add_buf_size)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// lastly, a seed is required for crossover so send one
|
|
||||||
put_uint64(ctrl_buf, (uint64_t)rand());
|
|
||||||
if (!write_all(fd_socket, ctrl_buf, 8)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// since we requested mutation, we need to provide a seed for that
|
|
||||||
put_uint64(ctrl_buf, (uint64_t)rand());
|
|
||||||
if (!write_all(fd_socket, ctrl_buf, 8)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// obtain the required buffer size for the data that will be returned
|
|
||||||
if (!read_all(fd_socket, ctrl_buf, 4)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t new_size = (size_t)to_uint32(ctrl_buf);
|
|
||||||
|
|
||||||
// if the data is too large then we ignore this round
|
|
||||||
if (new_size > max_size) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_size > buf_size) {
|
|
||||||
|
|
||||||
// buf is too small, need to use data->fuzz_buf, let's see whether we need
|
|
||||||
// to reallocate
|
|
||||||
if (new_size > data->fuzz_size) {
|
|
||||||
|
|
||||||
data->fuzz_size = new_size << 1;
|
|
||||||
data->fuzz_buf = (uint8_t *)realloc(data->fuzz_buf, data->fuzz_size);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
*out_buf = data->fuzz_buf;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// new_size fits into buf, so re-use it
|
|
||||||
*out_buf = buf;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// obtain the encoded data
|
|
||||||
if (!read_all(fd_socket, *out_buf, new_size)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
close(fd_socket);
|
|
||||||
return new_size;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A post-processing function to use right before AFL writes the test case to
|
|
||||||
* disk in order to execute the target.
|
|
||||||
*
|
|
||||||
* (Optional) If this functionality is not needed, simply don't define this
|
|
||||||
* function.
|
|
||||||
*
|
|
||||||
* @param[in] data pointer returned in afl_custom_init for this fuzz case
|
|
||||||
* @param[in] buf Buffer containing the test case to be executed
|
|
||||||
* @param[in] buf_size Size of the test case
|
|
||||||
* @param[out] out_buf Pointer to the buffer containing the test case after
|
|
||||||
* processing. External library should allocate memory for out_buf.
|
|
||||||
* The buf pointer may be reused (up to the given buf_size);
|
|
||||||
* @return Size of the output buffer after processing or the needed amount.
|
|
||||||
* A return of 0 indicates an error.
|
|
||||||
*/
|
|
||||||
size_t afl_custom_post_process(atnwalk_mutator_t *data, uint8_t *buf,
|
|
||||||
size_t buf_size, uint8_t **out_buf) {
|
|
||||||
|
|
||||||
struct sockaddr_un addr;
|
|
||||||
int fd_socket;
|
|
||||||
uint8_t ctrl_buf[8];
|
|
||||||
|
|
||||||
// initialize the socket
|
|
||||||
fd_socket = socket(AF_UNIX, SOCK_STREAM, 0);
|
|
||||||
if (fd_socket == -1) { return fail_fatal(fd_socket, out_buf); }
|
|
||||||
memset(&addr, 0, sizeof(addr));
|
|
||||||
addr.sun_family = AF_UNIX;
|
|
||||||
strncpy(addr.sun_path, SOCKET_NAME, sizeof(addr.sun_path) - 1);
|
|
||||||
if (connect(fd_socket, (const struct sockaddr *)&addr, sizeof(addr)) == -1) {
|
|
||||||
|
|
||||||
return fail_fatal(fd_socket, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// ask whether the server is alive
|
|
||||||
ctrl_buf[0] = SERVER_ARE_YOU_ALIVE;
|
|
||||||
if (!write_all(fd_socket, ctrl_buf, 1)) {
|
|
||||||
|
|
||||||
return fail_fatal(fd_socket, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// see whether the server replies as expected
|
|
||||||
if (!read_all(fd_socket, ctrl_buf, 1) ||
|
|
||||||
ctrl_buf[0] != SERVER_YES_I_AM_ALIVE) {
|
|
||||||
|
|
||||||
return fail_fatal(fd_socket, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// tell the server what we want and how much data will be sent
|
|
||||||
ctrl_buf[0] = SERVER_DECODE_BIT;
|
|
||||||
put_uint32(ctrl_buf + 1, (uint32_t)buf_size);
|
|
||||||
if (!write_all(fd_socket, ctrl_buf, 5)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// send the data to decode
|
|
||||||
if (!write_all(fd_socket, buf, buf_size)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// obtain the required buffer size for the data that will be returned
|
|
||||||
if (!read_all(fd_socket, ctrl_buf, 4)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t new_size = (size_t)to_uint32(ctrl_buf);
|
|
||||||
|
|
||||||
// need to use data->post_process_buf, let's see whether we need to reallocate
|
|
||||||
if (new_size > data->post_process_size) {
|
|
||||||
|
|
||||||
data->post_process_size = new_size << 1;
|
|
||||||
data->post_process_buf =
|
|
||||||
(uint8_t *)realloc(data->post_process_buf, data->post_process_size);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
*out_buf = data->post_process_buf;
|
|
||||||
|
|
||||||
// obtain the decoded data
|
|
||||||
if (!read_all(fd_socket, *out_buf, new_size)) {
|
|
||||||
|
|
||||||
return fail_gracefully(fd_socket, data, buf, buf_size, out_buf);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
close(fd_socket);
|
|
||||||
return new_size;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deinitialize everything
|
|
||||||
*
|
|
||||||
* @param data The data ptr from afl_custom_init
|
|
||||||
*/
|
|
||||||
void afl_custom_deinit(atnwalk_mutator_t *data) {
|
|
||||||
|
|
||||||
free(data->fuzz_buf);
|
|
||||||
free(data->post_process_buf);
|
|
||||||
free(data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
ifdef debug
|
|
||||||
CPPLAGS += -fsanitize=address
|
|
||||||
CXXFLAGS += -Wall
|
|
||||||
CC := clang
|
|
||||||
CXX := clang++
|
|
||||||
endif
|
|
||||||
ifdef DEBUG
|
|
||||||
CPPFLAGS += -fsanitize=address
|
|
||||||
CXXFLAGS += -Wall
|
|
||||||
CC := clang
|
|
||||||
CXX := clang++
|
|
||||||
endif
|
|
||||||
|
|
||||||
all: autotokens.so
|
|
||||||
|
|
||||||
afl-fuzz-queue.o: ../../src/afl-fuzz-queue.c
|
|
||||||
$(CC) -D_STANDALONE_MODULE=1 -I../../include -g -O3 $(CPPFLAGS) -fPIC -c -o ./afl-fuzz-queue.o ../../src/afl-fuzz-queue.c
|
|
||||||
|
|
||||||
afl-common.o: ../../src/afl-common.c
|
|
||||||
$(CC) -I../../include -g -O3 $(CPPFLAGS) -DBIN_PATH=\"dummy\" -Wno-pointer-sign -fPIC -c -o ./afl-common.o ../../src/afl-common.c
|
|
||||||
|
|
||||||
autotokens.so: afl-fuzz-queue.o afl-common.o autotokens.cpp
|
|
||||||
$(CXX) -Wno-deprecated -g -O3 $(CXXFLAGS) $(CPPFLAGS) -shared -fPIC -o autotokens.so -I../../include autotokens.cpp ./afl-fuzz-queue.o ../../src/afl-performance.o ./afl-common.o
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f autotokens.so *.o *~ core
|
|
@ -1,34 +0,0 @@
|
|||||||
# Autotokens
|
|
||||||
|
|
||||||
This implements an improved autotoken grammar fuzzing idea presented in
|
|
||||||
[Token-Level Fuzzing][https://www.usenix.org/system/files/sec21-salls.pdf].
|
|
||||||
It is a grammar fuzzer without actually knowing the grammar, but only works
|
|
||||||
with text based inputs.
|
|
||||||
|
|
||||||
It is recommended to run with together in an instance with `CMPLOG`.
|
|
||||||
|
|
||||||
If you have a dictionary (`-x`) this improves this custom grammar mutator.
|
|
||||||
|
|
||||||
If **not** running with `CMPLOG`, it is possible to set
|
|
||||||
`AFL_CUSTOM_MUTATOR_ONLY` to concentrate on grammar bug classes.
|
|
||||||
|
|
||||||
Do **not** set `AFL_DISABLE_TRIM` with this custom mutator!
|
|
||||||
|
|
||||||
## Configuration via environment variables
|
|
||||||
|
|
||||||
`AUTOTOKENS_ONLY_FAV` - only use this mutator on favorite queue items
|
|
||||||
`AUTOTOKENS_COMMENT` - what character or string starts a comment which will be
|
|
||||||
removed. Default: `/* ... */`
|
|
||||||
`AUTOTOKENS_FUZZ_COUNT_SHIFT` - reduce the number of fuzzing performed, shifting
|
|
||||||
the value by this number, e.g. 1.
|
|
||||||
`AUTOTOKENS_AUTO_DISABLE` - disable this module if the seeds are not ascii
|
|
||||||
(or no input and no (ascii) dictionary)
|
|
||||||
`AUTOTOKENS_LEARN_DICT` - learn from dictionaries?
|
|
||||||
0 = none
|
|
||||||
1 = only -x or autodict
|
|
||||||
2 = -x, autodict and `CMPLOG`
|
|
||||||
`AUTOTOKENS_CHANGE_MIN` - minimum number of mutations (1-256, default 8)
|
|
||||||
`AUTOTOKENS_CHANGE_MAX` - maximum number of mutations (1-4096, default 64)
|
|
||||||
`AUTOTOKENS_CREATE_FROM_THIN_AIR` - if only one small start file is present and
|
|
||||||
a dictionary loaded then create one initial
|
|
||||||
structure based on the dictionary.
|
|
File diff suppressed because it is too large
Load Diff
@ -33,6 +33,3 @@ like surgical_havoc_mutate() that allow to perform a randomly chosen
|
|||||||
mutation from a subset of the havoc mutations.
|
mutation from a subset of the havoc mutations.
|
||||||
If you do so, you have to specify -I /path/to/AFLplusplus/include when
|
If you do so, you have to specify -I /path/to/AFLplusplus/include when
|
||||||
compiling.
|
compiling.
|
||||||
|
|
||||||
elf_header_mutator.c - example ELF header mutator based on
|
|
||||||
[LibGolf](https://github.com/xcellerator/libgolf/)
|
|
||||||
|
342
custom_mutators/examples/custom_mutator_helpers.h
Normal file
342
custom_mutators/examples/custom_mutator_helpers.h
Normal file
@ -0,0 +1,342 @@
|
|||||||
|
#ifndef CUSTOM_MUTATOR_HELPERS
|
||||||
|
#define CUSTOM_MUTATOR_HELPERS
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "types.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define INITIAL_GROWTH_SIZE (64)
|
||||||
|
|
||||||
|
#define RAND_BELOW(limit) (rand() % (limit))
|
||||||
|
|
||||||
|
/* Use in a struct: creates a name_buf and a name_size variable. */
|
||||||
|
#define BUF_VAR(type, name) \
|
||||||
|
type * name##_buf; \
|
||||||
|
size_t name##_size;
|
||||||
|
/* this fills in `&structptr->something_buf, &structptr->something_size`. */
|
||||||
|
#define BUF_PARAMS(struct, name) \
|
||||||
|
(void **)&struct->name##_buf, &struct->name##_size
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
} afl_t;
|
||||||
|
|
||||||
|
static void surgical_havoc_mutate(u8 *out_buf, s32 begin, s32 end) {
|
||||||
|
|
||||||
|
static s8 interesting_8[] = {INTERESTING_8};
|
||||||
|
static s16 interesting_16[] = {INTERESTING_8, INTERESTING_16};
|
||||||
|
static s32 interesting_32[] = {INTERESTING_8, INTERESTING_16, INTERESTING_32};
|
||||||
|
|
||||||
|
switch (RAND_BELOW(12)) {
|
||||||
|
|
||||||
|
case 0: {
|
||||||
|
|
||||||
|
/* Flip a single bit somewhere. Spooky! */
|
||||||
|
|
||||||
|
s32 bit_idx = ((RAND_BELOW(end - begin) + begin) << 3) + RAND_BELOW(8);
|
||||||
|
|
||||||
|
out_buf[bit_idx >> 3] ^= 128 >> (bit_idx & 7);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 1: {
|
||||||
|
|
||||||
|
/* Set byte to interesting value. */
|
||||||
|
|
||||||
|
u8 val = interesting_8[RAND_BELOW(sizeof(interesting_8))];
|
||||||
|
out_buf[(RAND_BELOW(end - begin) + begin)] = val;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2: {
|
||||||
|
|
||||||
|
/* Set word to interesting value, randomly choosing endian. */
|
||||||
|
|
||||||
|
if (end - begin < 2) break;
|
||||||
|
|
||||||
|
s32 byte_idx = (RAND_BELOW(end - begin) + begin);
|
||||||
|
|
||||||
|
if (byte_idx >= end - 1) break;
|
||||||
|
|
||||||
|
switch (RAND_BELOW(2)) {
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
*(u16 *)(out_buf + byte_idx) =
|
||||||
|
interesting_16[RAND_BELOW(sizeof(interesting_16) >> 1)];
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
*(u16 *)(out_buf + byte_idx) =
|
||||||
|
SWAP16(interesting_16[RAND_BELOW(sizeof(interesting_16) >> 1)]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 3: {
|
||||||
|
|
||||||
|
/* Set dword to interesting value, randomly choosing endian. */
|
||||||
|
|
||||||
|
if (end - begin < 4) break;
|
||||||
|
|
||||||
|
s32 byte_idx = (RAND_BELOW(end - begin) + begin);
|
||||||
|
|
||||||
|
if (byte_idx >= end - 3) break;
|
||||||
|
|
||||||
|
switch (RAND_BELOW(2)) {
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
*(u32 *)(out_buf + byte_idx) =
|
||||||
|
interesting_32[RAND_BELOW(sizeof(interesting_32) >> 2)];
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
*(u32 *)(out_buf + byte_idx) =
|
||||||
|
SWAP32(interesting_32[RAND_BELOW(sizeof(interesting_32) >> 2)]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 4: {
|
||||||
|
|
||||||
|
/* Set qword to interesting value, randomly choosing endian. */
|
||||||
|
|
||||||
|
if (end - begin < 8) break;
|
||||||
|
|
||||||
|
s32 byte_idx = (RAND_BELOW(end - begin) + begin);
|
||||||
|
|
||||||
|
if (byte_idx >= end - 7) break;
|
||||||
|
|
||||||
|
switch (RAND_BELOW(2)) {
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
*(u64 *)(out_buf + byte_idx) =
|
||||||
|
(s64)interesting_32[RAND_BELOW(sizeof(interesting_32) >> 2)];
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
*(u64 *)(out_buf + byte_idx) = SWAP64(
|
||||||
|
(s64)interesting_32[RAND_BELOW(sizeof(interesting_32) >> 2)]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 5: {
|
||||||
|
|
||||||
|
/* Randomly subtract from byte. */
|
||||||
|
|
||||||
|
out_buf[(RAND_BELOW(end - begin) + begin)] -= 1 + RAND_BELOW(ARITH_MAX);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 6: {
|
||||||
|
|
||||||
|
/* Randomly add to byte. */
|
||||||
|
|
||||||
|
out_buf[(RAND_BELOW(end - begin) + begin)] += 1 + RAND_BELOW(ARITH_MAX);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 7: {
|
||||||
|
|
||||||
|
/* Randomly subtract from word, random endian. */
|
||||||
|
|
||||||
|
if (end - begin < 2) break;
|
||||||
|
|
||||||
|
s32 byte_idx = (RAND_BELOW(end - begin) + begin);
|
||||||
|
|
||||||
|
if (byte_idx >= end - 1) break;
|
||||||
|
|
||||||
|
if (RAND_BELOW(2)) {
|
||||||
|
|
||||||
|
*(u16 *)(out_buf + byte_idx) -= 1 + RAND_BELOW(ARITH_MAX);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
u16 num = 1 + RAND_BELOW(ARITH_MAX);
|
||||||
|
|
||||||
|
*(u16 *)(out_buf + byte_idx) =
|
||||||
|
SWAP16(SWAP16(*(u16 *)(out_buf + byte_idx)) - num);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 8: {
|
||||||
|
|
||||||
|
/* Randomly add to word, random endian. */
|
||||||
|
|
||||||
|
if (end - begin < 2) break;
|
||||||
|
|
||||||
|
s32 byte_idx = (RAND_BELOW(end - begin) + begin);
|
||||||
|
|
||||||
|
if (byte_idx >= end - 1) break;
|
||||||
|
|
||||||
|
if (RAND_BELOW(2)) {
|
||||||
|
|
||||||
|
*(u16 *)(out_buf + byte_idx) += 1 + RAND_BELOW(ARITH_MAX);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
u16 num = 1 + RAND_BELOW(ARITH_MAX);
|
||||||
|
|
||||||
|
*(u16 *)(out_buf + byte_idx) =
|
||||||
|
SWAP16(SWAP16(*(u16 *)(out_buf + byte_idx)) + num);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 9: {
|
||||||
|
|
||||||
|
/* Randomly subtract from dword, random endian. */
|
||||||
|
|
||||||
|
if (end - begin < 4) break;
|
||||||
|
|
||||||
|
s32 byte_idx = (RAND_BELOW(end - begin) + begin);
|
||||||
|
|
||||||
|
if (byte_idx >= end - 3) break;
|
||||||
|
|
||||||
|
if (RAND_BELOW(2)) {
|
||||||
|
|
||||||
|
*(u32 *)(out_buf + byte_idx) -= 1 + RAND_BELOW(ARITH_MAX);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
u32 num = 1 + RAND_BELOW(ARITH_MAX);
|
||||||
|
|
||||||
|
*(u32 *)(out_buf + byte_idx) =
|
||||||
|
SWAP32(SWAP32(*(u32 *)(out_buf + byte_idx)) - num);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 10: {
|
||||||
|
|
||||||
|
/* Randomly add to dword, random endian. */
|
||||||
|
|
||||||
|
if (end - begin < 4) break;
|
||||||
|
|
||||||
|
s32 byte_idx = (RAND_BELOW(end - begin) + begin);
|
||||||
|
|
||||||
|
if (byte_idx >= end - 3) break;
|
||||||
|
|
||||||
|
if (RAND_BELOW(2)) {
|
||||||
|
|
||||||
|
*(u32 *)(out_buf + byte_idx) += 1 + RAND_BELOW(ARITH_MAX);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
u32 num = 1 + RAND_BELOW(ARITH_MAX);
|
||||||
|
|
||||||
|
*(u32 *)(out_buf + byte_idx) =
|
||||||
|
SWAP32(SWAP32(*(u32 *)(out_buf + byte_idx)) + num);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case 11: {
|
||||||
|
|
||||||
|
/* Just set a random byte to a random value. Because,
|
||||||
|
why not. We use XOR with 1-255 to eliminate the
|
||||||
|
possibility of a no-op. */
|
||||||
|
|
||||||
|
out_buf[(RAND_BELOW(end - begin) + begin)] ^= 1 + RAND_BELOW(255);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function calculates the next power of 2 greater or equal its argument.
|
||||||
|
@return The rounded up power of 2 (if no overflow) or 0 on overflow.
|
||||||
|
*/
|
||||||
|
static inline size_t next_pow2(size_t in) {
|
||||||
|
|
||||||
|
if (in == 0 || in > (size_t)-1)
|
||||||
|
return 0; /* avoid undefined behaviour under-/overflow */
|
||||||
|
size_t out = in - 1;
|
||||||
|
out |= out >> 1;
|
||||||
|
out |= out >> 2;
|
||||||
|
out |= out >> 4;
|
||||||
|
out |= out >> 8;
|
||||||
|
out |= out >> 16;
|
||||||
|
return out + 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function makes sure *size is > size_needed after call.
|
||||||
|
It will realloc *buf otherwise.
|
||||||
|
*size will grow exponentially as per:
|
||||||
|
https://blog.mozilla.org/nnethercote/2014/11/04/please-grow-your-buffers-exponentially/
|
||||||
|
Will return NULL and free *buf if size_needed is <1 or realloc failed.
|
||||||
|
@return For convenience, this function returns *buf.
|
||||||
|
*/
|
||||||
|
static inline void *maybe_grow(void **buf, size_t *size, size_t size_needed) {
|
||||||
|
|
||||||
|
/* No need to realloc */
|
||||||
|
if (likely(size_needed && *size >= size_needed)) return *buf;
|
||||||
|
|
||||||
|
/* No initial size was set */
|
||||||
|
if (size_needed < INITIAL_GROWTH_SIZE) size_needed = INITIAL_GROWTH_SIZE;
|
||||||
|
|
||||||
|
/* grow exponentially */
|
||||||
|
size_t next_size = next_pow2(size_needed);
|
||||||
|
|
||||||
|
/* handle overflow */
|
||||||
|
if (!next_size) { next_size = size_needed; }
|
||||||
|
|
||||||
|
/* alloc */
|
||||||
|
*buf = realloc(*buf, next_size);
|
||||||
|
*size = *buf ? next_size : 0;
|
||||||
|
|
||||||
|
return *buf;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Swaps buf1 ptr and buf2 ptr, as well as their sizes */
|
||||||
|
static inline void afl_swap_bufs(void **buf1, size_t *size1, void **buf2,
|
||||||
|
size_t *size2) {
|
||||||
|
|
||||||
|
void * scratch_buf = *buf1;
|
||||||
|
size_t scratch_size = *size1;
|
||||||
|
*buf1 = *buf2;
|
||||||
|
*size1 = *size2;
|
||||||
|
*buf2 = scratch_buf;
|
||||||
|
*size2 = scratch_size;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef INITIAL_GROWTH_SIZE
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -1,53 +0,0 @@
|
|||||||
//
|
|
||||||
// This is an example on how to use afl_custom_post_run
|
|
||||||
// It executes custom code each time after AFL++ executes the target
|
|
||||||
//
|
|
||||||
// cc -O3 -fPIC -shared -g -o custom_post_run.so -I../../include custom_post_run.c
|
|
||||||
// cd ../..
|
|
||||||
// afl-cc -o test-instr test-instr.c
|
|
||||||
// AFL_CUSTOM_MUTATOR_LIBRARY=custom_mutators/examples/custom_post_run.so \
|
|
||||||
// afl-fuzz -i in -o out -- ./test-instr -f /tmp/foo
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
#include "afl-fuzz.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
typedef struct my_mutator {
|
|
||||||
|
|
||||||
afl_state_t *afl;
|
|
||||||
|
|
||||||
} my_mutator_t;
|
|
||||||
|
|
||||||
my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|
||||||
|
|
||||||
my_mutator_t *data = calloc(1, sizeof(my_mutator_t));
|
|
||||||
if (!data) {
|
|
||||||
|
|
||||||
perror("afl_custom_init alloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->afl = afl;
|
|
||||||
|
|
||||||
return data;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void afl_custom_post_run(my_mutator_t *data) {
|
|
||||||
|
|
||||||
printf("hello from afl_custom_post_run\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void afl_custom_deinit(my_mutator_t *data) {
|
|
||||||
|
|
||||||
free(data);
|
|
||||||
|
|
||||||
}
|
|
@ -1,63 +0,0 @@
|
|||||||
//
|
|
||||||
// This is an example on how to use afl_custom_send
|
|
||||||
// It writes each mutated data set to /tmp/foo
|
|
||||||
// You can modify this to send to IPC, shared memory, etc.
|
|
||||||
//
|
|
||||||
// cc -O3 -fPIC -shared -g -o custom_send.so -I../../include custom_send.c
|
|
||||||
// cd ../..
|
|
||||||
// afl-cc -o test-instr test-instr.c
|
|
||||||
// AFL_CUSTOM_MUTATOR_LIBRARY=custom_mutators/examples/custom_send.so \
|
|
||||||
// afl-fuzz -i in -o out -- ./test-instr -f /tmp/foo
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include "afl-fuzz.h"
|
|
||||||
|
|
||||||
typedef struct my_mutator {
|
|
||||||
|
|
||||||
afl_state_t *afl;
|
|
||||||
|
|
||||||
} my_mutator_t;
|
|
||||||
|
|
||||||
my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|
||||||
|
|
||||||
my_mutator_t *data = calloc(1, sizeof(my_mutator_t));
|
|
||||||
if (!data) {
|
|
||||||
|
|
||||||
perror("afl_custom_init alloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->afl = afl;
|
|
||||||
|
|
||||||
return data;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void afl_custom_fuzz_send(my_mutator_t *data, uint8_t *buf, size_t buf_size) {
|
|
||||||
|
|
||||||
int fd = open("/tmp/foo", O_CREAT | O_NOFOLLOW | O_TRUNC | O_RDWR, 0644);
|
|
||||||
|
|
||||||
if (fd >= 0) {
|
|
||||||
|
|
||||||
(void)write(fd, buf, buf_size);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void afl_custom_deinit(my_mutator_t *data) {
|
|
||||||
|
|
||||||
free(data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,679 +0,0 @@
|
|||||||
/*
|
|
||||||
AFL++ Custom Mutator for ELF Headers
|
|
||||||
Written by @echel0n <melih.sahin@protonmail.com>
|
|
||||||
based on libgolf.h by @xcellerator
|
|
||||||
$ gcc -O3 -fPIC -shared -o elf_mutator.so -I ~/AFLplusplus/include/
|
|
||||||
*/
|
|
||||||
#include "afl-fuzz.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <linux/elf.h>
|
|
||||||
|
|
||||||
/* EI_ABIVERSION isn't used anymore and elf.h defines EI_PAD to be 0x09 */
|
|
||||||
#define EI_ABIVERSION 0x08
|
|
||||||
#define EI_PAD 0x09
|
|
||||||
/* Define the Architecture and ISA constants to match those in <linux/elf.h> */
|
|
||||||
#define X86_64 EM_X86_64
|
|
||||||
#define ARM32 EM_ARM
|
|
||||||
#define AARCH64 EM_AARCH64
|
|
||||||
#define uchar unsigned char
|
|
||||||
#define DATA_SIZE 0x100
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The ELF and Program headers are different sizes depending on 32- and 64-bit
|
|
||||||
* architectures
|
|
||||||
* taken from libgolf.h
|
|
||||||
*/
|
|
||||||
#define EHDR_T(x) Elf##x##_Ehdr
|
|
||||||
#define PHDR_T(x) Elf##x##_Phdr
|
|
||||||
#define EHDR(x) ehdr##x
|
|
||||||
#define PHDR(x) phdr##x
|
|
||||||
#define GET_EHDR(x) (&(elf_ptr->EHDR(x)));
|
|
||||||
#define GET_PHDR(x) (&(elf_ptr->PHDR(x)));
|
|
||||||
#define REF_EHDR(b, x) ((Elf##b##_Ehdr *)ehdr)->x
|
|
||||||
#define REF_PHDR(b, x) ((Elf##b##_Phdr *)phdr)->x
|
|
||||||
int ehdr_size;
|
|
||||||
int phdr_size;
|
|
||||||
/*
|
|
||||||
* This struct holds the bytes that will be executed, and the size.
|
|
||||||
*/
|
|
||||||
typedef struct text_segment {
|
|
||||||
|
|
||||||
size_t text_size;
|
|
||||||
unsigned char *text_segment;
|
|
||||||
|
|
||||||
} TextSegment;
|
|
||||||
|
|
||||||
// example shellcode that exits
|
|
||||||
// taken from libgolf.h
|
|
||||||
unsigned char buf[] = {0xb0, 0x3c, 0x31, 0xff, 0x0f, 0x05};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the raw ELF file
|
|
||||||
* - EHDR(xx) is the ELF header
|
|
||||||
* - PHDR(xx) is the program header
|
|
||||||
* - text is the text segment
|
|
||||||
* - filename is the name of the golf'd binary
|
|
||||||
* - isa is the target architecture (X86_64, ARM32, AARCH64)
|
|
||||||
* taken from libgolf.h
|
|
||||||
*/
|
|
||||||
typedef struct rawbinary_t {
|
|
||||||
|
|
||||||
EHDR_T(32) EHDR(32);
|
|
||||||
PHDR_T(32) PHDR(32);
|
|
||||||
EHDR_T(64) EHDR(64);
|
|
||||||
PHDR_T(64) PHDR(64);
|
|
||||||
TextSegment text;
|
|
||||||
char *filename;
|
|
||||||
int isa;
|
|
||||||
|
|
||||||
} RawBinary;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copy an E_IDENT array into the corresponding fields in the ELF header
|
|
||||||
* Called by populate_ehdr()
|
|
||||||
* taken from libgolf.h
|
|
||||||
*/
|
|
||||||
int populate_e_ident(RawBinary *elf_ptr, unsigned char e_ident[]) {
|
|
||||||
|
|
||||||
int i;
|
|
||||||
/* Depending on whether the target ISA is 32- or 64-bit, set e_ident */
|
|
||||||
switch (elf_ptr->isa) {
|
|
||||||
|
|
||||||
case X86_64:
|
|
||||||
case AARCH64:
|
|
||||||
for (i = 0; i < EI_NIDENT; i++)
|
|
||||||
elf_ptr->EHDR(64).e_ident[i] = e_ident[i];
|
|
||||||
break;
|
|
||||||
case ARM32:
|
|
||||||
for (i = 0; i < EI_NIDENT; i++)
|
|
||||||
elf_ptr->EHDR(32).e_ident[i] = e_ident[i];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copy bytes from buf[] array into text_segment in ELF struct
|
|
||||||
* taken from libgolf.h
|
|
||||||
*/
|
|
||||||
int copy_text_segment(RawBinary *elf_ptr, unsigned char buf[], int text_size) {
|
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Set size of text segment and allocate the buffer */
|
|
||||||
elf_ptr->text.text_size = text_size;
|
|
||||||
elf_ptr->text.text_segment =
|
|
||||||
malloc(elf_ptr->text.text_size * sizeof(unsigned char));
|
|
||||||
|
|
||||||
/* Copy the bytes into the text segment buffer */
|
|
||||||
for (i = 0; i < elf_ptr->text.text_size; i++) {
|
|
||||||
|
|
||||||
elf_ptr->text.text_segment[i] = buf[i];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Populate the ELF Header with sane values
|
|
||||||
* Returns a pointer to an EHDR struct
|
|
||||||
* taken from libgolf.h
|
|
||||||
*/
|
|
||||||
void *populate_ehdr(RawBinary *elf_ptr) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set ehdr_size and phdr_size. Determined by whether target ISA is 32- or
|
|
||||||
* 64-bit.
|
|
||||||
*/
|
|
||||||
switch (elf_ptr->isa) {
|
|
||||||
|
|
||||||
case X86_64:
|
|
||||||
case AARCH64:
|
|
||||||
ehdr_size = sizeof(EHDR_T(64));
|
|
||||||
phdr_size = sizeof(PHDR_T(64));
|
|
||||||
break;
|
|
||||||
case ARM32:
|
|
||||||
ehdr_size = sizeof(EHDR_T(32));
|
|
||||||
phdr_size = sizeof(PHDR_T(32));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Start with the E_IDENT area at the top of the file */
|
|
||||||
unsigned char e_ident[EI_NIDENT] = {0};
|
|
||||||
|
|
||||||
/* Magic Bytes */
|
|
||||||
e_ident[EI_MAG0] = 0x7F;
|
|
||||||
e_ident[EI_MAG1] = 0x45; // E
|
|
||||||
e_ident[EI_MAG2] = 0x4C; // L
|
|
||||||
e_ident[EI_MAG3] = 0x46; // F
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EI_CLASS denotes the architecture:
|
|
||||||
* ELFCLASS32: 0x01
|
|
||||||
* ELFCLASS64: 0x02
|
|
||||||
*/
|
|
||||||
switch (elf_ptr->isa) {
|
|
||||||
|
|
||||||
case X86_64:
|
|
||||||
case AARCH64:
|
|
||||||
e_ident[EI_CLASS] = ELFCLASS64;
|
|
||||||
break;
|
|
||||||
case ARM32:
|
|
||||||
e_ident[EI_CLASS] = ELFCLASS32;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EI_DATA denotes the endianness:
|
|
||||||
* ELFDATA2LSB: 0x01
|
|
||||||
* ELFDATA2MSB: 0x02
|
|
||||||
*/
|
|
||||||
e_ident[EI_DATA] = ELFDATA2LSB;
|
|
||||||
|
|
||||||
/* EI_VERSION is always 0x01 */
|
|
||||||
e_ident[EI_VERSION] = EV_CURRENT;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EI_OSABI defines the target OS. Ignored by most modern ELF parsers.
|
|
||||||
*/
|
|
||||||
e_ident[EI_OSABI] = ELFOSABI_NONE;
|
|
||||||
|
|
||||||
/* EI_ABIVERSION was for sub-classification. Un-defined since Linux 2.6 */
|
|
||||||
e_ident[EI_ABIVERSION] = 0x00;
|
|
||||||
|
|
||||||
/* EI_PAD is currently unused */
|
|
||||||
e_ident[EI_PAD] = 0x00;
|
|
||||||
|
|
||||||
/* Copy the E_IDENT section to the ELF struct */
|
|
||||||
populate_e_ident(elf_ptr, e_ident);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The remainder of the ELF header following E_IDENT follows.
|
|
||||||
*
|
|
||||||
* ehdr is a pointer to either an Elf32_Edhr, or Elf64_Ehdr struct.
|
|
||||||
*/
|
|
||||||
void *ehdr = NULL;
|
|
||||||
switch (elf_ptr->isa) {
|
|
||||||
|
|
||||||
case X86_64:
|
|
||||||
case AARCH64:
|
|
||||||
ehdr = (&(elf_ptr->EHDR(64)));
|
|
||||||
break;
|
|
||||||
case ARM32:
|
|
||||||
ehdr = (&(elf_ptr->EHDR(32)));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Depending on whether the ISA is 32- or 64-bit determines the size of
|
|
||||||
* many of the fields in the ELF Header. This switch case deals with it.
|
|
||||||
*/
|
|
||||||
switch (elf_ptr->isa) {
|
|
||||||
|
|
||||||
// 64-Bit ISAs
|
|
||||||
case X86_64:
|
|
||||||
case AARCH64:
|
|
||||||
/*
|
|
||||||
* e_type specifies what kind of ELF file this is:
|
|
||||||
* ET_NONE: 0x00 // Unknown Type
|
|
||||||
* ET_REL: 0x01 // Relocatable
|
|
||||||
* ET_EXEC: 0x02 // Executable File
|
|
||||||
* ET_DYN: 0x03 // Shared Object
|
|
||||||
* ET_CORE: 0x04 // Core Dump
|
|
||||||
*/
|
|
||||||
REF_EHDR(64, e_type) = ET_EXEC; // 0x0002
|
|
||||||
|
|
||||||
/* e_machine specifies the target ISA */
|
|
||||||
REF_EHDR(64, e_machine) = elf_ptr->isa;
|
|
||||||
|
|
||||||
/* e_version is always set of 0x01 for the original ELF spec */
|
|
||||||
REF_EHDR(64, e_version) = EV_CURRENT; // 0x00000001
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_entry is the memory address of the entry point
|
|
||||||
* Set by set_entry_point() after p_vaddr is set in the phdr
|
|
||||||
*/
|
|
||||||
REF_EHDR(64, e_entry) = 0x0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_phoff points to the start of the program header, which
|
|
||||||
* immediately follows the ELF header
|
|
||||||
*/
|
|
||||||
REF_EHDR(64, e_phoff) = ehdr_size;
|
|
||||||
|
|
||||||
/* e_shoff points to the start of the section header table */
|
|
||||||
REF_EHDR(64, e_shoff) = 0x00;
|
|
||||||
|
|
||||||
/* e_flags is architecture dependent */
|
|
||||||
REF_EHDR(64, e_flags) = 0x0;
|
|
||||||
|
|
||||||
/* e_ehsize contains the size of the ELF header */
|
|
||||||
REF_EHDR(64, e_ehsize) = ehdr_size;
|
|
||||||
|
|
||||||
/* e_phentsize is the size of the program header */
|
|
||||||
REF_EHDR(64, e_phentsize) = phdr_size;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_phnum contains the number of entries in the program header
|
|
||||||
* e_phnum * e_phentsize = size of program header table
|
|
||||||
*/
|
|
||||||
REF_EHDR(64, e_phnum) = 0x1;
|
|
||||||
|
|
||||||
/* e_shentsize contains the size of a section header entry */
|
|
||||||
REF_EHDR(64, e_shentsize) = 0x0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_shnum contains the number of entries in the section header
|
|
||||||
* e_shnum * e_shentsize = size of section header table
|
|
||||||
*/
|
|
||||||
REF_EHDR(64, e_shnum) = 0x0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_shstrndx contains the index of the section header table that
|
|
||||||
* contains the section names
|
|
||||||
*/
|
|
||||||
REF_EHDR(64, e_shstrndx) = 0x0;
|
|
||||||
|
|
||||||
break;
|
|
||||||
// 32-Bit ISAs
|
|
||||||
case ARM32:
|
|
||||||
/*
|
|
||||||
* e_type specifies what kind of ELF file this is:
|
|
||||||
* ET_NONE: 0x00 // Unknown Type
|
|
||||||
* ET_REL: 0x01 // Relocatable
|
|
||||||
* ET_EXEC: 0x02 // Executable File
|
|
||||||
* ET_DYN: 0x03 // Shared Object
|
|
||||||
* ET_CORE: 0x04 // Core Dump
|
|
||||||
*/
|
|
||||||
REF_EHDR(32, e_type) = ET_EXEC; // 0x0002
|
|
||||||
|
|
||||||
/* e_machine specifies the target ISA */
|
|
||||||
REF_EHDR(32, e_machine) = elf_ptr->isa;
|
|
||||||
|
|
||||||
/* e_version is always set of 0x01 for the original ELF spec */
|
|
||||||
REF_EHDR(32, e_version) = EV_CURRENT; // 0x00000001
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_entry is the memory address of the entry point
|
|
||||||
* Set by set_entry_point() after p_vaddr is set in the phdr
|
|
||||||
*/
|
|
||||||
REF_EHDR(32, e_entry) = 0x0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_phoff points to the start of the program header, which
|
|
||||||
* immediately follows the ELF header
|
|
||||||
*/
|
|
||||||
REF_EHDR(32, e_phoff) = ehdr_size;
|
|
||||||
|
|
||||||
/* e_shoff points to the start of the section header table */
|
|
||||||
REF_EHDR(32, e_shoff) = 0x0i;
|
|
||||||
|
|
||||||
/* e_flags is architecture dependent */
|
|
||||||
REF_EHDR(32, e_flags) = 0x0;
|
|
||||||
|
|
||||||
/* e_ehsize contains the size of the ELF header */
|
|
||||||
REF_EHDR(32, e_ehsize) = ehdr_size;
|
|
||||||
|
|
||||||
/* e_phentsize is the size of the program header */
|
|
||||||
REF_EHDR(32, e_phentsize) = phdr_size;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_phnum contains the number of entries in the program header
|
|
||||||
* e_phnum * e_phentsize = size of program header table
|
|
||||||
*/
|
|
||||||
REF_EHDR(32, e_phnum) = 0x1;
|
|
||||||
|
|
||||||
/* e_shentsize contains the size of a section header entry */
|
|
||||||
REF_EHDR(32, e_shentsize) = 0x0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_shnum contains the number of entries in the section header
|
|
||||||
* e_shnum * e_shentsize = size of section header table
|
|
||||||
*/
|
|
||||||
REF_EHDR(32, e_shnum) = 0x0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_shstrndx contains the index of the section header table that
|
|
||||||
* contains the section names
|
|
||||||
*/
|
|
||||||
REF_EHDR(32, e_shnum) = 0x0;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return ehdr;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Populate the program headers with sane values
|
|
||||||
* Returns a pointer to a PHDR struct
|
|
||||||
* taken from libgolf.h
|
|
||||||
*/
|
|
||||||
void *populate_phdr(RawBinary *elf_ptr) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* All offsets are relative to the start of the program header (0x40)
|
|
||||||
*
|
|
||||||
* phdr is a pointer to either an Elf32_Phdr, or Elf64_Phdr struct.
|
|
||||||
*/
|
|
||||||
void *phdr = NULL;
|
|
||||||
switch (elf_ptr->isa) {
|
|
||||||
|
|
||||||
case X86_64:
|
|
||||||
case AARCH64:
|
|
||||||
phdr = (&(elf_ptr->PHDR(64)));
|
|
||||||
break;
|
|
||||||
case ARM32:
|
|
||||||
phdr = (&(elf_ptr->PHDR(32)));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Depending on whether the ISA is 32- or 64-bit determines the size of
|
|
||||||
* many of the fields in the Progra Header. This switch case deals with it.
|
|
||||||
*/
|
|
||||||
switch (elf_ptr->isa) {
|
|
||||||
|
|
||||||
// 64-Bit ISAs
|
|
||||||
case X86_64:
|
|
||||||
case AARCH64:
|
|
||||||
/*
|
|
||||||
* p_type identifies what type of segment this is
|
|
||||||
* PT_NULL: 0x0 // Unused
|
|
||||||
* PT_LOAD: 0x1 // Loadable Segment
|
|
||||||
* PT_DYNAMIC: 0x2 // Dynamic Linker Information
|
|
||||||
* PT_INTERP: 0x3 // Interpreter Information
|
|
||||||
* PT_NOTE: 0x4 // Auxiliary Information
|
|
||||||
* PT_SHLIB: 0x5 // Reserved
|
|
||||||
* PT_PHDR: 0x6 // Segment with Program Header
|
|
||||||
* PT_TLS: 0x7 // Thread Local Storage
|
|
||||||
*/
|
|
||||||
REF_PHDR(64, p_type) = PT_LOAD; // 0x1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* p_flags defines permissions for this section
|
|
||||||
* PF_R: 0x4 // Read
|
|
||||||
* PF_W: 0x2 // Write
|
|
||||||
* PF_X: 0x1 // Execute
|
|
||||||
*/
|
|
||||||
REF_PHDR(64, p_flags) = PF_R | PF_X; // 0x5
|
|
||||||
|
|
||||||
/*
|
|
||||||
* p_offset is the offset in the file image (relative to the start
|
|
||||||
* of the program header) for this segment.
|
|
||||||
*/
|
|
||||||
REF_PHDR(64, p_offset) = 0x0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* p_vaddr is the virtual address where this segment should be loaded
|
|
||||||
* p_paddr is for the physical address (unused by System V)
|
|
||||||
*/
|
|
||||||
REF_PHDR(64, p_vaddr) = 0x400000;
|
|
||||||
REF_PHDR(64, p_paddr) = 0x400000;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* p_filesz is the size of the segment in the file image
|
|
||||||
* p_memsz is the size of the segment in memory
|
|
||||||
*
|
|
||||||
* Note: p_filesz doesn't have to equal p_memsz
|
|
||||||
*/
|
|
||||||
REF_PHDR(64, p_filesz) = elf_ptr->text.text_size;
|
|
||||||
REF_PHDR(64, p_memsz) = elf_ptr->text.text_size;
|
|
||||||
|
|
||||||
break;
|
|
||||||
// 32-Bit ISAs
|
|
||||||
case ARM32:
|
|
||||||
/*
|
|
||||||
* p_type identifies what type of segment this is
|
|
||||||
* PT_NULL: 0x0 // Unused
|
|
||||||
* PT_LOAD: 0x1 // Loadable Segment
|
|
||||||
* PT_DYNAMIC: 0x2 // Dynamic Linker Information
|
|
||||||
* PT_INTERP: 0x3 // Interpreter Information
|
|
||||||
* PT_NOTE: 0x4 // Auxiliary Information
|
|
||||||
* PT_SHLIB: 0x5 // Reserved
|
|
||||||
* PT_PHDR: 0x6 // Segment with Program Header
|
|
||||||
* PT_TLS: 0x7 // Thread Local Storage
|
|
||||||
*/
|
|
||||||
REF_PHDR(32, p_type) = PT_LOAD; // 0x1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* p_flags defines permissions for this section
|
|
||||||
* PF_R: 0x4 // Read
|
|
||||||
* PF_W: 0x2 // Write
|
|
||||||
* PF_X: 0x1 // Execute
|
|
||||||
*/
|
|
||||||
REF_PHDR(32, p_flags) = PF_R | PF_X; // 0x5
|
|
||||||
|
|
||||||
/*
|
|
||||||
* p_offset is the offset in the file image (relative to the start
|
|
||||||
* of the program header) for this segment.
|
|
||||||
*/
|
|
||||||
REF_PHDR(32, p_offset) = 0x0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* p_vaddr is the virtual address where this segment should be loaded
|
|
||||||
* p_paddr is for the physical address (unused by System V)
|
|
||||||
*/
|
|
||||||
REF_PHDR(32, p_vaddr) = 0x10000;
|
|
||||||
REF_PHDR(32, p_paddr) = 0x10000;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* p_filesz is the size of the segment in the file image
|
|
||||||
* p_memsz is the size of the segment in memory
|
|
||||||
*
|
|
||||||
* Note: p_filesz doesn't have to equal p_memsz
|
|
||||||
*/
|
|
||||||
REF_PHDR(32, p_filesz) = elf_ptr->text.text_size;
|
|
||||||
REF_PHDR(32, p_memsz) = elf_ptr->text.text_size;
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* p_align is the memory alignment
|
|
||||||
*
|
|
||||||
* Note: p_vaddr = p_offset % p_align
|
|
||||||
*/
|
|
||||||
switch (elf_ptr->isa) {
|
|
||||||
|
|
||||||
case X86_64:
|
|
||||||
REF_PHDR(64, p_align) = 0x400000;
|
|
||||||
break;
|
|
||||||
case ARM32:
|
|
||||||
REF_PHDR(32, p_align) = 0x10000;
|
|
||||||
break;
|
|
||||||
case AARCH64:
|
|
||||||
REF_PHDR(64, p_align) = 0x400000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return phdr;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* e_entry depends on p_vaddr, so has to be set after populate_ehdr()
|
|
||||||
* and populate_phdr() have been called.
|
|
||||||
* taken from libgolf.h
|
|
||||||
*/
|
|
||||||
int set_entry_point(RawBinary *elf_ptr) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Once the whole ELF file is copied into memory, control is handed to
|
|
||||||
* e_entry. Relative to the process's virtual memory address, the .text
|
|
||||||
* segment will be located immediately after the ELF and program header.
|
|
||||||
*
|
|
||||||
* ehdr and phdr are pointers to the ELF and Program headers respectively.
|
|
||||||
* The switch case casts and assigns them to the correct fields of the ELF
|
|
||||||
* struct, then sets ehdr->e_entry.
|
|
||||||
*/
|
|
||||||
void *ehdr, *phdr;
|
|
||||||
|
|
||||||
switch (elf_ptr->isa) {
|
|
||||||
|
|
||||||
case X86_64:
|
|
||||||
case AARCH64:
|
|
||||||
ehdr = GET_EHDR(64);
|
|
||||||
phdr = GET_PHDR(64);
|
|
||||||
REF_EHDR(64, e_entry) = REF_PHDR(64, p_vaddr) + ehdr_size + phdr_size;
|
|
||||||
break;
|
|
||||||
case ARM32:
|
|
||||||
ehdr = GET_EHDR(32);
|
|
||||||
phdr = GET_PHDR(32);
|
|
||||||
REF_EHDR(32, e_entry) = REF_PHDR(32, p_vaddr) + ehdr_size + phdr_size;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
exit(1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct my_mutator {
|
|
||||||
|
|
||||||
afl_state_t *afl;
|
|
||||||
size_t trim_size_current;
|
|
||||||
int trimmming_steps;
|
|
||||||
int cur_step;
|
|
||||||
u8 *mutated_out, *post_process_buf, *trim_buf;
|
|
||||||
|
|
||||||
} my_mutator_t;
|
|
||||||
|
|
||||||
my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|
||||||
|
|
||||||
srand(seed); // needed also by surgical_havoc_mutate()
|
|
||||||
my_mutator_t *data = calloc(1, sizeof(my_mutator_t));
|
|
||||||
if (!data) {
|
|
||||||
|
|
||||||
perror("afl_custom_init alloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((data->mutated_out = (u8 *)malloc(MAX_FILE)) == NULL) {
|
|
||||||
|
|
||||||
perror("afl_custom_init malloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((data->post_process_buf = (u8 *)malloc(MAX_FILE)) == NULL) {
|
|
||||||
|
|
||||||
perror("afl_custom_init malloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((data->trim_buf = (u8 *)malloc(MAX_FILE)) == NULL) {
|
|
||||||
|
|
||||||
perror("afl_custom_init malloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->afl = afl;
|
|
||||||
return data;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t afl_custom_fuzz(my_mutator_t *data, uint8_t *in_buf, size_t buf_size,
|
|
||||||
u8 **out_buf, uint8_t *add_buf,
|
|
||||||
size_t add_buf_size, // add_buf can be NULL
|
|
||||||
size_t max_size) {
|
|
||||||
|
|
||||||
RawBinary elf_obj;
|
|
||||||
RawBinary *elf = &elf_obj;
|
|
||||||
elf->isa = 62;
|
|
||||||
Elf64_Ehdr *ehdr;
|
|
||||||
Elf64_Phdr *phdr;
|
|
||||||
copy_text_segment(elf, buf, sizeof(buf));
|
|
||||||
ehdr = populate_ehdr(elf);
|
|
||||||
phdr = populate_phdr(elf);
|
|
||||||
set_entry_point(elf);
|
|
||||||
|
|
||||||
size_t mutated_size = ehdr_size + phdr_size + elf->text.text_size;
|
|
||||||
int pos = 0;
|
|
||||||
// example fields
|
|
||||||
ehdr->e_ident[EI_CLASS] = (uint8_t *)(in_buf + pos++);
|
|
||||||
ehdr->e_ident[EI_DATA] = (uint8_t *)(in_buf + pos++);
|
|
||||||
ehdr->e_ident[EI_VERSION] = (uint8_t *)(in_buf + pos++);
|
|
||||||
ehdr->e_ident[EI_OSABI] = (uint8_t *)(in_buf + pos++);
|
|
||||||
for (int i = 0x8; i < 0x10; ++i) {
|
|
||||||
|
|
||||||
(ehdr->e_ident)[i] = (uint8_t *)(in_buf + pos++);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
ehdr->e_version = (uint32_t *)(in_buf + pos);
|
|
||||||
pos += 4;
|
|
||||||
// sections headers
|
|
||||||
ehdr->e_shoff = (uint64_t *)(in_buf + pos);
|
|
||||||
pos += 8;
|
|
||||||
ehdr->e_shentsize = (uint16_t *)(in_buf + pos);
|
|
||||||
pos += 2;
|
|
||||||
ehdr->e_shnum = (uint16_t *)(in_buf + pos);
|
|
||||||
pos += 2;
|
|
||||||
ehdr->e_shstrndx = (uint16_t *)(in_buf + pos);
|
|
||||||
pos += 2;
|
|
||||||
ehdr->e_flags = (uint32_t *)(in_buf + pos);
|
|
||||||
pos += 4;
|
|
||||||
// physical addr
|
|
||||||
phdr->p_paddr = (uint64_t *)(in_buf + pos);
|
|
||||||
pos += 8;
|
|
||||||
phdr->p_align = (uint64_t *)(in_buf + pos);
|
|
||||||
pos += 8;
|
|
||||||
|
|
||||||
/* mimic GEN_ELF()
|
|
||||||
* Write:
|
|
||||||
* - ELF Header
|
|
||||||
* - Program Header
|
|
||||||
* - Text Segment
|
|
||||||
*/
|
|
||||||
memcpy(data->mutated_out, ehdr, ehdr_size);
|
|
||||||
memcpy(data->mutated_out + ehdr_size, phdr, phdr_size);
|
|
||||||
memcpy(data->mutated_out + ehdr_size + phdr_size, elf->text.text_segment,
|
|
||||||
elf->text.text_size);
|
|
||||||
|
|
||||||
*out_buf = data->mutated_out;
|
|
||||||
return mutated_size;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void afl_custom_deinit(my_mutator_t *data) {
|
|
||||||
|
|
||||||
free(data->post_process_buf);
|
|
||||||
free(data->mutated_out);
|
|
||||||
free(data->trim_buf);
|
|
||||||
free(data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
|||||||
Dominik Maier <mail@dmnk.co>
|
Dominik Maier <mail@dmnk.co>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// You need to use -I/path/to/AFLplusplus/include -I.
|
// You need to use -I /path/to/AFLplusplus/include
|
||||||
#include "afl-fuzz.h"
|
#include "custom_mutator_helpers.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -26,14 +26,19 @@ static const char *commands[] = {
|
|||||||
|
|
||||||
typedef struct my_mutator {
|
typedef struct my_mutator {
|
||||||
|
|
||||||
afl_state_t *afl;
|
afl_t *afl;
|
||||||
|
|
||||||
// any additional data here!
|
// any additional data here!
|
||||||
size_t trim_size_current;
|
size_t trim_size_current;
|
||||||
int trimmming_steps;
|
int trimmming_steps;
|
||||||
int cur_step;
|
int cur_step;
|
||||||
|
|
||||||
u8 *mutated_out, *post_process_buf, *trim_buf;
|
// Reused buffers:
|
||||||
|
BUF_VAR(u8, fuzz);
|
||||||
|
BUF_VAR(u8, data);
|
||||||
|
BUF_VAR(u8, havoc);
|
||||||
|
BUF_VAR(u8, trim);
|
||||||
|
BUF_VAR(u8, post_process);
|
||||||
|
|
||||||
} my_mutator_t;
|
} my_mutator_t;
|
||||||
|
|
||||||
@ -48,7 +53,7 @@ typedef struct my_mutator {
|
|||||||
* There may be multiple instances of this mutator in one afl-fuzz run!
|
* There may be multiple instances of this mutator in one afl-fuzz run!
|
||||||
* Return NULL on error.
|
* Return NULL on error.
|
||||||
*/
|
*/
|
||||||
my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
my_mutator_t *afl_custom_init(afl_t *afl, unsigned int seed) {
|
||||||
|
|
||||||
srand(seed); // needed also by surgical_havoc_mutate()
|
srand(seed); // needed also by surgical_havoc_mutate()
|
||||||
|
|
||||||
@ -60,27 +65,6 @@ my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((data->mutated_out = (u8 *)malloc(MAX_FILE)) == NULL) {
|
|
||||||
|
|
||||||
perror("afl_custom_init malloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((data->post_process_buf = (u8 *)malloc(MAX_FILE)) == NULL) {
|
|
||||||
|
|
||||||
perror("afl_custom_init malloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((data->trim_buf = (u8 *)malloc(MAX_FILE)) == NULL) {
|
|
||||||
|
|
||||||
perror("afl_custom_init malloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->afl = afl;
|
data->afl = afl;
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
@ -112,14 +96,29 @@ size_t afl_custom_fuzz(my_mutator_t *data, uint8_t *buf, size_t buf_size,
|
|||||||
// the fuzzer
|
// the fuzzer
|
||||||
size_t mutated_size = DATA_SIZE <= max_size ? DATA_SIZE : max_size;
|
size_t mutated_size = DATA_SIZE <= max_size ? DATA_SIZE : max_size;
|
||||||
|
|
||||||
memcpy(data->mutated_out, buf, buf_size);
|
// maybe_grow is optimized to be quick for reused buffers.
|
||||||
|
u8 *mutated_out = maybe_grow(BUF_PARAMS(data, fuzz), mutated_size);
|
||||||
|
if (!mutated_out) {
|
||||||
|
|
||||||
|
*out_buf = NULL;
|
||||||
|
perror("custom mutator allocation (maybe_grow)");
|
||||||
|
return 0; /* afl-fuzz will very likely error out after this. */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Randomly select a command string to add as a header to the packet
|
// Randomly select a command string to add as a header to the packet
|
||||||
memcpy(data->mutated_out, commands[rand() % 3], 3);
|
memcpy(mutated_out, commands[rand() % 3], 3);
|
||||||
|
|
||||||
if (mutated_size > max_size) { mutated_size = max_size; }
|
// Mutate the payload of the packet
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 8; ++i) {
|
||||||
|
|
||||||
*out_buf = data->mutated_out;
|
// Randomly perform one of the (no len modification) havoc mutations
|
||||||
|
surgical_havoc_mutate(mutated_out, 3, mutated_size);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
*out_buf = mutated_out;
|
||||||
return mutated_size;
|
return mutated_size;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -143,16 +142,24 @@ size_t afl_custom_fuzz(my_mutator_t *data, uint8_t *buf, size_t buf_size,
|
|||||||
size_t afl_custom_post_process(my_mutator_t *data, uint8_t *buf,
|
size_t afl_custom_post_process(my_mutator_t *data, uint8_t *buf,
|
||||||
size_t buf_size, uint8_t **out_buf) {
|
size_t buf_size, uint8_t **out_buf) {
|
||||||
|
|
||||||
if (buf_size + 5 > MAX_FILE) { buf_size = MAX_FILE - 5; }
|
uint8_t *post_process_buf =
|
||||||
|
maybe_grow(BUF_PARAMS(data, post_process), buf_size + 5);
|
||||||
|
if (!post_process_buf) {
|
||||||
|
|
||||||
memcpy(data->post_process_buf + 5, buf, buf_size);
|
perror("custom mutator realloc failed.");
|
||||||
data->post_process_buf[0] = 'A';
|
*out_buf = NULL;
|
||||||
data->post_process_buf[1] = 'F';
|
return 0;
|
||||||
data->post_process_buf[2] = 'L';
|
|
||||||
data->post_process_buf[3] = '+';
|
|
||||||
data->post_process_buf[4] = '+';
|
|
||||||
|
|
||||||
*out_buf = data->post_process_buf;
|
}
|
||||||
|
|
||||||
|
memcpy(post_process_buf + 5, buf, buf_size);
|
||||||
|
post_process_buf[0] = 'A';
|
||||||
|
post_process_buf[1] = 'F';
|
||||||
|
post_process_buf[2] = 'L';
|
||||||
|
post_process_buf[3] = '+';
|
||||||
|
post_process_buf[4] = '+';
|
||||||
|
|
||||||
|
*out_buf = post_process_buf;
|
||||||
|
|
||||||
return buf_size + 5;
|
return buf_size + 5;
|
||||||
|
|
||||||
@ -188,6 +195,13 @@ int32_t afl_custom_init_trim(my_mutator_t *data, uint8_t *buf,
|
|||||||
|
|
||||||
data->cur_step = 0;
|
data->cur_step = 0;
|
||||||
|
|
||||||
|
if (!maybe_grow(BUF_PARAMS(data, trim), buf_size)) {
|
||||||
|
|
||||||
|
perror("init_trim grow");
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(data->trim_buf, buf, buf_size);
|
memcpy(data->trim_buf, buf, buf_size);
|
||||||
|
|
||||||
data->trim_size_current = buf_size;
|
data->trim_size_current = buf_size;
|
||||||
@ -268,11 +282,27 @@ int32_t afl_custom_post_trim(my_mutator_t *data, int success) {
|
|||||||
size_t afl_custom_havoc_mutation(my_mutator_t *data, u8 *buf, size_t buf_size,
|
size_t afl_custom_havoc_mutation(my_mutator_t *data, u8 *buf, size_t buf_size,
|
||||||
u8 **out_buf, size_t max_size) {
|
u8 **out_buf, size_t max_size) {
|
||||||
|
|
||||||
*out_buf = buf; // in-place mutation
|
if (buf_size == 0) {
|
||||||
|
|
||||||
if (buf_size <= sizeof(size_t)) { return buf_size; }
|
*out_buf = maybe_grow(BUF_PARAMS(data, havoc), 1);
|
||||||
|
if (!*out_buf) {
|
||||||
|
|
||||||
size_t victim = rand() % (buf_size - sizeof(size_t));
|
perror("custom havoc: maybe_grow");
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
**out_buf = rand() % 256;
|
||||||
|
buf_size = 1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// We reuse buf here. It's legal and faster.
|
||||||
|
*out_buf = buf;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t victim = rand() % buf_size;
|
||||||
(*out_buf)[victim] += rand() % 10;
|
(*out_buf)[victim] += rand() % 10;
|
||||||
|
|
||||||
return buf_size;
|
return buf_size;
|
||||||
@ -322,7 +352,7 @@ uint8_t afl_custom_queue_get(my_mutator_t *data, const uint8_t *filename) {
|
|||||||
* @return if the file contents was modified return 1 (True), 0 (False)
|
* @return if the file contents was modified return 1 (True), 0 (False)
|
||||||
* otherwise
|
* otherwise
|
||||||
*/
|
*/
|
||||||
uint8_t afl_custom_queue_new_entry(my_mutator_t *data,
|
uint8_t afl_custom_queue_new_entry(my_mutator_t * data,
|
||||||
const uint8_t *filename_new_queue,
|
const uint8_t *filename_new_queue,
|
||||||
const uint8_t *filename_orig_queue) {
|
const uint8_t *filename_orig_queue) {
|
||||||
|
|
||||||
@ -339,7 +369,9 @@ uint8_t afl_custom_queue_new_entry(my_mutator_t *data,
|
|||||||
void afl_custom_deinit(my_mutator_t *data) {
|
void afl_custom_deinit(my_mutator_t *data) {
|
||||||
|
|
||||||
free(data->post_process_buf);
|
free(data->post_process_buf);
|
||||||
free(data->mutated_out);
|
free(data->havoc_buf);
|
||||||
|
free(data->data_buf);
|
||||||
|
free(data->fuzz_buf);
|
||||||
free(data->trim_buf);
|
free(data->trim_buf);
|
||||||
free(data);
|
free(data);
|
||||||
|
|
||||||
|
@ -133,11 +133,6 @@ def fuzz(buf, add_buf, max_size):
|
|||||||
# @return: The buffer containing the test case after
|
# @return: The buffer containing the test case after
|
||||||
# '''
|
# '''
|
||||||
# return buf
|
# return buf
|
||||||
# def post_run():
|
|
||||||
# '''
|
|
||||||
# Called after each time the execution of the target program by AFL++
|
|
||||||
# '''
|
|
||||||
# pass
|
|
||||||
#
|
#
|
||||||
# def havoc_mutation(buf, max_size):
|
# def havoc_mutation(buf, max_size):
|
||||||
# '''
|
# '''
|
||||||
|
@ -45,8 +45,9 @@
|
|||||||
1) If you don't want to modify the test case, simply set `*out_buf = in_buf`
|
1) If you don't want to modify the test case, simply set `*out_buf = in_buf`
|
||||||
and return the original `len`.
|
and return the original `len`.
|
||||||
|
|
||||||
|
NOTE: the following is currently NOT true, we abort in this case!
|
||||||
2) If you want to skip this test case altogether and have AFL generate a
|
2) If you want to skip this test case altogether and have AFL generate a
|
||||||
new one, return 0.
|
new one, return 0 or set `*out_buf = NULL`.
|
||||||
Use this sparingly - it's faster than running the target program
|
Use this sparingly - it's faster than running the target program
|
||||||
with patently useless inputs, but still wastes CPU time.
|
with patently useless inputs, but still wastes CPU time.
|
||||||
|
|
||||||
@ -58,6 +59,8 @@
|
|||||||
Note that the buffer will *not* be freed for you. To avoid memory leaks,
|
Note that the buffer will *not* be freed for you. To avoid memory leaks,
|
||||||
you need to free it or reuse it on subsequent calls (as shown below).
|
you need to free it or reuse it on subsequent calls (as shown below).
|
||||||
|
|
||||||
|
*** Feel free to reuse the original 'in_buf' BUFFER and return it. ***
|
||||||
|
|
||||||
Alright. The example below shows a simple postprocessor that tries to make
|
Alright. The example below shows a simple postprocessor that tries to make
|
||||||
sure that all input files start with "GIF89a".
|
sure that all input files start with "GIF89a".
|
||||||
|
|
||||||
@ -69,7 +72,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "afl-fuzz.h"
|
|
||||||
|
|
||||||
/* Header that must be present at the beginning of every test case: */
|
/* Header that must be present at the beginning of every test case: */
|
||||||
|
|
||||||
@ -77,7 +79,8 @@
|
|||||||
|
|
||||||
typedef struct post_state {
|
typedef struct post_state {
|
||||||
|
|
||||||
size_t size;
|
unsigned char *buf;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
} post_state_t;
|
} post_state_t;
|
||||||
|
|
||||||
@ -91,6 +94,15 @@ void *afl_custom_init(void *afl) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
state->buf = calloc(sizeof(unsigned char), 4096);
|
||||||
|
if (!state->buf) {
|
||||||
|
|
||||||
|
free(state);
|
||||||
|
perror("calloc");
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -100,10 +112,6 @@ void *afl_custom_init(void *afl) {
|
|||||||
size_t afl_custom_post_process(post_state_t *data, unsigned char *in_buf,
|
size_t afl_custom_post_process(post_state_t *data, unsigned char *in_buf,
|
||||||
unsigned int len, unsigned char **out_buf) {
|
unsigned int len, unsigned char **out_buf) {
|
||||||
|
|
||||||
/* we do in-place modification as we do not increase the size */
|
|
||||||
|
|
||||||
*out_buf = in_buf;
|
|
||||||
|
|
||||||
/* Skip execution altogether for buffers shorter than 6 bytes (just to
|
/* Skip execution altogether for buffers shorter than 6 bytes (just to
|
||||||
show how it's done). We can trust len to be sane. */
|
show how it's done). We can trust len to be sane. */
|
||||||
|
|
||||||
@ -111,7 +119,32 @@ size_t afl_custom_post_process(post_state_t *data, unsigned char *in_buf,
|
|||||||
|
|
||||||
/* Do nothing for buffers that already start with the expected header. */
|
/* Do nothing for buffers that already start with the expected header. */
|
||||||
|
|
||||||
if (!memcmp(in_buf, HEADER, strlen(HEADER))) { return len; }
|
if (!memcmp(in_buf, HEADER, strlen(HEADER))) {
|
||||||
|
|
||||||
|
*out_buf = in_buf;
|
||||||
|
return len;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory for new buffer, reusing previous allocation if
|
||||||
|
possible. */
|
||||||
|
|
||||||
|
*out_buf = realloc(data->buf, len);
|
||||||
|
|
||||||
|
/* If we're out of memory, the most graceful thing to do is to return the
|
||||||
|
original buffer and give up on modifying it. Let AFL handle OOM on its
|
||||||
|
own later on. */
|
||||||
|
|
||||||
|
if (!*out_buf) {
|
||||||
|
|
||||||
|
*out_buf = in_buf;
|
||||||
|
return len;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the original data to the new location. */
|
||||||
|
|
||||||
|
memcpy(*out_buf, in_buf, len);
|
||||||
|
|
||||||
/* Insert the new header. */
|
/* Insert the new header. */
|
||||||
|
|
||||||
@ -126,6 +159,7 @@ size_t afl_custom_post_process(post_state_t *data, unsigned char *in_buf,
|
|||||||
/* Gets called afterwards */
|
/* Gets called afterwards */
|
||||||
void afl_custom_deinit(post_state_t *data) {
|
void afl_custom_deinit(post_state_t *data) {
|
||||||
|
|
||||||
|
free(data->buf);
|
||||||
free(data);
|
free(data);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,8 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include "afl-fuzz.h"
|
|
||||||
|
|
||||||
/* A macro to round an integer up to 4 kB. */
|
/* A macro to round an integer up to 4 kB. */
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ void *afl_custom_init(void *afl) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
state->buf = calloc(sizeof(unsigned char), MAX_FILE);
|
state->buf = calloc(sizeof(unsigned char), 4096);
|
||||||
if (!state->buf) {
|
if (!state->buf) {
|
||||||
|
|
||||||
free(state);
|
free(state);
|
||||||
@ -70,6 +70,9 @@ size_t afl_custom_post_process(post_state_t *data, const unsigned char *in_buf,
|
|||||||
unsigned int len,
|
unsigned int len,
|
||||||
const unsigned char **out_buf) {
|
const unsigned char **out_buf) {
|
||||||
|
|
||||||
|
unsigned char *new_buf = (unsigned char *)in_buf;
|
||||||
|
unsigned int pos = 8;
|
||||||
|
|
||||||
/* Don't do anything if there's not enough room for the PNG header
|
/* Don't do anything if there's not enough room for the PNG header
|
||||||
(8 bytes). */
|
(8 bytes). */
|
||||||
|
|
||||||
@ -80,8 +83,6 @@ size_t afl_custom_post_process(post_state_t *data, const unsigned char *in_buf,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int pos = 8;
|
|
||||||
|
|
||||||
/* Minimum size of a zero-length PNG chunk is 12 bytes; if we
|
/* Minimum size of a zero-length PNG chunk is 12 bytes; if we
|
||||||
don't have that, we can bail out. */
|
don't have that, we can bail out. */
|
||||||
|
|
||||||
@ -110,7 +111,34 @@ size_t afl_custom_post_process(post_state_t *data, const unsigned char *in_buf,
|
|||||||
|
|
||||||
if (real_cksum != file_cksum) {
|
if (real_cksum != file_cksum) {
|
||||||
|
|
||||||
*(uint32_t *)(data->buf + pos + 8 + chunk_len) = real_cksum;
|
/* First modification? Make a copy of the input buffer. Round size
|
||||||
|
up to 4 kB to minimize the number of reallocs needed. */
|
||||||
|
|
||||||
|
if (new_buf == in_buf) {
|
||||||
|
|
||||||
|
if (len <= data->size) {
|
||||||
|
|
||||||
|
new_buf = data->buf;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
new_buf = realloc(data->buf, UP4K(len));
|
||||||
|
if (!new_buf) {
|
||||||
|
|
||||||
|
*out_buf = in_buf;
|
||||||
|
return len;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
data->buf = new_buf;
|
||||||
|
data->size = UP4K(len);
|
||||||
|
memcpy(new_buf, in_buf, len);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
*(uint32_t *)(new_buf + pos + 8 + chunk_len) = real_cksum;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +148,7 @@ size_t afl_custom_post_process(post_state_t *data, const unsigned char *in_buf,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*out_buf = data->buf;
|
*out_buf = new_buf;
|
||||||
return len;
|
return len;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// This simple example just creates random buffer <= 100 filled with 'A'
|
// This simple example just creates random buffer <= 100 filled with 'A'
|
||||||
// needs -I /path/to/AFLplusplus/include
|
// needs -I /path/to/AFLplusplus/include
|
||||||
#include "afl-fuzz.h"
|
#include "custom_mutator_helpers.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -13,14 +13,14 @@
|
|||||||
|
|
||||||
typedef struct my_mutator {
|
typedef struct my_mutator {
|
||||||
|
|
||||||
afl_state_t *afl;
|
afl_t *afl;
|
||||||
|
|
||||||
// Reused buffers:
|
// Reused buffers:
|
||||||
u8 *fuzz_buf;
|
BUF_VAR(u8, fuzz);
|
||||||
|
|
||||||
} my_mutator_t;
|
} my_mutator_t;
|
||||||
|
|
||||||
my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
my_mutator_t *afl_custom_init(afl_t *afl, unsigned int seed) {
|
||||||
|
|
||||||
srand(seed);
|
srand(seed);
|
||||||
my_mutator_t *data = calloc(1, sizeof(my_mutator_t));
|
my_mutator_t *data = calloc(1, sizeof(my_mutator_t));
|
||||||
@ -31,14 +31,6 @@ my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data->fuzz_buf = (u8 *)malloc(MAX_FILE);
|
|
||||||
if (!data->fuzz_buf) {
|
|
||||||
|
|
||||||
perror("afl_custom_init malloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->afl = afl;
|
data->afl = afl;
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
@ -52,10 +44,18 @@ size_t afl_custom_fuzz(my_mutator_t *data, uint8_t *buf, size_t buf_size,
|
|||||||
|
|
||||||
int size = (rand() % 100) + 1;
|
int size = (rand() % 100) + 1;
|
||||||
if (size > max_size) size = max_size;
|
if (size > max_size) size = max_size;
|
||||||
|
u8 *mutated_out = maybe_grow(BUF_PARAMS(data, fuzz), size);
|
||||||
|
if (!mutated_out) {
|
||||||
|
|
||||||
memset(data->fuzz_buf, _FIXED_CHAR, size);
|
*out_buf = NULL;
|
||||||
|
perror("custom mutator allocation (maybe_grow)");
|
||||||
|
return 0; /* afl-fuzz will very likely error out after this. */
|
||||||
|
|
||||||
*out_buf = data->fuzz_buf;
|
}
|
||||||
|
|
||||||
|
memset(mutated_out, _FIXED_CHAR, size);
|
||||||
|
|
||||||
|
*out_buf = mutated_out;
|
||||||
return size;
|
return size;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
# Adapted for AFLplusplus by Dominik Maier <mail@dmnk.co>
|
# Adapted for AFLplusplus by Dominik Maier <mail@dmnk.co>
|
||||||
#
|
#
|
||||||
# Copyright 2017 Battelle Memorial Institute. All rights reserved.
|
# Copyright 2017 Battelle Memorial Institute. All rights reserved.
|
||||||
# Copyright 2019-2023 AFLplusplus Project. All rights reserved.
|
# Copyright 2019-2020 AFLplusplus Project. All rights reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@ -115,9 +115,9 @@ if [ $? -eq 0 ]; then
|
|||||||
git submodule update ./json-c 2>/dev/null # ignore errors
|
git submodule update ./json-c 2>/dev/null # ignore errors
|
||||||
else
|
else
|
||||||
echo "[*] cloning json-c"
|
echo "[*] cloning json-c"
|
||||||
test -d json-c/.git || {
|
test -d json-c || {
|
||||||
CNT=1
|
CNT=1
|
||||||
while [ '!' -d json-c/.git -a "$CNT" -lt 4 ]; do
|
while [ '!' -d json-c -a "$CNT" -lt 4 ]; do
|
||||||
echo "Trying to clone json-c (attempt $CNT/3)"
|
echo "Trying to clone json-c (attempt $CNT/3)"
|
||||||
git clone "$JSONC_REPO"
|
git clone "$JSONC_REPO"
|
||||||
CNT=`expr "$CNT" + 1`
|
CNT=`expr "$CNT" + 1`
|
||||||
@ -125,7 +125,7 @@ else
|
|||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
test -e json-c/.git || { echo "[-] not checked out, please install git or check your internet connection." ; exit 1 ; }
|
test -d json-c || { echo "[-] not checked out, please install git or check your internet connection." ; exit 1 ; }
|
||||||
echo "[+] Got json-c."
|
echo "[+] Got json-c."
|
||||||
|
|
||||||
test -e json-c/.libs/libjson-c.a || {
|
test -e json-c/.libs/libjson-c.a || {
|
||||||
|
Submodule custom_mutators/gramatron/json-c updated: 11546bfd07...af8dd4a307
@ -1 +1 @@
|
|||||||
5ed4f8d
|
eedf07d
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
# <andreafioraldi@gmail.com>
|
# <andreafioraldi@gmail.com>
|
||||||
#
|
#
|
||||||
# Copyright 2017 Battelle Memorial Institute. All rights reserved.
|
# Copyright 2017 Battelle Memorial Institute. All rights reserved.
|
||||||
# Copyright 2019-2023 AFLplusplus Project. All rights reserved.
|
# Copyright 2019-2020 AFLplusplus Project. All rights reserved.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@ -109,9 +109,9 @@ if [ $? -eq 0 ]; then
|
|||||||
git submodule update ./grammar_mutator 2>/dev/null # ignore errors
|
git submodule update ./grammar_mutator 2>/dev/null # ignore errors
|
||||||
else
|
else
|
||||||
echo "[*] cloning grammar mutator"
|
echo "[*] cloning grammar mutator"
|
||||||
test -d grammar_mutator/.git || {
|
test -d grammar_mutator || {
|
||||||
CNT=1
|
CNT=1
|
||||||
while [ '!' -d grammar_mutator/.git -a "$CNT" -lt 4 ]; do
|
while [ '!' -d grammar_mutator -a "$CNT" -lt 4 ]; do
|
||||||
echo "Trying to clone grammar_mutator (attempt $CNT/3)"
|
echo "Trying to clone grammar_mutator (attempt $CNT/3)"
|
||||||
git clone "$GRAMMAR_REPO"
|
git clone "$GRAMMAR_REPO"
|
||||||
CNT=`expr "$CNT" + 1`
|
CNT=`expr "$CNT" + 1`
|
||||||
@ -119,16 +119,15 @@ else
|
|||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
test -e grammar_mutator/.git || { echo "[-] not checked out, please install git or check your internet connection." ; exit 1 ; }
|
test -d grammar_mutator || { echo "[-] not checked out, please install git or check your internet connection." ; exit 1 ; }
|
||||||
echo "[+] Got grammar mutator."
|
echo "[+] Got grammar mutator."
|
||||||
|
|
||||||
cd "grammar_mutator" || exit 1
|
cd "grammar_mutator" || exit 1
|
||||||
echo "[*] Checking out $GRAMMAR_VERSION"
|
echo "[*] Checking out $GRAMMAR_VERSION"
|
||||||
git pull >/dev/null 2>&1
|
|
||||||
sh -c 'git stash && git stash drop' 1>/dev/null 2>/dev/null
|
sh -c 'git stash && git stash drop' 1>/dev/null 2>/dev/null
|
||||||
git checkout "$GRAMMAR_VERSION" || exit 1
|
git checkout "$GRAMMAR_VERSION" || exit 1
|
||||||
echo "[*] Downloading antlr..."
|
echo "[*] Downloading antlr..."
|
||||||
wget -q https://www.antlr.org/download/antlr-4.8-complete.jar
|
wget -c https://www.antlr.org/download/antlr-4.8-complete.jar
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
Submodule custom_mutators/grammar_mutator/grammar_mutator updated: 5ed4f8d6e6...b79d51a8da
22
custom_mutators/honggfuzz/custom_mutator_helpers.h
Normal file
22
custom_mutators/honggfuzz/custom_mutator_helpers.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#ifndef CUSTOM_MUTATOR_HELPERS
|
||||||
|
#define CUSTOM_MUTATOR_HELPERS
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "types.h"
|
||||||
|
#include "afl-fuzz.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define INITIAL_GROWTH_SIZE (64)
|
||||||
|
|
||||||
|
/* Use in a struct: creates a name_buf and a name_size variable. */
|
||||||
|
#define BUF_VAR(type, name) \
|
||||||
|
type * name##_buf; \
|
||||||
|
size_t name##_size;
|
||||||
|
/* this filles in `&structptr->something_buf, &structptr->something_size`. */
|
||||||
|
#define BUF_PARAMS(struct, name) \
|
||||||
|
(void **)&struct->name##_buf, &struct->name##_size
|
||||||
|
|
||||||
|
#undef INITIAL_GROWTH_SIZE
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -3,14 +3,14 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "afl-fuzz.h"
|
#include "custom_mutator_helpers.h"
|
||||||
#include "mangle.h"
|
#include "mangle.h"
|
||||||
|
|
||||||
#define NUMBER_OF_MUTATIONS 5
|
#define NUMBER_OF_MUTATIONS 5
|
||||||
|
|
||||||
uint8_t *queue_input;
|
uint8_t * queue_input;
|
||||||
size_t queue_input_size;
|
size_t queue_input_size;
|
||||||
afl_state_t *afl_struct;
|
afl_state_t * afl_struct;
|
||||||
run_t run;
|
run_t run;
|
||||||
honggfuzz_t global;
|
honggfuzz_t global;
|
||||||
struct _dynfile_t dynfile;
|
struct _dynfile_t dynfile;
|
||||||
@ -18,8 +18,8 @@ struct _dynfile_t dynfile;
|
|||||||
typedef struct my_mutator {
|
typedef struct my_mutator {
|
||||||
|
|
||||||
afl_state_t *afl;
|
afl_state_t *afl;
|
||||||
run_t *run;
|
run_t * run;
|
||||||
u8 *mutator_buf;
|
u8 * mutator_buf;
|
||||||
unsigned int seed;
|
unsigned int seed;
|
||||||
unsigned int extras_cnt, a_extras_cnt;
|
unsigned int extras_cnt, a_extras_cnt;
|
||||||
|
|
||||||
@ -65,9 +65,9 @@ my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|||||||
/* When a new queue entry is added we check if there are new dictionary
|
/* When a new queue entry is added we check if there are new dictionary
|
||||||
entries to add to honggfuzz structure */
|
entries to add to honggfuzz structure */
|
||||||
|
|
||||||
void afl_custom_queue_new_entry(my_mutator_t *data,
|
uint8_t afl_custom_queue_new_entry(my_mutator_t * data,
|
||||||
const uint8_t *filename_new_queue,
|
const uint8_t *filename_new_queue,
|
||||||
const uint8_t *filename_orig_queue) {
|
const uint8_t *filename_orig_queue) {
|
||||||
|
|
||||||
if (run.global->mutate.dictionaryCnt >= 1024) return;
|
if (run.global->mutate.dictionaryCnt >= 1024) return;
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ void afl_custom_queue_new_entry(my_mutator_t *data,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
10
custom_mutators/libafl_base/.gitignore
vendored
10
custom_mutators/libafl_base/.gitignore
vendored
@ -1,10 +0,0 @@
|
|||||||
# Generated by Cargo
|
|
||||||
# will have compiled files and executables
|
|
||||||
/target/
|
|
||||||
|
|
||||||
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
|
|
||||||
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
|
|
||||||
Cargo.lock
|
|
||||||
|
|
||||||
# These are backup files generated by rustfmt
|
|
||||||
**/*.rs.bk
|
|
@ -1,14 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "libafl_base"
|
|
||||||
version = "0.1.0"
|
|
||||||
edition = "2021"
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
libafl = { git = "https://github.com/AFLplusplus/LibAFL.git", rev = "266677bb88abe75165430f34e7de897c35560504" }
|
|
||||||
custom_mutator = { path = "../rust/custom_mutator", features = ["afl_internals"] }
|
|
||||||
serde = { version = "1.0", default-features = false, features = ["alloc"] } # serialization lib
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
crate-type = ["cdylib"]
|
|
@ -1,9 +0,0 @@
|
|||||||
all: target/release/liblibafl_base.so
|
|
||||||
cp target/release/liblibafl_base.so libafl_base.so
|
|
||||||
|
|
||||||
target/release/liblibafl_base.so: src/lib.rs
|
|
||||||
cargo build --release
|
|
||||||
|
|
||||||
clean:
|
|
||||||
cargo clean
|
|
||||||
rm -f libafl_base.so
|
|
@ -1,11 +0,0 @@
|
|||||||
# libafl basic havoc + token mutator
|
|
||||||
|
|
||||||
This uses the [libafl](https://github.com/AFLplusplus/libafl) StdScheduledMutator with `havoc_mutations` and `token_mutations`.
|
|
||||||
|
|
||||||
Make sure to have [cargo installed](https://rustup.rs/) and just type `make` to build.
|
|
||||||
|
|
||||||
Run with:
|
|
||||||
|
|
||||||
```
|
|
||||||
AFL_CUSTOM_MUTATOR_LIBRARY=custom_mutators/libafl_base/libafl_base.so AFL_CUSTOM_MUTATOR_ONLY=1 afl-fuzz ...
|
|
||||||
```
|
|
@ -1,252 +0,0 @@
|
|||||||
#![cfg(unix)]
|
|
||||||
|
|
||||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
|
||||||
use std::{
|
|
||||||
cell::{RefCell, UnsafeCell},
|
|
||||||
collections::HashMap,
|
|
||||||
ffi::CStr,
|
|
||||||
};
|
|
||||||
|
|
||||||
use custom_mutator::{afl_state, export_mutator, CustomMutator};
|
|
||||||
|
|
||||||
use libafl::{
|
|
||||||
bolts::{rands::StdRand, serdeany::SerdeAnyMap, tuples::Merge},
|
|
||||||
corpus::{Corpus, Testcase},
|
|
||||||
inputs::{BytesInput, HasBytesVec},
|
|
||||||
mutators::{
|
|
||||||
scheduled::{havoc_mutations, tokens_mutations, StdScheduledMutator, Tokens},
|
|
||||||
Mutator,
|
|
||||||
},
|
|
||||||
prelude::UsesInput,
|
|
||||||
state::{HasCorpus, HasMaxSize, HasMetadata, HasRand, State, UsesState},
|
|
||||||
Error,
|
|
||||||
};
|
|
||||||
|
|
||||||
#[allow(clippy::identity_op)]
|
|
||||||
const MAX_FILE: usize = 1 * 1024 * 1024;
|
|
||||||
|
|
||||||
static mut AFL: Option<&'static afl_state> = None;
|
|
||||||
static mut CURRENT_ENTRY: Option<usize> = None;
|
|
||||||
|
|
||||||
fn afl() -> &'static afl_state {
|
|
||||||
unsafe { AFL.unwrap() }
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default, Debug)]
|
|
||||||
pub struct AFLCorpus {
|
|
||||||
entries: UnsafeCell<HashMap<usize, RefCell<Testcase<BytesInput>>>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Clone for AFLCorpus {
|
|
||||||
fn clone(&self) -> Self {
|
|
||||||
unsafe {
|
|
||||||
Self {
|
|
||||||
entries: UnsafeCell::new(self.entries.get().as_ref().unwrap().clone()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Serialize for AFLCorpus {
|
|
||||||
fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>
|
|
||||||
where
|
|
||||||
S: Serializer,
|
|
||||||
{
|
|
||||||
unimplemented!();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for AFLCorpus {
|
|
||||||
fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
|
|
||||||
where
|
|
||||||
D: Deserializer<'de>,
|
|
||||||
{
|
|
||||||
unimplemented!();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl UsesState for AFLCorpus {
|
|
||||||
type State = AFLState;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Corpus for AFLCorpus {
|
|
||||||
#[inline]
|
|
||||||
fn count(&self) -> usize {
|
|
||||||
afl().queued_items as usize
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn add(&mut self, _testcase: Testcase<BytesInput>) -> Result<usize, Error> {
|
|
||||||
unimplemented!();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn replace(
|
|
||||||
&mut self,
|
|
||||||
_idx: usize,
|
|
||||||
_testcase: Testcase<BytesInput>,
|
|
||||||
) -> Result<Testcase<Self::Input>, Error> {
|
|
||||||
unimplemented!();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn remove(&mut self, _idx: usize) -> Result<Option<Testcase<BytesInput>>, Error> {
|
|
||||||
unimplemented!();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn get(&self, idx: usize) -> Result<&RefCell<Testcase<BytesInput>>, Error> {
|
|
||||||
unsafe {
|
|
||||||
let entries = self.entries.get().as_mut().unwrap();
|
|
||||||
entries.entry(idx).or_insert_with(|| {
|
|
||||||
let queue_buf = std::slice::from_raw_parts_mut(afl().queue_buf, self.count());
|
|
||||||
let entry = queue_buf[idx].as_mut().unwrap();
|
|
||||||
let fname = CStr::from_ptr((entry.fname.cast::<i8>()).as_ref().unwrap())
|
|
||||||
.to_str()
|
|
||||||
.unwrap()
|
|
||||||
.to_owned();
|
|
||||||
let mut testcase = Testcase::with_filename(BytesInput::new(vec![]), fname);
|
|
||||||
*testcase.input_mut() = None;
|
|
||||||
RefCell::new(testcase)
|
|
||||||
});
|
|
||||||
Ok(&self.entries.get().as_ref().unwrap()[&idx])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn current(&self) -> &Option<usize> {
|
|
||||||
unsafe {
|
|
||||||
CURRENT_ENTRY = Some(afl().current_entry as usize);
|
|
||||||
&CURRENT_ENTRY
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn current_mut(&mut self) -> &mut Option<usize> {
|
|
||||||
unimplemented!();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
|
||||||
pub struct AFLState {
|
|
||||||
rand: StdRand,
|
|
||||||
corpus: AFLCorpus,
|
|
||||||
metadata: SerdeAnyMap,
|
|
||||||
max_size: usize,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AFLState {
|
|
||||||
#[must_use]
|
|
||||||
pub fn new(seed: u32) -> Self {
|
|
||||||
Self {
|
|
||||||
rand: StdRand::with_seed(u64::from(seed)),
|
|
||||||
corpus: AFLCorpus::default(),
|
|
||||||
metadata: SerdeAnyMap::new(),
|
|
||||||
max_size: MAX_FILE,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl State for AFLState {}
|
|
||||||
|
|
||||||
impl HasRand for AFLState {
|
|
||||||
type Rand = StdRand;
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn rand(&self) -> &Self::Rand {
|
|
||||||
&self.rand
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn rand_mut(&mut self) -> &mut Self::Rand {
|
|
||||||
&mut self.rand
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl UsesInput for AFLState {
|
|
||||||
type Input = BytesInput;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl HasCorpus for AFLState {
|
|
||||||
type Corpus = AFLCorpus;
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn corpus(&self) -> &Self::Corpus {
|
|
||||||
&self.corpus
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn corpus_mut(&mut self) -> &mut Self::Corpus {
|
|
||||||
&mut self.corpus
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl HasMetadata for AFLState {
|
|
||||||
#[inline]
|
|
||||||
fn metadata(&self) -> &SerdeAnyMap {
|
|
||||||
&self.metadata
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn metadata_mut(&mut self) -> &mut SerdeAnyMap {
|
|
||||||
&mut self.metadata
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl HasMaxSize for AFLState {
|
|
||||||
fn max_size(&self) -> usize {
|
|
||||||
self.max_size
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_max_size(&mut self, max_size: usize) {
|
|
||||||
self.max_size = max_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct LibAFLBaseCustomMutator {
|
|
||||||
state: AFLState,
|
|
||||||
input: BytesInput,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl CustomMutator for LibAFLBaseCustomMutator {
|
|
||||||
type Error = libafl::Error;
|
|
||||||
|
|
||||||
fn init(afl: &'static afl_state, seed: u32) -> Result<Self, Self::Error> {
|
|
||||||
unsafe {
|
|
||||||
AFL = Some(afl);
|
|
||||||
let mut state = AFLState::new(seed);
|
|
||||||
let extras = std::slice::from_raw_parts(afl.extras, afl.extras_cnt as usize);
|
|
||||||
let mut tokens = vec![];
|
|
||||||
for extra in extras {
|
|
||||||
let data = std::slice::from_raw_parts(extra.data, extra.len as usize);
|
|
||||||
tokens.push(data.to_vec());
|
|
||||||
}
|
|
||||||
if !tokens.is_empty() {
|
|
||||||
state.add_metadata(Tokens::from(tokens));
|
|
||||||
}
|
|
||||||
Ok(Self {
|
|
||||||
state,
|
|
||||||
input: BytesInput::new(vec![]),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn fuzz<'b, 's: 'b>(
|
|
||||||
&'s mut self,
|
|
||||||
buffer: &'b mut [u8],
|
|
||||||
_add_buff: Option<&[u8]>,
|
|
||||||
max_size: usize,
|
|
||||||
) -> Result<Option<&'b [u8]>, Self::Error> {
|
|
||||||
self.state.set_max_size(max_size);
|
|
||||||
|
|
||||||
// TODO avoid copy
|
|
||||||
self.input.bytes_mut().clear();
|
|
||||||
self.input.bytes_mut().extend_from_slice(buffer);
|
|
||||||
|
|
||||||
let mut mutator = StdScheduledMutator::new(havoc_mutations().merge(tokens_mutations()));
|
|
||||||
mutator.mutate(&mut self.state, &mut self.input, 0)?;
|
|
||||||
Ok(Some(self.input.bytes()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export_mutator!(LibAFLBaseCustomMutator);
|
|
@ -100,8 +100,8 @@ extern "C" size_t afl_custom_fuzz(MyMutator *mutator, // return value from afl_c
|
|||||||
// Copy to a new buffer ( mutated_out )
|
// Copy to a new buffer ( mutated_out )
|
||||||
size_t mutated_size = s.size() <= max_size ? s.size() : max_size; // check if raw data's size is larger than max_size
|
size_t mutated_size = s.size() <= max_size ? s.size() : max_size; // check if raw data's size is larger than max_size
|
||||||
|
|
||||||
delete[] mutator->mutated_out;
|
delete mutator->mutated_out;
|
||||||
mutator->mutated_out = new uint8_t[mutated_size];
|
mutator->mutated_out = new uint8_t[mutated_size+1];
|
||||||
memcpy(mutator->mutated_out, s.c_str(), mutated_size); // copy the mutated data
|
memcpy(mutator->mutated_out, s.c_str(), mutated_size); // copy the mutated data
|
||||||
// Assign the mutated data and return mutated_size
|
// Assign the mutated data and return mutated_size
|
||||||
*out_buf = mutator->mutated_out;
|
*out_buf = mutator->mutated_out;
|
||||||
|
@ -4,7 +4,4 @@
|
|||||||
class MyMutator : public protobuf_mutator::Mutator {
|
class MyMutator : public protobuf_mutator::Mutator {
|
||||||
public:
|
public:
|
||||||
uint8_t *mutated_out = nullptr;
|
uint8_t *mutated_out = nullptr;
|
||||||
~MyMutator() {
|
|
||||||
delete[] mutated_out;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
1
custom_mutators/radamsa/custom_mutator_helpers.h
Symbolic link
1
custom_mutators/radamsa/custom_mutator_helpers.h
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../examples/custom_mutator_helpers.h
|
@ -4473,10 +4473,6 @@ static word prim_sys(word op, word a, word b, word c) {
|
|||||||
FD_CLOEXEC,
|
FD_CLOEXEC,
|
||||||
F_DUPFD,
|
F_DUPFD,
|
||||||
F_DUPFD_CLOEXEC,
|
F_DUPFD_CLOEXEC,
|
||||||
#if defined(F_DUP2FD)
|
|
||||||
F_DUP2FD,
|
|
||||||
F_DUP2FD_CLOEXEC,
|
|
||||||
#endif
|
|
||||||
F_GETFD,
|
F_GETFD,
|
||||||
F_SETFD,
|
F_SETFD,
|
||||||
F_GETFL,
|
F_GETFL,
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
// This simple example just creates random buffer <= 100 filled with 'A'
|
// This simple example just creates random buffer <= 100 filled with 'A'
|
||||||
// needs -I /path/to/AFLplusplus/include
|
// needs -I /path/to/AFLplusplus/include
|
||||||
|
//#include "custom_mutator_helpers.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -7,17 +8,19 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "radamsa.h"
|
#include "radamsa.h"
|
||||||
#include "afl-fuzz.h"
|
#include "custom_mutator_helpers.h"
|
||||||
|
|
||||||
typedef struct my_mutator {
|
typedef struct my_mutator {
|
||||||
|
|
||||||
afl_state_t *afl;
|
afl_t *afl;
|
||||||
u8 *mutator_buf;
|
|
||||||
|
u8 *mutator_buf;
|
||||||
|
|
||||||
unsigned int seed;
|
unsigned int seed;
|
||||||
|
|
||||||
} my_mutator_t;
|
} my_mutator_t;
|
||||||
|
|
||||||
my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
my_mutator_t *afl_custom_init(afl_t *afl, unsigned int seed) {
|
||||||
|
|
||||||
srand(seed);
|
srand(seed);
|
||||||
my_mutator_t *data = calloc(1, sizeof(my_mutator_t));
|
my_mutator_t *data = calloc(1, sizeof(my_mutator_t));
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "custom_mutator-sys"
|
name = "custom_mutator-sys"
|
||||||
version = "0.1.1"
|
version = "0.1.0"
|
||||||
authors = ["Julius Hohnerlein <julihoh@users.noreply.github.com>"]
|
authors = ["Julius Hohnerlein <julihoh@users.noreply.github.com>"]
|
||||||
edition = "2021"
|
edition = "2018"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
bindgen = "0.63"
|
bindgen = "0.56"
|
||||||
|
@ -15,8 +15,8 @@ fn main() {
|
|||||||
// The input header we would like to generate
|
// The input header we would like to generate
|
||||||
// bindings for.
|
// bindings for.
|
||||||
.header("wrapper.h")
|
.header("wrapper.h")
|
||||||
.allowlist_type("afl_state_t")
|
.whitelist_type("afl_state_t")
|
||||||
.blocklist_type(r"u\d+")
|
.blacklist_type(r"u\d+")
|
||||||
.opaque_type(r"_.*")
|
.opaque_type(r"_.*")
|
||||||
.opaque_type("FILE")
|
.opaque_type("FILE")
|
||||||
.opaque_type("in_addr(_t)?")
|
.opaque_type("in_addr(_t)?")
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#![allow(non_upper_case_globals)]
|
#![allow(non_upper_case_globals)]
|
||||||
#![allow(non_camel_case_types)]
|
#![allow(non_camel_case_types)]
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
#![allow(clippy::too_many_lines)]
|
|
||||||
#![allow(clippy::used_underscore_binding)]
|
|
||||||
|
|
||||||
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
|
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
name = "custom_mutator"
|
name = "custom_mutator"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Julius Hohnerlein <julihoh@users.noreply.github.com>"]
|
authors = ["Julius Hohnerlein <julihoh@users.noreply.github.com>"]
|
||||||
edition = "2021"
|
edition = "2018"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
//! This binding is panic-safe in that it will prevent panics from unwinding into AFL++. Any panic will `abort` at the boundary between the custom mutator and AFL++.
|
//! This binding is panic-safe in that it will prevent panics from unwinding into AFL++. Any panic will `abort` at the boundary between the custom mutator and AFL++.
|
||||||
//!
|
//!
|
||||||
//! # Access to AFL++ internals
|
//! # Access to AFL++ internals
|
||||||
//! This crate has an optional feature "`afl_internals`", which gives access to AFL++'s internal state.
|
//! This crate has an optional feature "afl_internals", which gives access to AFL++'s internal state.
|
||||||
//! The state is passed to [`CustomMutator::init`], when the feature is activated.
|
//! The state is passed to [`CustomMutator::init`], when the feature is activated.
|
||||||
//!
|
//!
|
||||||
//! _This is completely unsafe and uses automatically generated types extracted from the AFL++ source._
|
//! _This is completely unsafe and uses automatically generated types extracted from the AFL++ source._
|
||||||
@ -115,7 +115,7 @@ pub mod wrappers {
|
|||||||
impl<M: RawCustomMutator> FFIContext<M> {
|
impl<M: RawCustomMutator> FFIContext<M> {
|
||||||
fn from(ptr: *mut c_void) -> ManuallyDrop<Box<Self>> {
|
fn from(ptr: *mut c_void) -> ManuallyDrop<Box<Self>> {
|
||||||
assert!(!ptr.is_null());
|
assert!(!ptr.is_null());
|
||||||
ManuallyDrop::new(unsafe { Box::from_raw(ptr.cast::<Self>()) })
|
ManuallyDrop::new(unsafe { Box::from_raw(ptr as *mut Self) })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn into_ptr(self: Box<Self>) -> *const c_void {
|
fn into_ptr(self: Box<Self>) -> *const c_void {
|
||||||
@ -141,28 +141,27 @@ pub mod wrappers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// panic handler called for every panic
|
/// panic handler called for every panic
|
||||||
fn panic_handler(method: &str, panic_info: &Box<dyn Any + Send + 'static>) -> ! {
|
fn panic_handler(method: &str, panic_info: Box<dyn Any + Send + 'static>) -> ! {
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
let cause = panic_info.downcast_ref::<String>().map_or_else(
|
let cause = panic_info
|
||||||
|| {
|
.downcast_ref::<String>()
|
||||||
|
.map(String::deref)
|
||||||
|
.unwrap_or_else(|| {
|
||||||
panic_info
|
panic_info
|
||||||
.downcast_ref::<&str>()
|
.downcast_ref::<&str>()
|
||||||
.copied()
|
.copied()
|
||||||
.unwrap_or("<cause unknown>")
|
.unwrap_or("<cause unknown>")
|
||||||
},
|
});
|
||||||
String::deref,
|
eprintln!("A panic occurred at {}: {}", method, cause);
|
||||||
);
|
|
||||||
eprintln!("A panic occurred at {method}: {cause}");
|
|
||||||
abort()
|
abort()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Internal function used in the macro
|
/// Internal function used in the macro
|
||||||
#[cfg(not(feature = "afl_internals"))]
|
#[cfg(not(feature = "afl_internals"))]
|
||||||
#[must_use]
|
|
||||||
pub fn afl_custom_init_<M: RawCustomMutator>(seed: u32) -> *const c_void {
|
pub fn afl_custom_init_<M: RawCustomMutator>(seed: u32) -> *const c_void {
|
||||||
match catch_unwind(|| FFIContext::<M>::new(seed).into_ptr()) {
|
match catch_unwind(|| FFIContext::<M>::new(seed).into_ptr()) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(err) => panic_handler("afl_custom_init", &err),
|
Err(err) => panic_handler("afl_custom_init", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,7 +176,7 @@ pub mod wrappers {
|
|||||||
FFIContext::<M>::new(afl, seed).into_ptr()
|
FFIContext::<M>::new(afl, seed).into_ptr()
|
||||||
}) {
|
}) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(err) => panic_handler("afl_custom_init", &err),
|
Err(err) => panic_handler("afl_custom_init", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,27 +196,32 @@ pub mod wrappers {
|
|||||||
) -> usize {
|
) -> usize {
|
||||||
match catch_unwind(|| {
|
match catch_unwind(|| {
|
||||||
let mut context = FFIContext::<M>::from(data);
|
let mut context = FFIContext::<M>::from(data);
|
||||||
|
if buf.is_null() {
|
||||||
assert!(!buf.is_null(), "null buf passed to afl_custom_fuzz");
|
panic!("null buf passed to afl_custom_fuzz")
|
||||||
assert!(!out_buf.is_null(), "null out_buf passed to afl_custom_fuzz");
|
}
|
||||||
|
if out_buf.is_null() {
|
||||||
|
panic!("null out_buf passed to afl_custom_fuzz")
|
||||||
|
}
|
||||||
let buff_slice = slice::from_raw_parts_mut(buf, buf_size);
|
let buff_slice = slice::from_raw_parts_mut(buf, buf_size);
|
||||||
let add_buff_slice = if add_buf.is_null() {
|
let add_buff_slice = if add_buf.is_null() {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(slice::from_raw_parts(add_buf, add_buf_size))
|
Some(slice::from_raw_parts(add_buf, add_buf_size))
|
||||||
};
|
};
|
||||||
if let Some(buffer) = context.mutator.fuzz(buff_slice, add_buff_slice, max_size) {
|
match context.mutator.fuzz(buff_slice, add_buff_slice, max_size) {
|
||||||
*out_buf = buffer.as_ptr();
|
Some(buffer) => {
|
||||||
buffer.len()
|
*out_buf = buffer.as_ptr();
|
||||||
} else {
|
buffer.len()
|
||||||
// return the input buffer with 0-length to let AFL skip this mutation attempt
|
}
|
||||||
*out_buf = buf;
|
None => {
|
||||||
0
|
// return the input buffer with 0-length to let AFL skip this mutation attempt
|
||||||
|
*out_buf = buf;
|
||||||
|
0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}) {
|
}) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(err) => panic_handler("afl_custom_fuzz", &err),
|
Err(err) => panic_handler("afl_custom_fuzz", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,8 +237,9 @@ pub mod wrappers {
|
|||||||
) -> u32 {
|
) -> u32 {
|
||||||
match catch_unwind(|| {
|
match catch_unwind(|| {
|
||||||
let mut context = FFIContext::<M>::from(data);
|
let mut context = FFIContext::<M>::from(data);
|
||||||
assert!(!buf.is_null(), "null buf passed to afl_custom_fuzz");
|
if buf.is_null() {
|
||||||
|
panic!("null buf passed to afl_custom_fuzz")
|
||||||
|
}
|
||||||
let buf_slice = slice::from_raw_parts(buf, buf_size);
|
let buf_slice = slice::from_raw_parts(buf, buf_size);
|
||||||
// see https://doc.rust-lang.org/nomicon/borrow-splitting.html
|
// see https://doc.rust-lang.org/nomicon/borrow-splitting.html
|
||||||
let ctx = &mut **context;
|
let ctx = &mut **context;
|
||||||
@ -242,39 +247,37 @@ pub mod wrappers {
|
|||||||
mutator.fuzz_count(buf_slice)
|
mutator.fuzz_count(buf_slice)
|
||||||
}) {
|
}) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(err) => panic_handler("afl_custom_fuzz_count", &err),
|
Err(err) => panic_handler("afl_custom_fuzz_count", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Internal function used in the macro
|
/// Internal function used in the macro
|
||||||
pub unsafe fn afl_custom_queue_new_entry_<M: RawCustomMutator>(
|
pub fn afl_custom_queue_new_entry_<M: RawCustomMutator>(
|
||||||
data: *mut c_void,
|
data: *mut c_void,
|
||||||
filename_new_queue: *const c_char,
|
filename_new_queue: *const c_char,
|
||||||
filename_orig_queue: *const c_char,
|
filename_orig_queue: *const c_char,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
match catch_unwind(|| {
|
match catch_unwind(|| {
|
||||||
let mut context = FFIContext::<M>::from(data);
|
let mut context = FFIContext::<M>::from(data);
|
||||||
assert!(
|
if filename_new_queue.is_null() {
|
||||||
!filename_new_queue.is_null(),
|
panic!("received null filename_new_queue in afl_custom_queue_new_entry");
|
||||||
"received null filename_new_queue in afl_custom_queue_new_entry"
|
}
|
||||||
);
|
|
||||||
|
|
||||||
let filename_new_queue = Path::new(OsStr::from_bytes(
|
let filename_new_queue = Path::new(OsStr::from_bytes(
|
||||||
unsafe { CStr::from_ptr(filename_new_queue) }.to_bytes(),
|
unsafe { CStr::from_ptr(filename_new_queue) }.to_bytes(),
|
||||||
));
|
));
|
||||||
let filename_orig_queue = if filename_orig_queue.is_null() {
|
let filename_orig_queue = if !filename_orig_queue.is_null() {
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(Path::new(OsStr::from_bytes(
|
Some(Path::new(OsStr::from_bytes(
|
||||||
unsafe { CStr::from_ptr(filename_orig_queue) }.to_bytes(),
|
unsafe { CStr::from_ptr(filename_orig_queue) }.to_bytes(),
|
||||||
)))
|
)))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
};
|
};
|
||||||
context
|
context
|
||||||
.mutator
|
.mutator
|
||||||
.queue_new_entry(filename_new_queue, filename_orig_queue)
|
.queue_new_entry(filename_new_queue, filename_orig_queue)
|
||||||
}) {
|
}) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(err) => panic_handler("afl_custom_queue_new_entry", &err),
|
Err(err) => panic_handler("afl_custom_queue_new_entry", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,7 +292,7 @@ pub mod wrappers {
|
|||||||
ManuallyDrop::into_inner(FFIContext::<M>::from(data));
|
ManuallyDrop::into_inner(FFIContext::<M>::from(data));
|
||||||
}) {
|
}) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(err) => panic_handler("afl_custom_deinit", &err),
|
Err(err) => panic_handler("afl_custom_deinit", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,13 +306,13 @@ pub mod wrappers {
|
|||||||
buf.extend_from_slice(res.as_bytes());
|
buf.extend_from_slice(res.as_bytes());
|
||||||
buf.push(0);
|
buf.push(0);
|
||||||
// unwrapping here, as the error case should be extremely rare
|
// unwrapping here, as the error case should be extremely rare
|
||||||
CStr::from_bytes_with_nul(buf).unwrap().as_ptr()
|
CStr::from_bytes_with_nul(&buf).unwrap().as_ptr()
|
||||||
} else {
|
} else {
|
||||||
null()
|
null()
|
||||||
}
|
}
|
||||||
}) {
|
}) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(err) => panic_handler("afl_custom_introspection", &err),
|
Err(err) => panic_handler("afl_custom_introspection", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -326,18 +329,18 @@ pub mod wrappers {
|
|||||||
buf.extend_from_slice(res.as_bytes());
|
buf.extend_from_slice(res.as_bytes());
|
||||||
buf.push(0);
|
buf.push(0);
|
||||||
// unwrapping here, as the error case should be extremely rare
|
// unwrapping here, as the error case should be extremely rare
|
||||||
CStr::from_bytes_with_nul(buf).unwrap().as_ptr()
|
CStr::from_bytes_with_nul(&buf).unwrap().as_ptr()
|
||||||
} else {
|
} else {
|
||||||
null()
|
null()
|
||||||
}
|
}
|
||||||
}) {
|
}) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(err) => panic_handler("afl_custom_describe", &err),
|
Err(err) => panic_handler("afl_custom_describe", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Internal function used in the macro
|
/// Internal function used in the macro
|
||||||
pub unsafe fn afl_custom_queue_get_<M: RawCustomMutator>(
|
pub fn afl_custom_queue_get_<M: RawCustomMutator>(
|
||||||
data: *mut c_void,
|
data: *mut c_void,
|
||||||
filename: *const c_char,
|
filename: *const c_char,
|
||||||
) -> u8 {
|
) -> u8 {
|
||||||
@ -345,46 +348,16 @@ pub mod wrappers {
|
|||||||
let mut context = FFIContext::<M>::from(data);
|
let mut context = FFIContext::<M>::from(data);
|
||||||
assert!(!filename.is_null());
|
assert!(!filename.is_null());
|
||||||
|
|
||||||
u8::from(context.mutator.queue_get(Path::new(OsStr::from_bytes(
|
context.mutator.queue_get(Path::new(OsStr::from_bytes(
|
||||||
unsafe { CStr::from_ptr(filename) }.to_bytes(),
|
unsafe { CStr::from_ptr(filename) }.to_bytes(),
|
||||||
))))
|
))) as u8
|
||||||
}) {
|
}) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(err) => panic_handler("afl_custom_queue_get", &err),
|
Err(err) => panic_handler("afl_custom_queue_get", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An exported macro to defined afl_custom_init meant for insternal usage
|
|
||||||
#[cfg(feature = "afl_internals")]
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! _define_afl_custom_init {
|
|
||||||
($mutator_type:ty) => {
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn afl_custom_init(
|
|
||||||
afl: ::std::option::Option<&'static $crate::afl_state>,
|
|
||||||
seed: ::std::os::raw::c_uint,
|
|
||||||
) -> *const ::std::os::raw::c_void {
|
|
||||||
$crate::wrappers::afl_custom_init_::<$mutator_type>(afl, seed as u32)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// An exported macro to defined `afl_custom_init` meant for internal usage
|
|
||||||
#[cfg(not(feature = "afl_internals"))]
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! _define_afl_custom_init {
|
|
||||||
($mutator_type:ty) => {
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn afl_custom_init(
|
|
||||||
_afl: *const ::std::os::raw::c_void,
|
|
||||||
seed: ::std::os::raw::c_uint,
|
|
||||||
) -> *const ::std::os::raw::c_void {
|
|
||||||
$crate::wrappers::afl_custom_init_::<$mutator_type>(seed as u32)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// exports the given Mutator as a custom mutator as the C interface that AFL++ expects.
|
/// exports the given Mutator as a custom mutator as the C interface that AFL++ expects.
|
||||||
/// It is not possible to call this macro multiple times, because it would define the custom mutator symbols multiple times.
|
/// It is not possible to call this macro multiple times, because it would define the custom mutator symbols multiple times.
|
||||||
/// # Example
|
/// # Example
|
||||||
@ -408,7 +381,23 @@ macro_rules! _define_afl_custom_init {
|
|||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! export_mutator {
|
macro_rules! export_mutator {
|
||||||
($mutator_type:ty) => {
|
($mutator_type:ty) => {
|
||||||
$crate::_define_afl_custom_init!($mutator_type);
|
#[cfg(feature = "afl_internals")]
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn afl_custom_init(
|
||||||
|
afl: ::std::option::Option<&'static $crate::afl_state>,
|
||||||
|
seed: ::std::os::raw::c_uint,
|
||||||
|
) -> *const ::std::os::raw::c_void {
|
||||||
|
$crate::wrappers::afl_custom_init_::<$mutator_type>(afl, seed as u32)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "afl_internals"))]
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn afl_custom_init(
|
||||||
|
_afl: *const ::std::os::raw::c_void,
|
||||||
|
seed: ::std::os::raw::c_uint,
|
||||||
|
) -> *const ::std::os::raw::c_void {
|
||||||
|
$crate::wrappers::afl_custom_init_::<$mutator_type>(seed as u32)
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn afl_custom_fuzz_count(
|
pub unsafe extern "C" fn afl_custom_fuzz_count(
|
||||||
@ -441,7 +430,7 @@ macro_rules! export_mutator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn afl_custom_queue_new_entry(
|
pub extern "C" fn afl_custom_queue_new_entry(
|
||||||
data: *mut ::std::os::raw::c_void,
|
data: *mut ::std::os::raw::c_void,
|
||||||
filename_new_queue: *const ::std::os::raw::c_char,
|
filename_new_queue: *const ::std::os::raw::c_char,
|
||||||
filename_orig_queue: *const ::std::os::raw::c_char,
|
filename_orig_queue: *const ::std::os::raw::c_char,
|
||||||
@ -454,7 +443,7 @@ macro_rules! export_mutator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn afl_custom_queue_get(
|
pub extern "C" fn afl_custom_queue_get(
|
||||||
data: *mut ::std::os::raw::c_void,
|
data: *mut ::std::os::raw::c_void,
|
||||||
filename: *const ::std::os::raw::c_char,
|
filename: *const ::std::os::raw::c_char,
|
||||||
) -> u8 {
|
) -> u8 {
|
||||||
@ -517,10 +506,9 @@ mod sanity_test {
|
|||||||
export_mutator!(ExampleMutator);
|
export_mutator!(ExampleMutator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unused_variables)]
|
||||||
/// A custom mutator.
|
/// A custom mutator.
|
||||||
/// [`CustomMutator::handle_error`] will be called in case any method returns an [`Result::Err`].
|
/// [`CustomMutator::handle_error`] will be called in case any method returns an [`Result::Err`].
|
||||||
#[allow(unused_variables)]
|
|
||||||
#[allow(clippy::missing_errors_doc)]
|
|
||||||
pub trait CustomMutator {
|
pub trait CustomMutator {
|
||||||
/// The error type. All methods must return the same error type.
|
/// The error type. All methods must return the same error type.
|
||||||
type Error: Debug;
|
type Error: Debug;
|
||||||
@ -535,7 +523,7 @@ pub trait CustomMutator {
|
|||||||
.map(|v| !v.is_empty())
|
.map(|v| !v.is_empty())
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
{
|
{
|
||||||
eprintln!("Error in custom mutator: {err:?}");
|
eprintln!("Error in custom mutator: {:?}", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -757,7 +745,8 @@ mod truncate_test {
|
|||||||
let actual_output = truncate_str_unicode_safe(input, *max_len);
|
let actual_output = truncate_str_unicode_safe(input, *max_len);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
&actual_output, expected_output,
|
&actual_output, expected_output,
|
||||||
"{input:#?} truncated to {max_len} bytes should be {expected_output:#?}, but is {actual_output:#?}"
|
"{:#?} truncated to {} bytes should be {:#?}, but is {:#?}",
|
||||||
|
input, max_len, expected_output, actual_output
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
name = "example_mutator"
|
name = "example_mutator"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Julius Hohnerlein <julihoh@users.noreply.github.com>"]
|
authors = ["Julius Hohnerlein <julihoh@users.noreply.github.com>"]
|
||||||
edition = "2021"
|
edition = "2018"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
name = "example_lain"
|
name = "example_lain"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Julius Hohnerlein <julihoh@users.noreply.github.com>"]
|
authors = ["Julius Hohnerlein <julihoh@users.noreply.github.com>"]
|
||||||
edition = "2021"
|
edition = "2018"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
@ -1,11 +1,6 @@
|
|||||||
# custum mutator: symcc
|
# custum mutator: symcc
|
||||||
|
|
||||||
This uses the symcc to find new paths into the target.
|
This uses the excellent symcc to find new paths into the target.
|
||||||
|
|
||||||
Note that this is a just a proof of concept example! It is better to use
|
|
||||||
the fuzzing helpers of symcc, symqemu, Fuzzolic, etc. rather than this.
|
|
||||||
|
|
||||||
Also the symqemu custom mutator is better than this.
|
|
||||||
|
|
||||||
To use this custom mutator follow the steps in the symcc repository
|
To use this custom mutator follow the steps in the symcc repository
|
||||||
[https://github.com/eurecom-s3/symcc/](https://github.com/eurecom-s3/symcc/)
|
[https://github.com/eurecom-s3/symcc/](https://github.com/eurecom-s3/symcc/)
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
ifdef DEBUG
|
|
||||||
CFLAGS += -DDEBUG
|
|
||||||
endif
|
|
||||||
|
|
||||||
all: symqemu-mutator.so
|
|
||||||
|
|
||||||
CFLAGS += -O3 -funroll-loops
|
|
||||||
|
|
||||||
symqemu-mutator.so: symqemu.c
|
|
||||||
$(CC) -g $(CFLAGS) $(CPPFLAGS) -g -I../../include -shared -fPIC -o symqemu-mutator.so symqemu.c
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f symqemu-mutator.so *.o *~ core
|
|
@ -1,19 +0,0 @@
|
|||||||
# custum mutator: symqemu
|
|
||||||
|
|
||||||
This uses the symcc to find new paths into the target.
|
|
||||||
|
|
||||||
## How to build and use
|
|
||||||
|
|
||||||
To use this custom mutator follow the steps in the symqemu repository
|
|
||||||
[https://github.com/eurecom-s3/symqemu/](https://github.com/eurecom-s3/symqemu/)
|
|
||||||
on how to build symqemu-x86_x64 and put it in your `PATH`.
|
|
||||||
|
|
||||||
Just type `make` to build this custom mutator.
|
|
||||||
|
|
||||||
```AFL_CUSTOM_MUTATOR_LIBRARY=custom_mutators/symqemu/symqemu-mutator.so AFL_DISABLE_TRIM=1 afl-fuzz ...```
|
|
||||||
|
|
||||||
## Options
|
|
||||||
|
|
||||||
`SYMQEMU_ALL=1` - use concolic solving on **all** queue items, not only interesting/favorite ones.
|
|
||||||
|
|
||||||
`SYMQEMU_LATE=1` - use concolic solving only after there have been no finds for 5 minutes.
|
|
@ -1,424 +0,0 @@
|
|||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include "config.h"
|
|
||||||
#include "debug.h"
|
|
||||||
#include "afl-fuzz.h"
|
|
||||||
#include "common.h"
|
|
||||||
|
|
||||||
afl_state_t *afl_struct;
|
|
||||||
static u32 debug = 0;
|
|
||||||
static u32 found_items = 0;
|
|
||||||
|
|
||||||
#define SYMQEMU_LOCATION "symqemu"
|
|
||||||
|
|
||||||
#define DBG(x...) \
|
|
||||||
if (debug) { fprintf(stderr, x); }
|
|
||||||
|
|
||||||
typedef struct my_mutator {
|
|
||||||
|
|
||||||
afl_state_t *afl;
|
|
||||||
u32 all;
|
|
||||||
u32 late;
|
|
||||||
u8 *mutator_buf;
|
|
||||||
u8 *out_dir;
|
|
||||||
u8 *target;
|
|
||||||
u8 *symqemu;
|
|
||||||
u8 *input_file;
|
|
||||||
u32 counter;
|
|
||||||
u32 seed;
|
|
||||||
u32 argc;
|
|
||||||
u8 **argv;
|
|
||||||
|
|
||||||
} my_mutator_t;
|
|
||||||
|
|
||||||
my_mutator_t *afl_custom_init(afl_state_t *afl, unsigned int seed) {
|
|
||||||
|
|
||||||
if (getenv("AFL_DEBUG")) debug = 1;
|
|
||||||
|
|
||||||
my_mutator_t *data = calloc(1, sizeof(my_mutator_t));
|
|
||||||
if (!data) {
|
|
||||||
|
|
||||||
perror("afl_custom_init alloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
char *path = getenv("PATH");
|
|
||||||
char *exec_name = "symqemu-x86_64";
|
|
||||||
char *token = strtok(path, ":");
|
|
||||||
char exec_path[4096];
|
|
||||||
|
|
||||||
while (token != NULL && data->symqemu == NULL) {
|
|
||||||
|
|
||||||
snprintf(exec_path, sizeof(exec_path), "%s/%s", token, exec_name);
|
|
||||||
if (access(exec_path, X_OK) == 0) {
|
|
||||||
|
|
||||||
data->symqemu = (u8 *)strdup(exec_path);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
token = strtok(NULL, ":");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data->symqemu) FATAL("symqemu binary %s not found", exec_name);
|
|
||||||
DBG("Found %s\n", data->symqemu);
|
|
||||||
|
|
||||||
if (getenv("AFL_CUSTOM_MUTATOR_ONLY")) {
|
|
||||||
|
|
||||||
WARNF(
|
|
||||||
"the symqemu module is not very effective with "
|
|
||||||
"AFL_CUSTOM_MUTATOR_ONLY.");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((data->mutator_buf = malloc(MAX_FILE)) == NULL) {
|
|
||||||
|
|
||||||
free(data);
|
|
||||||
perror("mutator_buf alloc");
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->target = getenv("AFL_CUSTOM_INFO_PROGRAM");
|
|
||||||
|
|
||||||
u8 *path_tmp = getenv("AFL_CUSTOM_INFO_OUT");
|
|
||||||
u32 len = strlen(path_tmp) + 32;
|
|
||||||
u8 *symqemu_path = malloc(len);
|
|
||||||
data->out_dir = malloc(len);
|
|
||||||
snprintf(symqemu_path, len, "%s/%s", path_tmp, SYMQEMU_LOCATION);
|
|
||||||
snprintf(data->out_dir, len, "%s/out", symqemu_path, path_tmp);
|
|
||||||
|
|
||||||
(void)mkdir(symqemu_path, 0755);
|
|
||||||
(void)mkdir(data->out_dir, 0755);
|
|
||||||
|
|
||||||
setenv("SYMCC_OUTPUT_DIR", data->out_dir, 1);
|
|
||||||
|
|
||||||
data->input_file = getenv("AFL_CUSTOM_INFO_PROGRAM_INPUT");
|
|
||||||
|
|
||||||
u8 *tmp = NULL;
|
|
||||||
if ((tmp = getenv("AFL_CUSTOM_INFO_PROGRAM_ARGV")) && *tmp) {
|
|
||||||
|
|
||||||
int argc = 0, index = 2;
|
|
||||||
for (u32 i = 0; i < strlen(tmp); ++i)
|
|
||||||
if (isspace(tmp[i])) ++argc;
|
|
||||||
|
|
||||||
data->argv = (u8 **)malloc((argc + 4) * sizeof(u8 **));
|
|
||||||
u8 *p = strdup(tmp);
|
|
||||||
|
|
||||||
do {
|
|
||||||
|
|
||||||
data->argv[index] = p;
|
|
||||||
while (*p && !isspace(*p))
|
|
||||||
++p;
|
|
||||||
if (*p) {
|
|
||||||
|
|
||||||
*p++ = 0;
|
|
||||||
while (isspace(*p))
|
|
||||||
++p;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(data->argv[index], "@@") == 0) {
|
|
||||||
|
|
||||||
if (!data->input_file) {
|
|
||||||
|
|
||||||
u32 ilen = strlen(symqemu_path) + 32;
|
|
||||||
data->input_file = malloc(ilen);
|
|
||||||
snprintf(data->input_file, ilen, "%s/.input", symqemu_path);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->argv[index] = data->input_file;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG("%d: %s\n", index, data->argv[index]);
|
|
||||||
index++;
|
|
||||||
|
|
||||||
} while (*p);
|
|
||||||
|
|
||||||
data->argv[index] = NULL;
|
|
||||||
data->argc = index;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
data->argv = (u8 **)malloc(8 * sizeof(u8 **));
|
|
||||||
data->argc = 2;
|
|
||||||
data->argv[2] = NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data->argv[0] = data->symqemu;
|
|
||||||
data->argv[1] = data->target;
|
|
||||||
data->afl = afl;
|
|
||||||
data->seed = seed;
|
|
||||||
afl_struct = afl;
|
|
||||||
|
|
||||||
if (getenv("SYMQEMU_ALL")) { data->all = 1; }
|
|
||||||
if (getenv("SYMQEMU_LATE")) { data->late = 1; }
|
|
||||||
if (data->input_file) { setenv("SYMCC_INPUT_FILE", data->input_file, 1); }
|
|
||||||
|
|
||||||
DBG("out_dir=%s, target=%s, input_file=%s, argc=%u\n", data->out_dir,
|
|
||||||
data->target,
|
|
||||||
data->input_file ? (char *)data->input_file : (char *)"<stdin>",
|
|
||||||
data->argc);
|
|
||||||
|
|
||||||
if (debug) {
|
|
||||||
|
|
||||||
fprintf(stderr, "[");
|
|
||||||
for (u32 i = 0; i <= data->argc; ++i)
|
|
||||||
fprintf(stderr, " \"%s\"",
|
|
||||||
data->argv[i] ? (char *)data->argv[i] : "<NULL>");
|
|
||||||
fprintf(stderr, " ]\n");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* No need to receive a splicing item */
|
|
||||||
void afl_custom_splice_optout(void *data) {
|
|
||||||
|
|
||||||
(void)(data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get unix time in milliseconds */
|
|
||||||
|
|
||||||
inline u64 get_cur_time(void) {
|
|
||||||
|
|
||||||
struct timeval tv;
|
|
||||||
struct timezone tz;
|
|
||||||
|
|
||||||
gettimeofday(&tv, &tz);
|
|
||||||
|
|
||||||
return (tv.tv_sec * 1000ULL) + (tv.tv_usec / 1000);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 afl_custom_fuzz_count(my_mutator_t *data, const u8 *buf, size_t buf_size) {
|
|
||||||
|
|
||||||
if (likely((!afl_struct->queue_cur->favored && !data->all) ||
|
|
||||||
afl_struct->queue_cur->was_fuzzed)) {
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (likely(data->late)) {
|
|
||||||
|
|
||||||
if (unlikely(get_cur_time() - afl_struct->last_find_time <=
|
|
||||||
10 * 60 * 1000)) {
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int pipefd[2];
|
|
||||||
struct stat st;
|
|
||||||
|
|
||||||
if (afl_struct->afl_env.afl_no_ui) {
|
|
||||||
|
|
||||||
ACTF("Sending to symqemu: %s", afl_struct->queue_cur->fname);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(stat(afl_struct->queue_cur->fname, &st) == 0 && S_ISREG(st.st_mode) &&
|
|
||||||
st.st_size)) {
|
|
||||||
|
|
||||||
PFATAL("Couldn't find enqueued file: %s", afl_struct->queue_cur->fname);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (afl_struct->fsrv.use_stdin) {
|
|
||||||
|
|
||||||
if (pipe(pipefd) == -1) {
|
|
||||||
|
|
||||||
PFATAL(
|
|
||||||
"Couldn't create a pipe for interacting with symqemu child process");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data->input_file) {
|
|
||||||
|
|
||||||
int fd = open(data->input_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
|
|
||||||
ssize_t s = write(fd, buf, buf_size);
|
|
||||||
close(fd);
|
|
||||||
DBG("wrote %zd/%zd to %s\n", s, buf_size, data->input_file);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int pid = fork();
|
|
||||||
|
|
||||||
if (pid == -1) return 0;
|
|
||||||
|
|
||||||
if (likely(pid)) {
|
|
||||||
|
|
||||||
if (!data->input_file || afl_struct->fsrv.use_stdin) {
|
|
||||||
|
|
||||||
close(pipefd[0]);
|
|
||||||
|
|
||||||
if (fcntl(pipefd[1], F_GETPIPE_SZ)) {
|
|
||||||
|
|
||||||
fcntl(pipefd[1], F_SETPIPE_SZ, MAX_FILE);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
ck_write(pipefd[1], buf, buf_size, data->input_file);
|
|
||||||
|
|
||||||
close(pipefd[1]);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
pid = waitpid(pid, NULL, 0);
|
|
||||||
DBG("symqemu finished executing!\n");
|
|
||||||
|
|
||||||
} else /* (pid == 0) */ { // child
|
|
||||||
|
|
||||||
if (afl_struct->fsrv.use_stdin) {
|
|
||||||
|
|
||||||
close(pipefd[1]);
|
|
||||||
dup2(pipefd[0], 0);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG("exec=%s\n", data->target);
|
|
||||||
if (!debug) {
|
|
||||||
|
|
||||||
close(1);
|
|
||||||
close(2);
|
|
||||||
dup2(afl_struct->fsrv.dev_null_fd, 1);
|
|
||||||
dup2(afl_struct->fsrv.dev_null_fd, 2);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
execvp((char *)data->argv[0], (char **)data->argv);
|
|
||||||
fprintf(stderr, "Executing: [");
|
|
||||||
for (u32 i = 0; i <= data->argc; ++i)
|
|
||||||
fprintf(stderr, " \"%s\"",
|
|
||||||
data->argv[i] ? (char *)data->argv[i] : "<NULL>");
|
|
||||||
fprintf(stderr, " ]\n");
|
|
||||||
FATAL("Failed to execute %s %s\n", data->argv[0], data->argv[1]);
|
|
||||||
exit(-1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* back in mother process */
|
|
||||||
|
|
||||||
struct dirent **nl;
|
|
||||||
s32 i, items = scandir(data->out_dir, &nl, NULL, NULL);
|
|
||||||
found_items = 0;
|
|
||||||
char source_name[4096];
|
|
||||||
|
|
||||||
if (items > 0) {
|
|
||||||
|
|
||||||
for (i = 0; i < (u32)items; ++i) {
|
|
||||||
|
|
||||||
// symqemu output files start with a digit
|
|
||||||
if (!isdigit(nl[i]->d_name[0])) continue;
|
|
||||||
|
|
||||||
struct stat st;
|
|
||||||
snprintf(source_name, sizeof(source_name), "%s/%s", data->out_dir,
|
|
||||||
nl[i]->d_name);
|
|
||||||
DBG("file=%s\n", source_name);
|
|
||||||
|
|
||||||
if (stat(source_name, &st) == 0 && S_ISREG(st.st_mode) && st.st_size) {
|
|
||||||
|
|
||||||
++found_items;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
free(nl[i]);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
free(nl);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG("Done, found %u items!\n", found_items);
|
|
||||||
|
|
||||||
return found_items;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t afl_custom_fuzz(my_mutator_t *data, u8 *buf, size_t buf_size,
|
|
||||||
u8 **out_buf, u8 *add_buf, size_t add_buf_size,
|
|
||||||
size_t max_size) {
|
|
||||||
|
|
||||||
struct dirent **nl;
|
|
||||||
s32 done = 0, i, items = scandir(data->out_dir, &nl, NULL, NULL);
|
|
||||||
char source_name[4096];
|
|
||||||
|
|
||||||
if (items > 0) {
|
|
||||||
|
|
||||||
for (i = 0; i < (u32)items; ++i) {
|
|
||||||
|
|
||||||
// symqemu output files start with a digit
|
|
||||||
if (!isdigit(nl[i]->d_name[0])) continue;
|
|
||||||
|
|
||||||
struct stat st;
|
|
||||||
snprintf(source_name, sizeof(source_name), "%s/%s", data->out_dir,
|
|
||||||
nl[i]->d_name);
|
|
||||||
DBG("file=%s\n", source_name);
|
|
||||||
|
|
||||||
if (stat(source_name, &st) == 0 && S_ISREG(st.st_mode) && st.st_size) {
|
|
||||||
|
|
||||||
int fd = open(source_name, O_RDONLY);
|
|
||||||
if (fd < 0) { goto got_an_issue; }
|
|
||||||
|
|
||||||
ssize_t r = read(fd, data->mutator_buf, MAX_FILE);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
DBG("fn=%s, fd=%d, size=%ld\n", source_name, fd, r);
|
|
||||||
|
|
||||||
if (r < 1) { goto got_an_issue; }
|
|
||||||
|
|
||||||
done = 1;
|
|
||||||
--found_items;
|
|
||||||
unlink(source_name);
|
|
||||||
|
|
||||||
*out_buf = data->mutator_buf;
|
|
||||||
return (u32)r;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
free(nl[i]);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
free(nl);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
got_an_issue:
|
|
||||||
*out_buf = NULL;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deinitialize everything
|
|
||||||
*
|
|
||||||
* @param data The data ptr from afl_custom_init
|
|
||||||
*/
|
|
||||||
void afl_custom_deinit(my_mutator_t *data) {
|
|
||||||
|
|
||||||
free(data->mutator_buf);
|
|
||||||
free(data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
# AFL++ dictionaries
|
# AFL++ dictionaries
|
||||||
|
|
||||||
For the general instruction manual, see [docs/README.md](../docs/README.md).
|
(See [../README.md](../README.md) for the general instruction manual.)
|
||||||
|
|
||||||
This subdirectory contains a set of dictionaries that can be used in conjunction
|
This subdirectory contains a set of dictionaries that can be used in conjunction
|
||||||
with the -x option to allow the fuzzer to effortlessly explore the grammar of
|
with the -x option to allow the fuzzer to effortlessly explore the grammar of
|
||||||
|
@ -1,307 +1,24 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
This is the list of all noteworthy changes made in every public
|
This is the list of all noteworthy changes made in every public release of
|
||||||
release of the tool. See README.md for the general instruction manual.
|
the tool. See README.md for the general instruction manual.
|
||||||
|
|
||||||
### Version ++4.10c (release)
|
## Staying informed
|
||||||
- afl-fuzz:
|
|
||||||
- default power schedule is now EXPLORE, due a fix in fast schedules
|
|
||||||
explore is slightly better now.
|
|
||||||
- fixed minor issues in the mutation engine, thanks to @futhewo for
|
|
||||||
reporting!
|
|
||||||
- better deterministic fuzzing is now available, benchmarks have shown
|
|
||||||
to improve fuzzing. Enable with -D. Thanks to @kdsjZh for the PR!
|
|
||||||
- afl-cc:
|
|
||||||
- large rewrite by @SonicStark which fixes a few corner cases, thanks!
|
|
||||||
- LTO mode now requires llvm 12+
|
|
||||||
- workaround for ASAN with gcc_plugin mode
|
|
||||||
- instrumentation:
|
|
||||||
- LLVM 18 support, thanks to @devnexen!
|
|
||||||
- Injection (SQL, LDAP, XSS) fuzzing feature now available, see
|
|
||||||
`instrumentation/README.injections.md` how to activate/use/expand.
|
|
||||||
- compcov/LAF-intel:
|
|
||||||
- floating point splitting bug fix by @hexcoder
|
|
||||||
- due a bug in LLVM 17 integer splitting is disabled there!
|
|
||||||
- when splitting floats was selected, integers were always split as well,
|
|
||||||
fixed to require AFL_LLVM_LAF_SPLIT_COMPARES or _ALL as it should
|
|
||||||
- dynamic instrumentation filtering for LLVM NATIVE, thanks @Mozilla!
|
|
||||||
see utils/dynamic_covfilter/README.md
|
|
||||||
- qemu_mode:
|
|
||||||
- plugins are now activated by default and a new module is included that
|
|
||||||
produces drcov compatible traces for lighthouse/lightkeeper/...
|
|
||||||
thanks to @JRomainG to submitting!
|
|
||||||
- updated Nyx checkout (fixes a bug) and some QOL
|
|
||||||
- updated the custom grammar mutator
|
|
||||||
- document afl-cmin does not work on macOS (but afl-cmin.bash does)
|
|
||||||
|
|
||||||
### Version ++4.09c (release)
|
Want to stay in the loop on major new features? Join our mailing list by
|
||||||
- afl-fuzz:
|
sending a mail to <afl-users+subscribe@googlegroups.com>.
|
||||||
- fixed the new mutation implementation for two bugs
|
|
||||||
- added `AFL_FINAL_SYNC` which forces a final fuzzer sync (also for `-F`)
|
|
||||||
before terminating.
|
|
||||||
- added AFL_IGNORE_SEED_PROBLEMS to skip over seeds that time out instead
|
|
||||||
of exiting with an error message
|
|
||||||
- allow -S/-M naming up to 50 characters (from 24)
|
|
||||||
- CMPLOG:
|
|
||||||
- added scale support (-l S)
|
|
||||||
- skip unhelpful insertions (u8)
|
|
||||||
- added --version and --help command line parameters
|
|
||||||
- fixed endless loop when reading malformed dictionaries
|
|
||||||
- new custom mutator function: post_run - thanks to yangzao!
|
|
||||||
- afl-whatsup:
|
|
||||||
- detect instanced that are starting up and show them as such as not dead
|
|
||||||
- now also shows coverage reached
|
|
||||||
- option -m shows only very relevant stats
|
|
||||||
- option -n will not use color in the output
|
|
||||||
- instrumentation:
|
|
||||||
- fix for a few string compare transform functions for LAF
|
|
||||||
- we are instrumenting __cxx internal functions again. this might break
|
|
||||||
a few targets, please report if so.
|
|
||||||
- frida_mode:
|
|
||||||
- fixes support for large map offsets
|
|
||||||
- support for AFL_FUZZER_LOOPCOUNT for afl.rs and LLVMFuzzerTestOneInput
|
|
||||||
- afl-cmin/afl-cmin.bash: prevent unneeded file errors
|
|
||||||
- added new tool afl-addseeds that adds new seeds to a running campaign
|
|
||||||
- added benchmark/benchmark.py if you want to see how good your fuzzing
|
|
||||||
speed is in comparison to other setups.
|
|
||||||
|
|
||||||
### Version ++4.08c (release)
|
### Version ++3.15a (dev)
|
||||||
- afl-fuzz:
|
- documentation restructuring, made possible by Google Season of Docs
|
||||||
- new mutation engine: mutations that favor discovery more paths are
|
|
||||||
prefered until no new finds for 10 minutes then switching to mutations
|
|
||||||
that favor triggering crashes. Modes and switch time can be configured
|
|
||||||
with `-P`. Also input mode for the target can be defined with `-a` to
|
|
||||||
be `text` or `binary` (defaults to `generic`)
|
|
||||||
- new custom mutator that has the new afl++ engine (so it can easily
|
|
||||||
incorporated into new custom mutators), and also comes with a standalone
|
|
||||||
command line tool! See custom_mutators/aflpp/standalone/
|
|
||||||
- display the state of the fuzzing run in the UI :-)
|
|
||||||
- fix timeout setting if '+' is used or a session is restarted
|
|
||||||
- -l X option to enable base64 transformation solving
|
|
||||||
- allow to disable CMPLOG with '-c -' (e.g. afl.rs enforces '-c 0' on
|
|
||||||
every instance which is counterproductive).
|
|
||||||
- afl-cmin/afl-cmin.bash:
|
|
||||||
- fixed a bug inherited from vanilla AFL where a coverage of
|
|
||||||
map[123] = 11 would be the same as map[1123] = 1
|
|
||||||
- warn on crashing inputs
|
|
||||||
- adjust threads if less inputs than threads specified
|
|
||||||
- afl-cc:
|
|
||||||
- fixed an off-by-one instrumentation of iselect, hurting coverage a bit.
|
|
||||||
Thanks to @amykweon for spotting and fixing!
|
|
||||||
- @toka fixed a bug in laf-intel signed integer comparison splitting,
|
|
||||||
thanks a lot!!
|
|
||||||
- more LLVM compatability
|
|
||||||
- frida_mode:
|
|
||||||
- support for long form instrumentation on x86_x64 and arm64
|
|
||||||
- renamed utils/get_symbol_addr.sh to utils/frida_get_symbol_addr.sh
|
|
||||||
- qemu_mode:
|
|
||||||
- added qemu_mode/utils/qemu_get_symbol_addr.sh
|
|
||||||
|
|
||||||
### Version ++4.07c (release)
|
|
||||||
- afl-fuzz:
|
|
||||||
- reverse reading the seeds only on restarts (increases performance)
|
|
||||||
- new env `AFL_POST_PROCESS_KEEP_ORIGINAL` to keep the orignal
|
|
||||||
data before post process on finds (for atnwalk custom mutator)
|
|
||||||
- new env `AFL_IGNORE_PROBLEMS_COVERAGE` to ignore coverage from
|
|
||||||
loaded libs after forkserver initialization (required by Mozilla)
|
|
||||||
- afl-cc:
|
|
||||||
- added @responsefile support
|
|
||||||
- new env `AFL_LLVM_LTO_SKIPINIT` to support the AFL++ based WASM
|
|
||||||
(https://github.com/fgsect/WAFL) project
|
|
||||||
- error and print help if afl-clan-lto is used with lto=thin
|
|
||||||
- rewrote our PCGUARD pass to be compatible with LLVM 15+ shenanigans,
|
|
||||||
requires LLVM 13+ now instead of 10.0.1+
|
|
||||||
- fallback to native LLVM PCGUARD if our PCGUARD is unavailable
|
|
||||||
- fixed a crash in GCC CMPLOG
|
|
||||||
- afl-showmap:
|
|
||||||
- added custom mutator post_process and send support
|
|
||||||
- add `-I filelist` option, an alternative to `-i in_dir`
|
|
||||||
- afl-cmin + afl-cmin.bash:
|
|
||||||
- `-T threads` parallel task support, can be a huge speedup!
|
|
||||||
- qemu_mode:
|
|
||||||
- Persistent mode + QASAN support for ppc32 targets by @worksbutnottested
|
|
||||||
- a new grammar custom mutator atnwalk was submitted by @voidptr127 !
|
|
||||||
- two new custom mutators are now available:
|
|
||||||
- TritonDSE in custom_mutators/aflpp_tritondse
|
|
||||||
- SymQEMU in custom_mutators/symqemu
|
|
||||||
|
|
||||||
### Version ++4.06c (release)
|
|
||||||
- afl-fuzz:
|
|
||||||
- ensure temporary file descriptor is closed when not used
|
|
||||||
- added `AFL_NO_WARN_INSTABILITY`
|
|
||||||
- added time_wo_finds to fuzzer_stats
|
|
||||||
- fixed a crash in pizza (1st april easter egg) mode. Sorry for
|
|
||||||
everyone who was affected!
|
|
||||||
- allow pizza mode to be disabled when AFL_PIZZA_MODE is set to -1
|
|
||||||
- option `-p mmopt` now also selects new queue items more often
|
|
||||||
- fix bug in post_process custom mutator implementation
|
|
||||||
- print name of custom mutator in UI
|
|
||||||
- slight changes that improve fuzzer performance
|
|
||||||
- afl-cc:
|
|
||||||
- add CFI sanitizer variant to gcc targets
|
|
||||||
- llvm 16 + 17 support (thanks to @devnexen!)
|
|
||||||
- support llvm 15 native pcguard changes
|
|
||||||
- support for LLVMFuzzerTestOneInput -1 return
|
|
||||||
- LTO autoken and llvm_mode: added AFL_LLVM_DICT2FILE_NO_MAIN support
|
|
||||||
- qemu_mode:
|
|
||||||
- fix _RANGES envs to allow hyphens in the filenames
|
|
||||||
- basic riscv support
|
|
||||||
- frida_mode:
|
|
||||||
- added `AFL_FRIDA_STATS_INTERVAL`
|
|
||||||
- fix issue on MacOS
|
|
||||||
- unicorn_mode:
|
|
||||||
- updated and minor issues fixed
|
|
||||||
- nyx_mode support for all tools
|
|
||||||
- better sanitizer default options support for all tools
|
|
||||||
- new custom module: autotoken, a grammar free fuzzer for text inputs
|
|
||||||
- fixed custom mutator C examples
|
|
||||||
- more minor fixes and cross-platform support
|
|
||||||
|
|
||||||
### Version ++4.05c (release)
|
|
||||||
- MacOS: libdislocator, libtokencap etc. do not work with modern
|
|
||||||
MacOS anymore, but could be patched to work, see this issue if you
|
|
||||||
want to make the effort and send a PR:
|
|
||||||
https://github.com/AFLplusplus/AFLplusplus/issues/1594
|
|
||||||
- afl-fuzz:
|
|
||||||
- added afl_custom_fuzz_send custom mutator feature. Now your can
|
|
||||||
send fuzz data to the target as you need, e.g. via IPC.
|
|
||||||
- cmplog mode now has a -l R option for random colorization, thanks
|
|
||||||
to guyf2010 for the PR!
|
|
||||||
- queue statistics are written every 30 minutes to
|
|
||||||
out/NAME/queue_data if compiled with INTROSPECTION
|
|
||||||
- new env: AFL_FORK_SERVER_KILL_SIGNAL
|
|
||||||
- afl-showmap/afl-cmin
|
|
||||||
- `-t none` now translates to `-t 120000` (120 seconds)
|
|
||||||
- unicorn_mode updated
|
|
||||||
- updated rust custom mutator dependencies and LibAFL custom mutator
|
|
||||||
- overall better sanitizer default setting handling
|
|
||||||
- several minor bugfixes
|
|
||||||
|
|
||||||
### Version ++4.04c (release)
|
|
||||||
- fix gramatron and grammar_mutator build scripts
|
|
||||||
- enhancements to the afl-persistent-config and afl-system-config
|
|
||||||
scripts
|
|
||||||
- afl-fuzz:
|
|
||||||
- force writing all stats on exit
|
|
||||||
- ensure targets are killed on exit
|
|
||||||
- `AFL_FORK_SERVER_KILL_SIGNAL` added
|
|
||||||
- afl-cc:
|
|
||||||
- make gcc_mode (afl-gcc-fast) work with gcc down to version 3.6
|
|
||||||
- qemu_mode:
|
|
||||||
- fixed 10x speed degredation in v4.03c, thanks to @ele7enxxh for
|
|
||||||
reporting!
|
|
||||||
- added qemu_mode/fastexit helper library
|
|
||||||
- unicorn_mode:
|
|
||||||
- Enabled tricore arch (by @jma-qb)
|
|
||||||
- Updated Capstone version in Rust bindings
|
|
||||||
- llvm-mode:
|
|
||||||
- AFL runtime will always pass inputs via shared memory, when possible,
|
|
||||||
ignoring the command line.
|
|
||||||
|
|
||||||
|
|
||||||
### 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:
|
|
||||||
- important fix for the default pcguard mode when LLVM IR vector
|
|
||||||
selects are produced, thanks to @juppytt for reporting!
|
|
||||||
- gcc_plugin:
|
|
||||||
- Adacore submitted CMPLOG support to the gcc_plugin! :-)
|
|
||||||
- llvm_mode:
|
|
||||||
- laf cmp splitting fixed for more comparison types
|
|
||||||
- frida_mode:
|
|
||||||
- now works on Android!
|
|
||||||
- afl-fuzz:
|
|
||||||
- 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 :)
|
|
||||||
- afl-fuzz:
|
|
||||||
- when you just want to compile once and set CMPLOG, then just
|
|
||||||
set -c 0 to tell afl-fuzz that the fuzzing binary is also for
|
|
||||||
CMPLOG.
|
|
||||||
- new commandline options -g/G to set min/max length of generated
|
|
||||||
fuzz inputs
|
|
||||||
- you can set the time for syncing to other fuzzer now with
|
|
||||||
AFL_SYNC_TIME
|
|
||||||
- reintroduced AFL_PERSISTENT and AFL_DEFER_FORKSRV to allow
|
|
||||||
persistent mode and manual forkserver support if these are not
|
|
||||||
in the target binary (e.g. are in a shared library)
|
|
||||||
- add AFL_EARLY_FORKSERVER to install the forkserver as earliest as
|
|
||||||
possible in the target (for afl-gcc-fast/afl-clang-fast/
|
|
||||||
afl-clang-lto)
|
|
||||||
- "saved timeouts" was wrong information, timeouts are still thrown
|
|
||||||
away by default even if they have new coverage (hangs are always
|
|
||||||
kept), unless AFL_KEEP_TIMEOUTS are set
|
|
||||||
- AFL never implemented auto token inserts (but user token inserts,
|
|
||||||
user token overwrite and auto token overwrite), added now!
|
|
||||||
- fixed a mutation type in havoc mode
|
|
||||||
- Mopt fix to always select the correct algorithm
|
|
||||||
- fix effector map calculation (deterministic mode)
|
|
||||||
- fix custom mutator post_process functionality
|
|
||||||
- document and auto-activate pizza mode on condition
|
|
||||||
- afl-cc:
|
|
||||||
- due a bug in lld of llvm 15 LTO instrumentation wont work atm :-(
|
|
||||||
- converted all passed to use the new llvm pass manager for llvm 11+
|
|
||||||
- AFL++ PCGUARD mode is not available for 10.0.1 anymore (11+ only)
|
|
||||||
- trying to stay on top on all these #$&§!! changes in llvm 15 ...
|
|
||||||
- frida_mode:
|
|
||||||
- update to new frida release, handles now c++ throw/catch
|
|
||||||
- unicorn_mode:
|
|
||||||
- update unicorn engine, fix C example
|
|
||||||
- utils:
|
|
||||||
- removed optimin because it looses coverage due to a bug and is
|
|
||||||
unmaintained :-(
|
|
||||||
|
|
||||||
|
|
||||||
### Version ++4.00c (release)
|
|
||||||
- complete documentation restructuring, made possible by Google Season
|
|
||||||
of Docs :) thank you Jana!
|
|
||||||
- we renamed several UI and fuzzer_stat entries to be more precise,
|
- we renamed several UI and fuzzer_stat entries to be more precise,
|
||||||
e.g. "unique crashes" -> "saved crashes", "total paths" ->
|
e.g. "unique crashes" -> "saved crashes", "total paths" ->
|
||||||
"corpus count", "current path" -> "current item".
|
"corpus count", "current path" -> "current item".
|
||||||
This might need changing custom scripting!
|
This might need changing custom scripting!
|
||||||
- Nyx mode (full system emulation with snapshot capability) has been
|
|
||||||
added - thanks to @schumilo and @eqv!
|
|
||||||
- unicorn_mode:
|
|
||||||
- Moved to unicorn2! by Ziqiao Kong (@lazymio)
|
|
||||||
- Faster, more accurate emulation (newer QEMU base), risc-v support
|
|
||||||
- removed indirections in rust callbacks
|
|
||||||
- new binary-only fuzzing mode: coresight_mode for aarch64 CPUs :)
|
- new binary-only fuzzing mode: coresight_mode for aarch64 CPUs :)
|
||||||
thanks to RICSecLab submitting!
|
thanks to RICSecLab submitting!
|
||||||
- if instrumented libaries are dlopen()'ed after the forkserver you
|
- if instrumented libaries are dlopen()'ed after the forkserver you
|
||||||
will now see a crash. Before you would have colliding coverage.
|
will now see crashes. before you would have colliding coverage.
|
||||||
We changed this to force fixing a broken setup rather then allowing
|
we changed this to force fixing a broken setup rather then allowing
|
||||||
ineffective fuzzing.
|
ineffective fuzzing.
|
||||||
See docs/best_practices.md how to fix such setups.
|
See docs/best_practices.md how to fix such setups.
|
||||||
- afl-fuzz:
|
- afl-fuzz:
|
||||||
@ -309,17 +26,14 @@
|
|||||||
(it is better!)
|
(it is better!)
|
||||||
- fix a regression introduced in 3.10 that resulted in less
|
- fix a regression introduced in 3.10 that resulted in less
|
||||||
coverage being detected. thanks to Collin May for reporting!
|
coverage being detected. thanks to Collin May for reporting!
|
||||||
- ensure all spawned targets are killed on exit
|
|
||||||
- added AFL_IGNORE_PROBLEMS, plus checks to identify and abort on
|
- added AFL_IGNORE_PROBLEMS, plus checks to identify and abort on
|
||||||
incorrect LTO usage setups and enhanced the READMEs for better
|
incorrect LTO usage setups and enhanced the READMEs for better
|
||||||
information on how to deal with instrumenting libraries
|
information on how to deal with instrumenting libraries
|
||||||
- fix -n dumb mode (nobody should use this mode though)
|
- fix -n dumb mode (nobody should use this)
|
||||||
- fix stability issue with LTO and cmplog
|
- fix stability issue with LTO and cmplog
|
||||||
- better banner
|
- better banner
|
||||||
- more effective cmplog mode
|
- more effective cmplog mode
|
||||||
- more often update the UI when in input2stage mode
|
- more often update the UI when in input2stage mode
|
||||||
- qemu_mode/unicorn_mode: fixed OOB write when using libcompcov,
|
|
||||||
thanks to kotee4ko for reporting!
|
|
||||||
- frida_mode:
|
- frida_mode:
|
||||||
- better performance, bug fixes
|
- better performance, bug fixes
|
||||||
- David Carlier added Android support :)
|
- David Carlier added Android support :)
|
||||||
@ -329,22 +43,16 @@
|
|||||||
- fix bug where targets are not killed on timeouts
|
- fix bug where targets are not killed on timeouts
|
||||||
- moved hidden afl-showmap -A option to -H to be used for
|
- moved hidden afl-showmap -A option to -H to be used for
|
||||||
coresight_mode
|
coresight_mode
|
||||||
- Prevent accidentally killing non-afl/fuzz services when aborting
|
- Prevent accidently killing non-afl/fuzz services when aborting
|
||||||
afl-showmap and other tools.
|
afl-showmap and other tools.
|
||||||
- afl-cc:
|
- afl-cc:
|
||||||
- detect overflow reads on initial input buffer for asan
|
- new cmplog mode (incompatible with older afl++ versions)
|
||||||
- new cmplog mode (incompatible with older AFL++ versions)
|
|
||||||
- support llvm IR select instrumentation for default PCGUARD and LTO
|
- support llvm IR select instrumentation for default PCGUARD and LTO
|
||||||
- fix for shared linking on MacOS
|
- fix for shared linking on MacOS
|
||||||
- better selective instrumentation AFL_LLVM_{ALLOW|DENY}LIST
|
|
||||||
on filename matching (requires llvm 11 or newer)
|
|
||||||
- fixed a potential crash in targets for LAF string handling
|
- fixed a potential crash in targets for LAF string handling
|
||||||
- fixed a bad assert in LAF split switches
|
|
||||||
- added AFL_USE_TSAN thread sanitizer support
|
- added AFL_USE_TSAN thread sanitizer support
|
||||||
- llvm and LTO mode modified to work with new llvm 14-dev (again.)
|
- llvm and LTO mode modified to work with new llvm 14-dev (again. again.)
|
||||||
- fix for AFL_REAL_LD
|
- fix for AFL_REAL_LD
|
||||||
- more -z defs filtering
|
|
||||||
- make -v without options work
|
|
||||||
- added the very good grammar mutator "GramaTron" to the
|
- added the very good grammar mutator "GramaTron" to the
|
||||||
custom_mutators
|
custom_mutators
|
||||||
- added optimin, a faster and better corpus minimizer by
|
- added optimin, a faster and better corpus minimizer by
|
||||||
@ -352,10 +60,11 @@
|
|||||||
- added afl-persistent-config script to set perform permanent system
|
- added afl-persistent-config script to set perform permanent system
|
||||||
configuration settings for fuzzing, for Linux and Macos.
|
configuration settings for fuzzing, for Linux and Macos.
|
||||||
thanks to jhertz!
|
thanks to jhertz!
|
||||||
- added xml, curl & exotic string functions to llvm dictionary feature
|
- added xml, curl and exotic string functions to llvm dictionary features
|
||||||
- fix AFL_PRELOAD issues on MacOS
|
- fix AFL_PRELOAD issues on MacOS
|
||||||
- removed utils/afl_frida because frida_mode/ is now so much better
|
- removed utils/afl_frida because frida_mode/ is now so much better
|
||||||
- added uninstall target to makefile (todo: update new readme!)
|
- added uninstall target to makefile (todo: update new readme!)
|
||||||
|
- removed indirections in rust callbacks for unicornafl
|
||||||
|
|
||||||
### Version ++3.14c (release)
|
### Version ++3.14c (release)
|
||||||
- afl-fuzz:
|
- afl-fuzz:
|
||||||
@ -375,7 +84,7 @@
|
|||||||
- Fix to instrument global namespace functions in c++
|
- Fix to instrument global namespace functions in c++
|
||||||
- Fix for llvm 13
|
- Fix for llvm 13
|
||||||
- support partial linking
|
- support partial linking
|
||||||
- do honor AFL_LLVM_{ALLOW/DENY}LIST for LTO autodictionary andDICT2FILE
|
- do honor AFL_LLVM_{ALLOW/DENY}LIST for LTO autodictionary and DICT2FILE
|
||||||
- We do support llvm versions from 3.8 to 5.0 again
|
- We do support llvm versions from 3.8 to 5.0 again
|
||||||
- frida_mode:
|
- frida_mode:
|
||||||
- several fixes for cmplog
|
- several fixes for cmplog
|
||||||
|
175
docs/FAQ.md
175
docs/FAQ.md
@ -29,8 +29,8 @@ If you find an interesting or important question missing, submit it via
|
|||||||
which then implemented their own research and features, making it now by far
|
which then implemented their own research and features, making it now by far
|
||||||
the most flexible and feature rich guided fuzzer available as open source. And
|
the most flexible and feature rich guided fuzzer available as open source. And
|
||||||
in independent fuzzing benchmarks it is one of the best fuzzers available,
|
in independent fuzzing benchmarks it is one of the best fuzzers available,
|
||||||
e.g.,
|
e.g., [Fuzzbench
|
||||||
[Fuzzbench Report](https://www.fuzzbench.com/reports/2020-08-03/index.html).
|
Report](https://www.fuzzbench.com/reports/2020-08-03/index.html).
|
||||||
</p></details>
|
</p></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -58,10 +58,10 @@ If you find an interesting or important question missing, submit it via
|
|||||||
|
|
||||||
A program contains `functions`, `functions` contain the compiled machine code.
|
A program contains `functions`, `functions` contain the compiled machine code.
|
||||||
The compiled machine code in a `function` can be in a single or many `basic
|
The compiled machine code in a `function` can be in a single or many `basic
|
||||||
blocks`. A `basic block` is the **largest possible number of subsequent machine
|
blocks`. A `basic block` is the largest possible number of subsequent machine
|
||||||
code instructions** that has **exactly one entry point** (which can be be entered by
|
code instructions that has exactly one entry point (which can be be entered by
|
||||||
multiple other basic blocks) and runs linearly **without branching or jumping to
|
multiple other basic blocks) and runs linearly without branching or jumping to
|
||||||
other addresses** (except at the end).
|
other addresses (except at the end).
|
||||||
|
|
||||||
```
|
```
|
||||||
function() {
|
function() {
|
||||||
@ -103,42 +103,6 @@ If you find an interesting or important question missing, submit it via
|
|||||||
to itself, this too would be an edge.
|
to itself, this too would be an edge.
|
||||||
</p></details>
|
</p></details>
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary id="should-you-ever-stop-afl-fuzz-minimize-the-corpus-and-restart">Should you ever stop afl-fuzz, minimize the corpus and restart?</summary><p>
|
|
||||||
|
|
||||||
To stop afl-fuzz, minimize it's corpus and restart you would usually do:
|
|
||||||
|
|
||||||
```
|
|
||||||
Control-C # to terminate afl-fuzz
|
|
||||||
$ afl-cmin -T nproc -i out/default/queue -o minimized_queue -- ./target
|
|
||||||
$ AFL_FAST_CAL=1 AFL_CMPLOG_ONLY_NEW=1 afl-fuzz -i minimized_queue -o out2 [other options] -- ./target
|
|
||||||
```
|
|
||||||
|
|
||||||
If this improves fuzzing or not is debated and no consensus has been reached
|
|
||||||
or in-depth analysis been performed.
|
|
||||||
|
|
||||||
On the pro side:
|
|
||||||
* The queue/corpus is reduced (up to 20%) by removing intermediate paths
|
|
||||||
that are maybe not needed anymore.
|
|
||||||
|
|
||||||
On the con side:
|
|
||||||
* Fuzzing time is lost for the time the fuzzing is stopped, minimized and
|
|
||||||
restarted.
|
|
||||||
|
|
||||||
The the big question:
|
|
||||||
* Does a minimized queue/corpus improve finding new coverage or does it
|
|
||||||
hinder it?
|
|
||||||
|
|
||||||
The AFL++ team's own limited analysis seem to to show that keeping
|
|
||||||
intermediate paths help to find more coverage, at least for afl-fuzz.
|
|
||||||
|
|
||||||
For honggfuzz in comparison it is a good idea to restart it from time to
|
|
||||||
time if you have other fuzzers (e.g: AFL++) running in parallel to sync
|
|
||||||
the finds of other fuzzers to honggfuzz as it has no syncing feature like
|
|
||||||
AFL++ or libfuzzer.
|
|
||||||
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
## Targets
|
## Targets
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -207,14 +171,6 @@ If you find an interesting or important question missing, submit it via
|
|||||||
The more "unstable" edges there are, the harder it is for AFL++ to identify
|
The more "unstable" edges there are, the harder it is for AFL++ to identify
|
||||||
valid new paths.
|
valid new paths.
|
||||||
|
|
||||||
If you fuzz in persistent mode (`AFL_LOOP` or `LLVMFuzzerTestOneInput()`
|
|
||||||
harnesses, a large number of unstable edges can mean that the target keeps
|
|
||||||
internal state and therefore it is possible that crashes cannot be replayed.
|
|
||||||
In such a case do either **not** fuzz in persistent mode (remove `AFL_LOOP()`
|
|
||||||
from your harness or call `LLVMFuzzerTestOneInput()` harnesses with `@@`),
|
|
||||||
or set a low `AFL_LOOP` value, e.g. 100, and enable `AFL_PERSISTENT_RECORD`
|
|
||||||
in `config.h` with the same value.
|
|
||||||
|
|
||||||
A value above 90% is usually fine and a value above 80% is also still ok, and
|
A value above 90% is usually fine and a value above 80% is also still ok, and
|
||||||
even a value above 20% can still result in successful finds of bugs. However,
|
even a value above 20% can still result in successful finds of bugs. However,
|
||||||
it is recommended that for values below 90% or 80% you should take
|
it is recommended that for values below 90% or 80% you should take
|
||||||
@ -224,59 +180,8 @@ If you find an interesting or important question missing, submit it via
|
|||||||
[best_practices.md#improving-stability](best_practices.md#improving-stability).
|
[best_practices.md#improving-stability](best_practices.md#improving-stability).
|
||||||
</p></details>
|
</p></details>
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary id="what-are-power-schedules">What are power schedules?</summary><p>
|
|
||||||
|
|
||||||
Not every item in our queue/corpus is the same, some are more interesting,
|
|
||||||
others provide little value.
|
|
||||||
A power schedule measures how "interesting" a value is, and depending on
|
|
||||||
the calculated value spends more or less time mutating it.
|
|
||||||
|
|
||||||
AFL++ comes with several power schedules, initially ported from
|
|
||||||
[AFLFast](https://github.com/mboehme/aflfast), however, modified to be more
|
|
||||||
effective and several more modes added.
|
|
||||||
|
|
||||||
The most effective modes are `-p fast` (default) and `-p explore`.
|
|
||||||
|
|
||||||
If you fuzz with several parallel afl-fuzz instances, then it is beneficial
|
|
||||||
to assign a different schedule to each instance, however the majority should
|
|
||||||
be `fast` and `explore`.
|
|
||||||
|
|
||||||
It does not make sense to explain the details of the calculation and
|
|
||||||
reasoning behind all of the schedules. If you are interested, read the source
|
|
||||||
code and the AFLFast paper.
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary id="fatal-forkserver-is-already-up-but-an-instrumented-dlopen-library-loaded-afterwards">FATAL: forkserver is already up but an instrumented dlopen library loaded afterwards</summary><p>
|
|
||||||
|
|
||||||
It can happen that you see this error on startup when fuzzing a target:
|
|
||||||
|
|
||||||
```
|
|
||||||
[-] FATAL: forkserver is already up, but an instrumented dlopen() library
|
|
||||||
loaded afterwards. You must AFL_PRELOAD such libraries to be able
|
|
||||||
to fuzz them or LD_PRELOAD to run outside of afl-fuzz.
|
|
||||||
To ignore this set AFL_IGNORE_PROBLEMS=1.
|
|
||||||
```
|
|
||||||
|
|
||||||
As the error describes, a dlopen() call is happening in the target that is
|
|
||||||
loading an instrumented library after the forkserver is already in place. This
|
|
||||||
is a problem for afl-fuzz because when the forkserver is started, we must know
|
|
||||||
the map size already and it can't be changed later.
|
|
||||||
|
|
||||||
The best solution is to simply set `AFL_PRELOAD=foo.so` to the libraries that
|
|
||||||
are dlopen'ed (e.g., use `strace` to see which), or to set a manual forkserver
|
|
||||||
after the final dlopen().
|
|
||||||
|
|
||||||
If this is not a viable option, you can set `AFL_IGNORE_PROBLEMS=1` but then
|
|
||||||
the existing map will be used also for the newly loaded libraries, which
|
|
||||||
allows it to work, however, the efficiency of the fuzzing will be partially
|
|
||||||
degraded. Note that there is additionally `AFL_IGNORE_PROBLEMS_COVERAGE` to
|
|
||||||
additionally tell AFL++ to ignore any coverage from the late loaded libaries.
|
|
||||||
</p></details>
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary id="i-got-a-weird-compile-error-from-clang">I got a weird compile error from clang.</summary><p>
|
<summary id="i-got-a-weird-compile-error-from-clang">I got a weird compile error from clang.</summary><p>
|
||||||
|
|
||||||
@ -299,70 +204,4 @@ If you find an interesting or important question missing, submit it via
|
|||||||
package and because of that the AFL++ llvm plugins do not match anymore.
|
package and because of that the AFL++ llvm plugins do not match anymore.
|
||||||
|
|
||||||
Solution: `git pull ; make clean install` of AFL++.
|
Solution: `git pull ; make clean install` of AFL++.
|
||||||
</p></details>
|
</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>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary id="linker-errors">Linker errors.</summary><p>
|
|
||||||
|
|
||||||
If you compile C++ harnesses and see `undefined reference` errors for
|
|
||||||
variables named `__afl_...`, e.g.:
|
|
||||||
|
|
||||||
```
|
|
||||||
/usr/bin/ld: /tmp/test-d3085f.o: in function `foo::test()':
|
|
||||||
test.cpp:(.text._ZN3fooL4testEv[_ZN3fooL4testEv]+0x35): undefined reference to `foo::__afl_connected'
|
|
||||||
clang: error: linker command failed with exit code 1 (use -v to see invocation)
|
|
||||||
```
|
|
||||||
|
|
||||||
Then you use AFL++ macros like `__AFL_LOOP` within a namespace and this
|
|
||||||
will not work.
|
|
||||||
|
|
||||||
Solution: Move that harness portion to the global namespace, e.g. before:
|
|
||||||
```
|
|
||||||
#include <cstdio>
|
|
||||||
namespace foo {
|
|
||||||
static void test() {
|
|
||||||
while(__AFL_LOOP(1000)) {
|
|
||||||
foo::function();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
foo::test();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
after:
|
|
||||||
```
|
|
||||||
#include <cstdio>
|
|
||||||
static void mytest() {
|
|
||||||
while(__AFL_LOOP(1000)) {
|
|
||||||
foo::function();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
namespace foo {
|
|
||||||
static void test() {
|
|
||||||
mytest();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
foo::test();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
</p></details>
|
|
@ -3,32 +3,26 @@
|
|||||||
## Linux on x86
|
## Linux on x86
|
||||||
|
|
||||||
An easy way to install AFL++ with everything compiled is available via docker:
|
An easy way to install AFL++ with everything compiled is available via docker:
|
||||||
You can use the [Dockerfile](../Dockerfile) or just pull directly from the
|
You can use the [Dockerfile](../Dockerfile) (which has gcc-10 and clang-11 -
|
||||||
Docker Hub (for x86_64 and arm64):
|
hence afl-clang-lto is available!) or just pull directly from the Docker Hub:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
docker pull aflplusplus/aflplusplus:latest
|
docker pull aflplusplus/aflplusplus
|
||||||
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
|
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
|
||||||
```
|
```
|
||||||
|
|
||||||
This image is automatically generated when a push to the stable branch happens.
|
This image is automatically generated when a push to the stable repo happens.
|
||||||
You will find your target source code in `/src` in the container.
|
You will find your target source code in /src in the container.
|
||||||
|
|
||||||
Note: you can also pull `aflplusplus/aflplusplus:dev` which is the most current
|
|
||||||
development state of AFL++.
|
|
||||||
|
|
||||||
If you want to build AFL++ yourself, you have many options. The easiest choice
|
If you want to build AFL++ yourself, you have many options. The easiest choice
|
||||||
is to build and install everything:
|
is to build and install everything:
|
||||||
|
|
||||||
NOTE: depending on your Debian/Ubuntu/Kali/... release, replace `-14` with
|
|
||||||
whatever llvm version is available. We recommend llvm 13, 14, 15 or 16.
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y build-essential python3-dev automake cmake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools cargo libgtk-3-dev
|
sudo apt-get install -y build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools
|
||||||
# try to install llvm 14 and install the distro default if that fails
|
# try to install llvm 11 and install the distro default if that fails
|
||||||
sudo apt-get install -y lld-14 llvm-14 llvm-14-dev clang-14 || sudo apt-get install -y lld llvm llvm-dev clang
|
sudo apt-get install -y lld-11 llvm-11 llvm-11-dev clang-11 || sudo apt-get install -y lld llvm llvm-dev clang
|
||||||
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/\..*//'|sed 's/.* //')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/\..*//'|sed 's/.* //')-dev
|
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-dev
|
||||||
sudo apt-get install -y ninja-build # for QEMU mode
|
sudo apt-get install -y ninja-build # for QEMU mode
|
||||||
git clone https://github.com/AFLplusplus/AFLplusplus
|
git clone https://github.com/AFLplusplus/AFLplusplus
|
||||||
cd AFLplusplus
|
cd AFLplusplus
|
||||||
@ -39,10 +33,10 @@ sudo make install
|
|||||||
It is recommended to install the newest available gcc, clang and llvm-dev
|
It is recommended to install the newest available gcc, clang and llvm-dev
|
||||||
possible in your distribution!
|
possible in your distribution!
|
||||||
|
|
||||||
Note that `make distrib` also builds FRIDA mode, QEMU mode, unicorn_mode, and
|
Note that "make distrib" also builds instrumentation, QEMU mode, unicorn_mode
|
||||||
more. If you just want plain AFL++, then do `make all`. If you want some
|
and more. If you just want plain AFL++, then do "make all". However, compiling
|
||||||
assisting tooling compiled but are not interested in binary-only targets, then
|
and using at least instrumentation is highly recommended for much better results
|
||||||
instead choose:
|
- hence in this case choose:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
make source-only
|
make source-only
|
||||||
@ -50,12 +44,11 @@ make source-only
|
|||||||
|
|
||||||
These build targets exist:
|
These build targets exist:
|
||||||
|
|
||||||
* all: the main AFL++ binaries and llvm/gcc instrumentation
|
* all: just the main AFL++ binaries
|
||||||
* binary-only: everything for binary-only fuzzing: frida_mode, nyx_mode,
|
* binary-only: everything for binary-only fuzzing: qemu_mode, unicorn_mode,
|
||||||
qemu_mode, frida_mode, unicorn_mode, coresight_mode, libdislocator,
|
libdislocator, libtokencap
|
||||||
libtokencap
|
* source-only: everything for source code fuzzing: instrumentation,
|
||||||
* source-only: everything for source code fuzzing: nyx_mode, libdislocator,
|
libdislocator, libtokencap
|
||||||
libtokencap
|
|
||||||
* distrib: everything (for both binary-only and source code fuzzing)
|
* distrib: everything (for both binary-only and source code fuzzing)
|
||||||
* man: creates simple man pages from the help option of the programs
|
* man: creates simple man pages from the help option of the programs
|
||||||
* install: installs everything you have compiled with the build options above
|
* install: installs everything you have compiled with the build options above
|
||||||
@ -78,59 +71,47 @@ make STATIC=1
|
|||||||
These build options exist:
|
These build options exist:
|
||||||
|
|
||||||
* STATIC - compile AFL++ static
|
* STATIC - compile AFL++ static
|
||||||
* CODE_COVERAGE - compile the target for code coverage (see docs/instrumentation/README.llvm.md)
|
* ASAN_BUILD - compiles with memory sanitizer for debug purposes
|
||||||
* ASAN_BUILD - compiles AFL++ with memory sanitizer for debug purposes
|
|
||||||
* UBSAN_BUILD - compiles AFL++ tools with undefined behaviour sanitizer for debug purposes
|
|
||||||
* DEBUG - no optimization, -ggdb3, all warnings and -Werror
|
* DEBUG - no optimization, -ggdb3, all warnings and -Werror
|
||||||
* LLVM_DEBUG - shows llvm deprecation warnings
|
* PROFILING - compile with profiling information (gprof)
|
||||||
* PROFILING - compile afl-fuzz with profiling information
|
|
||||||
* INTROSPECTION - compile afl-fuzz with mutation introspection
|
* INTROSPECTION - compile afl-fuzz with mutation introspection
|
||||||
* NO_PYTHON - disable python support
|
* NO_PYTHON - disable python support
|
||||||
* NO_SPLICING - disables splicing mutation in afl-fuzz, not recommended for normal fuzzing
|
* NO_SPLICING - disables splicing mutation in afl-fuzz, not recommended for
|
||||||
* NO_UTF - do not use UTF-8 for line rendering in status screen (fallback to G1 box drawing, of vanilla AFL)
|
normal fuzzing
|
||||||
* NO_NYX - disable building nyx mode dependencies
|
|
||||||
* NO_CORESIGHT - disable building coresight (arm64 only)
|
|
||||||
* NO_UNICORN_ARM64 - disable building unicorn on arm64
|
|
||||||
* AFL_NO_X86 - if compiling on non-intel/amd platforms
|
* AFL_NO_X86 - if compiling on non-intel/amd platforms
|
||||||
* LLVM_CONFIG - if your distro doesn't use the standard name for llvm-config (e.g., Debian)
|
* LLVM_CONFIG - if your distro doesn't use the standard name for llvm-config
|
||||||
|
(e.g., Debian)
|
||||||
|
|
||||||
e.g.: `make LLVM_CONFIG=llvm-config-14`
|
e.g.: `make ASAN_BUILD=1`
|
||||||
|
|
||||||
## MacOS X on x86 and arm64 (M1)
|
## MacOS X on x86 and arm64 (M1)
|
||||||
|
|
||||||
MacOS has some gotchas due to the idiosyncrasies of the platform.
|
MacOS X should work, but there are some gotchas due to the idiosyncrasies of the
|
||||||
|
platform. On top of this, we have limited release testing capabilities and
|
||||||
|
depend mostly on user feedback.
|
||||||
|
|
||||||
To build AFL, install llvm (and perhaps gcc) from brew and follow the general
|
To build AFL, install llvm (and perhaps gcc) from brew and follow the general
|
||||||
instructions for Linux. If possible, avoid Xcode at all cost.
|
instructions for Linux. If possible, avoid Xcode at all cost.
|
||||||
|
|
||||||
```shell
|
`brew install wget git make cmake llvm gdb`
|
||||||
brew install wget git make cmake llvm gdb coreutils
|
|
||||||
```
|
|
||||||
|
|
||||||
Be sure to setup `PATH` to point to the correct clang binaries and use the
|
Be sure to setup `PATH` to point to the correct clang binaries and use the
|
||||||
freshly installed clang, clang++, llvm-config, gmake and coreutils, e.g.:
|
freshly installed clang, clang++ and gmake, e.g.:
|
||||||
|
|
||||||
```shell
|
```
|
||||||
# Depending on your MacOS system + brew version it is either
|
export PATH="/usr/local/Cellar/llvm/12.0.1/bin/:$PATH"
|
||||||
export PATH="/opt/homebrew/opt/llvm/bin:$PATH"
|
|
||||||
# or
|
|
||||||
export PATH="/usr/local/opt/llvm/bin:/usr/local/opt/coreutils/libexec/gnubin:$PATH"
|
|
||||||
# you can check with "brew info llvm"
|
|
||||||
|
|
||||||
export PATH="/usr/local/bin:$PATH"
|
|
||||||
export CC=clang
|
export CC=clang
|
||||||
export CXX=clang++
|
export CXX=clang++
|
||||||
gmake
|
gmake
|
||||||
cd frida_mode
|
cd frida_mode
|
||||||
gmake
|
gmake
|
||||||
cd ..
|
cd ..
|
||||||
sudo gmake install
|
gmake install
|
||||||
```
|
```
|
||||||
|
|
||||||
`afl-gcc` will fail unless you have GCC installed, but that is using outdated
|
`afl-gcc` will fail unless you have GCC installed, but that is using outdated
|
||||||
instrumentation anyway. `afl-clang` might fail too depending on your PATH setup.
|
instrumentation anyway. You don't want that. Note that `afl-clang-lto`,
|
||||||
But you don't want neither, you want `afl-clang-fast` anyway :) Note that
|
`afl-gcc-fast` and `qemu_mode` are not working on MacOS.
|
||||||
`afl-clang-lto`, `afl-gcc-fast` and `qemu_mode` are not working on MacOS.
|
|
||||||
|
|
||||||
The crash reporting daemon that comes by default with MacOS X will cause
|
The crash reporting daemon that comes by default with MacOS X will cause
|
||||||
problems with fuzzing. You need to turn it off:
|
problems with fuzzing. You need to turn it off:
|
||||||
@ -151,8 +132,8 @@ and definitely don't look POSIX-compliant. This means two things:
|
|||||||
environment before starting afl-fuzz.
|
environment before starting afl-fuzz.
|
||||||
|
|
||||||
User emulation mode of QEMU does not appear to be supported on MacOS X, so
|
User emulation mode of QEMU does not appear to be supported on MacOS X, so
|
||||||
black-box instrumentation mode (`-Q`) will not work. However, FRIDA mode (`-O`)
|
black-box instrumentation mode (`-Q`) will not work. However, Frida mode (`-O`)
|
||||||
works on both x86 and arm64 MacOS boxes.
|
should work on x86 and arm64 MacOS boxes.
|
||||||
|
|
||||||
MacOS X supports SYSV shared memory used by AFL's instrumentation, but the
|
MacOS X supports SYSV shared memory used by AFL's instrumentation, but the
|
||||||
default settings aren't usable with AFL++. The default settings on 10.14 seem to
|
default settings aren't usable with AFL++. The default settings on 10.14 seem to
|
||||||
@ -188,4 +169,4 @@ sysctl kern.sysv.shmall=98304
|
|||||||
|
|
||||||
See
|
See
|
||||||
[http://www.spy-hill.com/help/apple/SharedMemory.html](http://www.spy-hill.com/help/apple/SharedMemory.html)
|
[http://www.spy-hill.com/help/apple/SharedMemory.html](http://www.spy-hill.com/help/apple/SharedMemory.html)
|
||||||
for documentation for these settings and how to make them permanent.
|
for documentation for these settings and how to make them permanent.
|
@ -1,65 +0,0 @@
|
|||||||
# AFL++ documentation
|
|
||||||
|
|
||||||
This is the overview of the AFL++ docs content.
|
|
||||||
|
|
||||||
For general information on AFL++, see the
|
|
||||||
[README.md of the repository](../README.md).
|
|
||||||
|
|
||||||
Also take a look at our [FAQ.md](FAQ.md) and
|
|
||||||
[best_practices.md](best_practices.md).
|
|
||||||
|
|
||||||
## Fuzzing targets with the source code available
|
|
||||||
|
|
||||||
You can find a quickstart for fuzzing targets with the source code available in
|
|
||||||
the [README.md of the repository](../README.md#quick-start-fuzzing-with-afl).
|
|
||||||
|
|
||||||
For in-depth information on the steps of the fuzzing process, see
|
|
||||||
[fuzzing_in_depth.md](fuzzing_in_depth.md) or click on the following
|
|
||||||
image and select a step.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
For further information on instrumentation, see the
|
|
||||||
[READMEs in the instrumentation/ folder](../instrumentation/).
|
|
||||||
|
|
||||||
### Instrumenting the target
|
|
||||||
|
|
||||||
For more information, click on the following image and select a step.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Preparing the fuzzing campaign
|
|
||||||
|
|
||||||
For more information, click on the following image and select a step.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Fuzzing the target
|
|
||||||
|
|
||||||
For more information, click on the following image and select a step.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Managing the fuzzing campaign
|
|
||||||
|
|
||||||
For more information, click on the following image and select a step.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Fuzzing other targets
|
|
||||||
|
|
||||||
To learn about fuzzing other targets, see:
|
|
||||||
|
|
||||||
* Binary-only: [fuzzing_binary-only_targets.md](fuzzing_binary-only_targets.md)
|
|
||||||
* GUI programs:
|
|
||||||
[best_practices.md#fuzzing-a-gui-program](best_practices.md#fuzzing-a-gui-program)
|
|
||||||
* Libraries: [frida_mode/README.md](../frida_mode/README.md)
|
|
||||||
* Network services:
|
|
||||||
[best_practices.md#fuzzing-a-network-service](best_practices.md#fuzzing-a-network-service)
|
|
||||||
* Non-linux: [unicorn_mode/README.md](../unicorn_mode/README.md)
|
|
||||||
|
|
||||||
## Additional information
|
|
||||||
|
|
||||||
* Tools that help fuzzing with AFL++:
|
|
||||||
[third_party_tools.md](third_party_tools.md)
|
|
||||||
* Tutorials: [tutorials.md](tutorials.md)
|
|
@ -5,10 +5,6 @@ instrumentation-guided genetic algorithm. It uses a modified form of edge
|
|||||||
coverage to effortlessly pick up subtle, local-scale changes to program control
|
coverage to effortlessly pick up subtle, local-scale changes to program control
|
||||||
flow.
|
flow.
|
||||||
|
|
||||||
Note: If you are interested in a more current up-to-date deep dive how AFL++
|
|
||||||
works then we commend this blog post:
|
|
||||||
[https://blog.ritsec.club/posts/afl-under-hood/](https://blog.ritsec.club/posts/afl-under-hood/)
|
|
||||||
|
|
||||||
Simplifying a bit, the overall algorithm can be summed up as:
|
Simplifying a bit, the overall algorithm can be summed up as:
|
||||||
|
|
||||||
1) Load user-supplied initial test cases into the queue.
|
1) Load user-supplied initial test cases into the queue.
|
||||||
@ -44,7 +40,7 @@ superior to blind fuzzing or coverage-only tools.
|
|||||||
This section provides an overview of the status screen - plus tips for
|
This section provides an overview of the status screen - plus tips for
|
||||||
troubleshooting any warnings and red text shown in the UI.
|
troubleshooting any warnings and red text shown in the UI.
|
||||||
|
|
||||||
For the general instruction manual, see [README.md](README.md).
|
For the general instruction manual, see [README.md](../README.md).
|
||||||
|
|
||||||
### A note about colors
|
### A note about colors
|
||||||
|
|
||||||
@ -423,8 +419,8 @@ the process. Be sure to consult this file especially if any UI elements are
|
|||||||
highlighted in red.
|
highlighted in red.
|
||||||
|
|
||||||
The fuzzing process will continue until you press Ctrl-C. At a minimum, you want
|
The fuzzing process will continue until you press Ctrl-C. At a minimum, you want
|
||||||
to allow the fuzzer to at least one queue cycle without any new finds, which may
|
to allow the fuzzer to complete one queue cycle, which may take anywhere from a
|
||||||
take anywhere from a couple of hours to a week or so.
|
couple of hours to a week or so.
|
||||||
|
|
||||||
There are three subdirectories created within the output directory and updated
|
There are three subdirectories created within the output directory and updated
|
||||||
in real-time:
|
in real-time:
|
||||||
@ -487,7 +483,6 @@ directory. This includes:
|
|||||||
- `fuzzer_pid` - PID of the fuzzer process
|
- `fuzzer_pid` - PID of the fuzzer process
|
||||||
- `cycles_done` - queue cycles completed so far
|
- `cycles_done` - queue cycles completed so far
|
||||||
- `cycles_wo_finds` - number of cycles without any new paths found
|
- `cycles_wo_finds` - number of cycles without any new paths found
|
||||||
- `time_wo_finds` - longest time in seconds no new path was found
|
|
||||||
- `execs_done` - number of execve() calls attempted
|
- `execs_done` - number of execve() calls attempted
|
||||||
- `execs_per_sec` - overall number of execs per second
|
- `execs_per_sec` - overall number of execs per second
|
||||||
- `corpus_count` - total number of entries in the queue
|
- `corpus_count` - total number of entries in the queue
|
||||||
|
@ -116,7 +116,7 @@ allows you to define network state with different type of data packets.
|
|||||||
|
|
||||||
### Improving stability
|
### Improving stability
|
||||||
|
|
||||||
For fuzzing, a 100% stable target that covers all edges is the best case. A 90%
|
For fuzzing a 100% stable target that covers all edges is the best case. A 90%
|
||||||
stable target that covers all edges is, however, better than a 100% stable
|
stable target that covers all edges is, however, better than a 100% stable
|
||||||
target that ignores 10% of the edges.
|
target that ignores 10% of the edges.
|
||||||
|
|
||||||
@ -131,11 +131,6 @@ jitter, or is a hash map function etc., then it should not be instrumented.
|
|||||||
To be able to exclude these functions (based on AFL++'s measured stability), the
|
To be able to exclude these functions (based on AFL++'s measured stability), the
|
||||||
following process will allow to identify functions with variable edges.
|
following process will allow to identify functions with variable edges.
|
||||||
|
|
||||||
Note that this is only useful for non-persistent targets!
|
|
||||||
If a persistent target is unstable whereas when run non-persistent is fine,
|
|
||||||
then this means that the target is keeping internal state, which is bad for
|
|
||||||
fuzzing. Fuzz such targets **without** persistent mode.
|
|
||||||
|
|
||||||
Four steps are required to do this and it also requires quite some knowledge of
|
Four steps are required to do this and it also requires quite some knowledge of
|
||||||
coding and/or disassembly and is effectively possible only with `afl-clang-fast`
|
coding and/or disassembly and is effectively possible only with `afl-clang-fast`
|
||||||
`PCGUARD` and `afl-clang-lto` `LTO` instrumentation.
|
`PCGUARD` and `afl-clang-lto` `LTO` instrumentation.
|
||||||
@ -194,4 +189,4 @@ coding and/or disassembly and is effectively possible only with `afl-clang-fast`
|
|||||||
Recompile, fuzz it, be happy :)
|
Recompile, fuzz it, be happy :)
|
||||||
|
|
||||||
This link explains this process for
|
This link explains this process for
|
||||||
[Fuzzbench](https://github.com/google/fuzzbench/issues/677).
|
[Fuzzbench](https://github.com/google/fuzzbench/issues/677).
|
@ -38,17 +38,11 @@ performed with the custom mutator.
|
|||||||
|
|
||||||
## 2) APIs
|
## 2) APIs
|
||||||
|
|
||||||
**IMPORTANT NOTE**: If you use our C/C++ API and you want to increase the size
|
|
||||||
of an **out_buf buffer, you have to use `afl_realloc()` for this, so include
|
|
||||||
`include/alloc-inl.h` - otherwise afl-fuzz will crash when trying to free
|
|
||||||
your buffers.
|
|
||||||
|
|
||||||
C/C++:
|
C/C++:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
void *afl_custom_init(afl_state_t *afl, unsigned int seed);
|
void *afl_custom_init(afl_state_t *afl, unsigned int seed);
|
||||||
unsigned int afl_custom_fuzz_count(void *data, const unsigned char *buf, size_t buf_size);
|
unsigned int afl_custom_fuzz_count(void *data, const unsigned char *buf, size_t buf_size);
|
||||||
void afl_custom_splice_optout(void *data);
|
|
||||||
size_t afl_custom_fuzz(void *data, unsigned char *buf, size_t buf_size, unsigned char **out_buf, unsigned char *add_buf, size_t add_buf_size, size_t max_size);
|
size_t afl_custom_fuzz(void *data, unsigned char *buf, size_t buf_size, unsigned char **out_buf, unsigned char *add_buf, size_t add_buf_size, size_t max_size);
|
||||||
const char *afl_custom_describe(void *data, size_t max_description_len);
|
const char *afl_custom_describe(void *data, size_t max_description_len);
|
||||||
size_t afl_custom_post_process(void *data, unsigned char *buf, size_t buf_size, unsigned char **out_buf);
|
size_t afl_custom_post_process(void *data, unsigned char *buf, size_t buf_size, unsigned char **out_buf);
|
||||||
@ -58,7 +52,6 @@ int afl_custom_post_trim(void *data, unsigned char success);
|
|||||||
size_t afl_custom_havoc_mutation(void *data, unsigned char *buf, size_t buf_size, unsigned char **out_buf, size_t max_size);
|
size_t afl_custom_havoc_mutation(void *data, unsigned char *buf, size_t buf_size, unsigned char **out_buf, size_t max_size);
|
||||||
unsigned char afl_custom_havoc_mutation_probability(void *data);
|
unsigned char afl_custom_havoc_mutation_probability(void *data);
|
||||||
unsigned char afl_custom_queue_get(void *data, const unsigned char *filename);
|
unsigned char afl_custom_queue_get(void *data, const unsigned char *filename);
|
||||||
void (*afl_custom_fuzz_send)(void *data, const u8 *buf, size_t buf_size);
|
|
||||||
u8 afl_custom_queue_new_entry(void *data, const unsigned char *filename_new_queue, const unsigned int *filename_orig_queue);
|
u8 afl_custom_queue_new_entry(void *data, const unsigned char *filename_new_queue, const unsigned int *filename_orig_queue);
|
||||||
const char* afl_custom_introspection(my_mutator_t *data);
|
const char* afl_custom_introspection(my_mutator_t *data);
|
||||||
void afl_custom_deinit(void *data);
|
void afl_custom_deinit(void *data);
|
||||||
@ -70,12 +63,9 @@ Python:
|
|||||||
def init(seed):
|
def init(seed):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def fuzz_count(buf):
|
def fuzz_count(buf, add_buf, max_size):
|
||||||
return cnt
|
return cnt
|
||||||
|
|
||||||
def splice_optout():
|
|
||||||
pass
|
|
||||||
|
|
||||||
def fuzz(buf, add_buf, max_size):
|
def fuzz(buf, add_buf, max_size):
|
||||||
return mutated_out
|
return mutated_out
|
||||||
|
|
||||||
@ -103,9 +93,6 @@ def havoc_mutation_probability():
|
|||||||
def queue_get(filename):
|
def queue_get(filename):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def fuzz_send(buf):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def queue_new_entry(filename_new_queue, filename_orig_queue):
|
def queue_new_entry(filename_new_queue, filename_orig_queue):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -118,16 +105,15 @@ def deinit(): # optional for Python
|
|||||||
|
|
||||||
### Custom Mutation
|
### Custom Mutation
|
||||||
|
|
||||||
- `init` (optional in Python):
|
- `init`:
|
||||||
|
|
||||||
This method is called when AFL++ starts up and is used to seed RNG and set
|
This method is called when AFL++ starts up and is used to seed RNG and set
|
||||||
up buffers and state.
|
up buffers and state.
|
||||||
|
|
||||||
- `queue_get` (optional):
|
- `queue_get` (optional):
|
||||||
|
|
||||||
This method determines whether AFL++ should fuzz the current
|
This method determines whether the custom fuzzer should fuzz the current
|
||||||
queue entry or not: all defined custom mutators as well as
|
queue entry or not
|
||||||
all AFL++'s mutators.
|
|
||||||
|
|
||||||
- `fuzz_count` (optional):
|
- `fuzz_count` (optional):
|
||||||
|
|
||||||
@ -137,24 +123,13 @@ def deinit(): # optional for Python
|
|||||||
for a specific queue entry, use this function. This function is most useful
|
for a specific queue entry, use this function. This function is most useful
|
||||||
if `AFL_CUSTOM_MUTATOR_ONLY` is **not** used.
|
if `AFL_CUSTOM_MUTATOR_ONLY` is **not** used.
|
||||||
|
|
||||||
- `splice_optout` (optional):
|
|
||||||
|
|
||||||
If this function is present, no splicing target is passed to the `fuzz`
|
|
||||||
function. This saves time if splicing data is not needed by the custom
|
|
||||||
fuzzing function.
|
|
||||||
This function is never called, just needs to be present to activate.
|
|
||||||
|
|
||||||
- `fuzz` (optional):
|
- `fuzz` (optional):
|
||||||
|
|
||||||
This method performs your custom mutations on a given input.
|
This method performs custom mutations on a given input. It also accepts an
|
||||||
The add_buf is the contents of another queue item that can be used for
|
additional test case. Note that this function is optional - but it makes
|
||||||
splicing - or anything else - and can also be ignored. If you are not
|
sense to use it. You would only skip this if `post_process` is used to fix
|
||||||
using this additional data then define `splice_optout` (see above).
|
checksums etc. so if you are using it, e.g., as a post processing library.
|
||||||
This function is optional.
|
Note that a length > 0 *must* be returned!
|
||||||
Returing a length of 0 is valid and is interpreted as skipping this
|
|
||||||
one mutation result.
|
|
||||||
For non-Python: the returned output buffer is under **your** memory
|
|
||||||
management!
|
|
||||||
|
|
||||||
- `describe` (optional):
|
- `describe` (optional):
|
||||||
|
|
||||||
@ -184,22 +159,6 @@ def deinit(): # optional for Python
|
|||||||
This can return any python object that implements the buffer protocol and
|
This can return any python object that implements the buffer protocol and
|
||||||
supports PyBUF_SIMPLE. These include bytes, bytearray, etc.
|
supports PyBUF_SIMPLE. These include bytes, bytearray, etc.
|
||||||
|
|
||||||
You can decide in the post_process mutator to not send the mutated data
|
|
||||||
to the target, e.g. if it is too short, too corrupted, etc. If so,
|
|
||||||
return a NULL buffer and zero length (or a 0 length string in Python).
|
|
||||||
|
|
||||||
NOTE: Do not make any random changes to the data in this function!
|
|
||||||
|
|
||||||
PERFORMANCE for C/C++: If possible make the changes in-place (so modify
|
|
||||||
the `*data` directly, and return it as `*outbuf = data`.
|
|
||||||
|
|
||||||
- `fuzz_send` (optional):
|
|
||||||
|
|
||||||
This method can be used if you want to send data to the target yourself,
|
|
||||||
e.g. via IPC. This replaces some usage of utils/afl_proxy but requires
|
|
||||||
that you start the target with afl-fuzz.
|
|
||||||
Example: [custom_mutators/examples/custom_send.c](../custom_mutators/examples/custom_send.c)
|
|
||||||
|
|
||||||
- `queue_new_entry` (optional):
|
- `queue_new_entry` (optional):
|
||||||
|
|
||||||
This methods is called after adding a new test case to the queue. If the
|
This methods is called after adding a new test case to the queue. If the
|
||||||
@ -211,7 +170,7 @@ def deinit(): # optional for Python
|
|||||||
discovered if compiled with INTROSPECTION. The custom mutator can then
|
discovered if compiled with INTROSPECTION. The custom mutator can then
|
||||||
return a string (const char *) that reports the exact mutations used.
|
return a string (const char *) that reports the exact mutations used.
|
||||||
|
|
||||||
- `deinit` (optional in Python):
|
- `deinit`:
|
||||||
|
|
||||||
The last method to be called, deinitializing the state.
|
The last method to be called, deinitializing the state.
|
||||||
|
|
||||||
@ -301,41 +260,13 @@ sudo apt install python-dev
|
|||||||
```
|
```
|
||||||
|
|
||||||
Then, AFL++ can be compiled with Python support. The AFL++ Makefile detects
|
Then, AFL++ can be compiled with Python support. The AFL++ Makefile detects
|
||||||
Python3 through `python-config`/`python3-config` if it is in the PATH and
|
Python 2 and 3 through `python-config` if it is in the PATH and compiles
|
||||||
compiles `afl-fuzz` with the feature if available.
|
`afl-fuzz` with the feature if available.
|
||||||
|
|
||||||
Note: for some distributions, you might also need the package `python[3]-apt`.
|
Note: for some distributions, you might also need the package `python[23]-apt`.
|
||||||
In case your setup is different, set the necessary variables like this:
|
In case your setup is different, set the necessary variables like this:
|
||||||
`PYTHON_INCLUDE=/path/to/python/include LDFLAGS=-L/path/to/python/lib make`.
|
`PYTHON_INCLUDE=/path/to/python/include LDFLAGS=-L/path/to/python/lib make`.
|
||||||
|
|
||||||
### Helpers
|
|
||||||
|
|
||||||
For C/C++ custom mutators you get a pointer to `afl_state_t *afl` in the
|
|
||||||
`afl_custom_init()` which contains all information that you need.
|
|
||||||
Note that if you access it, you need to recompile your custom mutator if
|
|
||||||
you update AFL++ because the structure might have changed!
|
|
||||||
|
|
||||||
For mutators written in Python, Rust, GO, etc. there are a few environment
|
|
||||||
variables set to help you to get started:
|
|
||||||
|
|
||||||
`AFL_CUSTOM_INFO_PROGRAM` - the program name of the target that is executed.
|
|
||||||
If your custom mutator is used with modes like Qemu (`-Q`), this will still
|
|
||||||
contain the target program, not afl-qemu-trace.
|
|
||||||
|
|
||||||
`AFL_CUSTOM_INFO_PROGRAM_INPUT` - if the `-f` parameter is used with afl-fuzz
|
|
||||||
then this value is found in this environment variable.
|
|
||||||
|
|
||||||
`AFL_CUSTOM_INFO_PROGRAM_ARGV` - this contains the parameters given to the
|
|
||||||
target program and still has the `@@` identifier in there.
|
|
||||||
|
|
||||||
Note: If `AFL_CUSTOM_INFO_PROGRAM_INPUT` is empty and `AFL_CUSTOM_INFO_PROGRAM_ARGV`
|
|
||||||
is either empty or does not contain `@@` then the target gets the input via
|
|
||||||
`stdin`.
|
|
||||||
|
|
||||||
`AFL_CUSTOM_INFO_OUT` - This is the output directory for this fuzzer instance,
|
|
||||||
so if `afl-fuzz` was called with `-o out -S foobar`, then this will be set to
|
|
||||||
`out/foobar`.
|
|
||||||
|
|
||||||
### Custom Mutator Preparation
|
### Custom Mutator Preparation
|
||||||
|
|
||||||
For C/C++ mutators, the source code must be compiled as a shared object:
|
For C/C++ mutators, the source code must be compiled as a shared object:
|
||||||
@ -377,4 +308,4 @@ See [example.c](../custom_mutators/examples/example.c) and
|
|||||||
- [bruce30262/libprotobuf-mutator_fuzzing_learning](https://github.com/bruce30262/libprotobuf-mutator_fuzzing_learning/tree/master/4_libprotobuf_aflpp_custom_mutator)
|
- [bruce30262/libprotobuf-mutator_fuzzing_learning](https://github.com/bruce30262/libprotobuf-mutator_fuzzing_learning/tree/master/4_libprotobuf_aflpp_custom_mutator)
|
||||||
- [thebabush/afl-libprotobuf-mutator](https://github.com/thebabush/afl-libprotobuf-mutator)
|
- [thebabush/afl-libprotobuf-mutator](https://github.com/thebabush/afl-libprotobuf-mutator)
|
||||||
- [XML Fuzzing@NullCon 2017](https://www.agarri.fr/docs/XML_Fuzzing-NullCon2017-PUBLIC.pdf)
|
- [XML Fuzzing@NullCon 2017](https://www.agarri.fr/docs/XML_Fuzzing-NullCon2017-PUBLIC.pdf)
|
||||||
- [A bug detected by AFL + XML-aware mutators](https://bugs.chromium.org/p/chromium/issues/detail?id=930663)
|
- [A bug detected by AFL + XML-aware mutators](https://bugs.chromium.org/p/chromium/issues/detail?id=930663)
|
122
docs/docs.md
Normal file
122
docs/docs.md
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
# Restructure AFL++'s documentation
|
||||||
|
|
||||||
|
## About us
|
||||||
|
|
||||||
|
We are dedicated to everything around fuzzing, our main and most well known
|
||||||
|
contribution is the fuzzer `AFL++` which is part of all major Unix
|
||||||
|
distributions (e.g. Debian, Arch, FreeBSD, etc.) and is deployed on Google's
|
||||||
|
oss-fuzz and clusterfuzz. It is rated the top fuzzer on Google's fuzzbench.
|
||||||
|
|
||||||
|
We are four individuals from Europe supported by a large community.
|
||||||
|
|
||||||
|
All our tools are open source.
|
||||||
|
|
||||||
|
## About the AFL++ fuzzer project
|
||||||
|
|
||||||
|
AFL++ inherited it's documentation from the original Google AFL project.
|
||||||
|
Since then it has been massively improved - feature and performance wise -
|
||||||
|
and although the documenation has likewise been continued it has grown out
|
||||||
|
of proportion.
|
||||||
|
The documentation is done by non-natives to the English language, plus
|
||||||
|
none of us has a writer background.
|
||||||
|
|
||||||
|
We see questions on AFL++ usage on mailing lists (e.g. afl-users), discord
|
||||||
|
channels, web forums and as issues in our repository.
|
||||||
|
|
||||||
|
This only increases as AFL++ has been on the top of Google's fuzzbench
|
||||||
|
statistics (which measures the performance of fuzzers) and is now being
|
||||||
|
integrated in Google's oss-fuzz and clusterfuzz - and is in many Unix
|
||||||
|
packaging repositories, e.g. Debian, FreeBSD, etc.
|
||||||
|
|
||||||
|
AFL++ now has 44 (!) documentation files with 13k total lines of content.
|
||||||
|
This is way too much.
|
||||||
|
|
||||||
|
Hence AFL++ needs a complete overhaul of it's documentation, both on a
|
||||||
|
organisation/structural level as well as the content.
|
||||||
|
|
||||||
|
Overall the following actions have to be performed:
|
||||||
|
* Create a better structure of documentation so it is easier to find the
|
||||||
|
information that is being looked for, combining and/or splitting up the
|
||||||
|
existing documents as needed.
|
||||||
|
* Rewrite some documentation to remove duplication. Several information is
|
||||||
|
present several times in the documentation. These should be removed to
|
||||||
|
where needed so that we have as little bloat as possible.
|
||||||
|
* The documents have been written and modified by a lot of different people,
|
||||||
|
most of them non-native English speaker. Hence an overall review where
|
||||||
|
parts should be rewritten has to be performed and then the rewrite done.
|
||||||
|
* Create a cheat-sheet for a very short best-setup build and run of AFL++
|
||||||
|
* Pictures explain more than 1000 words. We need at least 4 images that
|
||||||
|
explain the workflow with AFL++:
|
||||||
|
- the build workflow
|
||||||
|
- the fuzzing workflow
|
||||||
|
- the fuzzing campaign management workflow
|
||||||
|
- the overall workflow that is an overview of the above
|
||||||
|
- maybe more? where the technical writes seems it necessary for
|
||||||
|
understanding.
|
||||||
|
|
||||||
|
Requirements:
|
||||||
|
* Documentation has to be in Markdown format
|
||||||
|
* Images have to be either in SVG or PNG format.
|
||||||
|
* All documentation should be (moved) in(to) docs/
|
||||||
|
|
||||||
|
The project does not require writing new documentation or tutorials beside the
|
||||||
|
cheat sheet. The technical information for the cheat sheet will be provided by
|
||||||
|
us.
|
||||||
|
|
||||||
|
## Metrics
|
||||||
|
|
||||||
|
AFL++ is a the highest performant fuzzer publicly available - but is also the
|
||||||
|
most feature rich and complex. With the publicity of AFL++' success and
|
||||||
|
deployment in Google projects internally and externally and availability as
|
||||||
|
a package on most Linux distributions we see more and more issues being
|
||||||
|
created and help requests on our Discord channel that would not be
|
||||||
|
necessary if people would have read through all our documentation - which
|
||||||
|
is unrealistic.
|
||||||
|
|
||||||
|
We expect the the new documenation after this project to be cleaner, easier
|
||||||
|
accessible and lighter to digest by our users, resulting in much less
|
||||||
|
help requests. On the other hand the amount of users using AFL++ should
|
||||||
|
increase as well as it will be more accessible which would also increase
|
||||||
|
questions again - but overall resulting in a reduction of help requests.
|
||||||
|
|
||||||
|
In numbers: we currently have per week on average 5 issues on Github,
|
||||||
|
10 questions on discord and 1 on mailing lists that would not be necessary
|
||||||
|
with perfect documentation and perfect people.
|
||||||
|
|
||||||
|
We would consider this project a success if afterwards we only have
|
||||||
|
2 issues on Github and 3 questions on discord anymore that would be answered
|
||||||
|
by reading the documentation. The mailing list is usually used by the most
|
||||||
|
novice users and we don't expect any less questions there.
|
||||||
|
|
||||||
|
## Project Budget
|
||||||
|
|
||||||
|
We have zero experience with technical writers, so this is very hard for us
|
||||||
|
to calculate. We expect it to be a lot of work though because of the amount
|
||||||
|
of documentation we have that needs to be restructured and partially rewritten
|
||||||
|
(44 documents with 13k total lines of content).
|
||||||
|
|
||||||
|
We assume the daily rate of a very good and experienced technical writer in
|
||||||
|
times of a pandemic to be ~500$ (according to web research), and calculate
|
||||||
|
the overall amout of work to be around 20 days for everything incl. the
|
||||||
|
graphics (but again - this is basically just guessing).
|
||||||
|
|
||||||
|
Technical Writer 10000$
|
||||||
|
Volunteer stipends 0$ (waved)
|
||||||
|
T-Shirts for the top 10 contributors and helpers to this documentation project:
|
||||||
|
10 AFL++ logo t-shirts 20$ each 200$
|
||||||
|
10 shipping cost of t-shirts 10$ each 100$
|
||||||
|
|
||||||
|
Total: 10.300$
|
||||||
|
(in the submission form 10.280$ was entered)
|
||||||
|
|
||||||
|
## Additional Information
|
||||||
|
|
||||||
|
We have participated in Google Summer of Code in 2020 and hope to be selected
|
||||||
|
again in 2021.
|
||||||
|
|
||||||
|
We have no experience with a technical writer, but we will support that person
|
||||||
|
with video calls, chats, emails and messaging, provide all necessary information
|
||||||
|
and write technical contents that is required for the success of this project.
|
||||||
|
It is clear to us that a technical writer knows how to write, but cannot know
|
||||||
|
the technical details in a complex tooling like in AFL++. This guidance, input,
|
||||||
|
etc. has to come from us.
|
124
docs/docs2.md
Normal file
124
docs/docs2.md
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
# Restructure AFL++'s documentation - Case Study
|
||||||
|
|
||||||
|
## Problem statement
|
||||||
|
|
||||||
|
AFL++ inherited it's documentation from the original Google AFL project.
|
||||||
|
Since then it has been massively improved - feature and performance wise -
|
||||||
|
and although the documenation has likewise been continued it has grown out
|
||||||
|
of proportion.
|
||||||
|
The documentation is done by non-natives to the English language, plus
|
||||||
|
none of us has a writer background.
|
||||||
|
|
||||||
|
We see questions on AFL++ usage on mailing lists (e.g. afl-users), discord
|
||||||
|
channels, web forums and as issues in our repository.
|
||||||
|
Most of them could be answered if people would read through all the
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
This only increases as AFL++ has been on the top of Google's fuzzbench
|
||||||
|
statistics (which measures the performance of fuzzers) and has been
|
||||||
|
integrated in Google's oss-fuzz and clusterfuzz - and is in many Unix
|
||||||
|
packaging repositories, e.g. Debian, FreeBSD, etc.
|
||||||
|
|
||||||
|
AFL++ had 44 (!) documentation files with 13k total lines of content.
|
||||||
|
This was way too much.
|
||||||
|
|
||||||
|
## Proposal abstract
|
||||||
|
|
||||||
|
AFL++'s documentatin needs a complete overhaul, both on a
|
||||||
|
organisation/structural level as well as the content.
|
||||||
|
|
||||||
|
Overall the following actions have to be performed:
|
||||||
|
* Create a better structure of documentation so it is easier to find the
|
||||||
|
information that is being looked for, combining and/or splitting up the
|
||||||
|
existing documents as needed.
|
||||||
|
* Rewrite some documentation to remove duplication. Several information is
|
||||||
|
present several times in the documentation. These should be removed to
|
||||||
|
where needed so that we have as little bloat as possible.
|
||||||
|
* The documents have been written and modified by a lot of different people,
|
||||||
|
most of them non-native English speaker. Hence an overall review where
|
||||||
|
parts should be rewritten has to be performed and then the rewrite done.
|
||||||
|
* Create a cheat-sheet for a very short best-setup build and run of AFL++
|
||||||
|
* Pictures explain more than 1000 words. We need at least 4 images that
|
||||||
|
explain the workflow with AFL++:
|
||||||
|
- the build workflow
|
||||||
|
- the fuzzing workflow
|
||||||
|
- the fuzzing campaign management workflow
|
||||||
|
- the overall workflow that is an overview of the above
|
||||||
|
- maybe more? where the technical writes seems it necessary for
|
||||||
|
understanding.
|
||||||
|
|
||||||
|
Requirements:
|
||||||
|
* Documentation has to be in Markdown format
|
||||||
|
* Images have to be either in SVG or PNG format.
|
||||||
|
* All documentation should be (moved) in(to) docs/
|
||||||
|
|
||||||
|
## Project description
|
||||||
|
|
||||||
|
We created our proposal by discussing in the team what the issues are and
|
||||||
|
what was needed to fix it.
|
||||||
|
This resulted in the [project proposal](https://github.com/AFLplusplus/AFLplusplus/blob/stable/docs/docs.md).
|
||||||
|
|
||||||
|
We did not want to be selected by a writer but select a writer ourselves, so
|
||||||
|
we combed through the list and reviewed every single one of them.
|
||||||
|
We were not looking for coders writing technical documentation, but rather
|
||||||
|
someone who is an experienced writer and has documented experience with
|
||||||
|
structuring documentation.
|
||||||
|
Few fit that profile and we sent out messages to 6 people.
|
||||||
|
We finally decided on Jana because she had a strong background in technical
|
||||||
|
documentation and structuring information.
|
||||||
|
She had no technical experience in fuzzing whatsoever, but we saw that as
|
||||||
|
a plus - of course this made the whole process longer to explain details,
|
||||||
|
but overall ensured that the documentation can be read by (mostly) everyone.
|
||||||
|
|
||||||
|
We communicated via video calls every few weeks and she kept a public kanban
|
||||||
|
board about her todos, additional we used a Signal channel.
|
||||||
|
Her changes were imported via PRs where we discussed details.
|
||||||
|
|
||||||
|
The project was off to a good start, but then Jana got pregnant with serious
|
||||||
|
side effects that made working impossible for her for a longer time, hence
|
||||||
|
the schedule was thrown back.
|
||||||
|
She offered to rescind the payment and we select a new writer, but we saw
|
||||||
|
little opportunity in that, as that would mean a new selection of a writer,
|
||||||
|
someone else with a different vision on how the result should look like so
|
||||||
|
basically a full restart of the project and a large impact on our own time.
|
||||||
|
So we agreed on - after discussion with the Google GSoD team - that she
|
||||||
|
continues the project after the GSoD completion deadline as best as she can.
|
||||||
|
|
||||||
|
End of November she took one week off from work and fully dedicated her time
|
||||||
|
for the documenation which brought the project a big step forward.
|
||||||
|
|
||||||
|
Originally the project should have been ended begin of October, but now - at
|
||||||
|
nearing the end of November, we are at about 85% completion, with the end
|
||||||
|
being expected around mid of December.
|
||||||
|
|
||||||
|
## Metrics
|
||||||
|
|
||||||
|
We merged most of the changes in our development branch and are getting
|
||||||
|
close to a state where the user documentation part is completed and we
|
||||||
|
can create a new release. Only then the new documentatin is actually visible
|
||||||
|
to users. Therefore no metrics could be collected so far.
|
||||||
|
|
||||||
|
We plan on a user-assisted QA review end of November/begin of December.
|
||||||
|
|
||||||
|
The documentation was reviewed by a few test users so far however who gave
|
||||||
|
it a thumbs up.
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
The GSoD project itself is great. It helps to get the documentation back in
|
||||||
|
line.
|
||||||
|
It was and is a larger time investment from our side, but we expected that.
|
||||||
|
When the project is done, the documentation will be more accessible by users
|
||||||
|
and also need less maintenance by us.
|
||||||
|
There is still follow-up work to be done by us afterwards (web site for the
|
||||||
|
docs, etc.).
|
||||||
|
|
||||||
|
Not sure what we would do differently next time. I think we prepared best as
|
||||||
|
possible and reacted best as possible to the unexpected.
|
||||||
|
|
||||||
|
Recommendations for other organizations who would like to participate in GSoD:
|
||||||
|
- expect the process to take a larger part of your time. the writer needs
|
||||||
|
your full support.
|
||||||
|
- have someone dedicated from the dev/org side to support, educate and
|
||||||
|
supervice the writer
|
||||||
|
- set clear goals and expectations
|
@ -105,8 +105,7 @@ fairly broad use of environment variables instead:
|
|||||||
within your program at a certain point (such as at the end of an
|
within your program at a certain point (such as at the end of an
|
||||||
`__AFL_LOOP()`), you can run the macro `__AFL_LEAK_CHECK();` which will
|
`__AFL_LOOP()`), you can run the macro `__AFL_LEAK_CHECK();` which will
|
||||||
cause an abort if any memory is leaked (you can combine this with the
|
cause an abort if any memory is leaked (you can combine this with the
|
||||||
`__AFL_LSAN_OFF();` and `__AFL_LSAN_ON();` macros to avoid checking for
|
`LSAN_OPTIONS=...` suppression option to suppress some known leaks).
|
||||||
memory leaks from memory allocated between these two calls.
|
|
||||||
- `AFL_USE_MSAN=1` - activates the memory sanitizer (uninitialized memory)
|
- `AFL_USE_MSAN=1` - activates the memory sanitizer (uninitialized memory)
|
||||||
- `AFL_USE_TSAN=1` - activates the thread sanitizer to find thread race
|
- `AFL_USE_TSAN=1` - activates the thread sanitizer to find thread race
|
||||||
conditions
|
conditions
|
||||||
@ -129,18 +128,9 @@ subset of the settings discussed in section 1, with the exception of:
|
|||||||
write all constant string comparisons to this file to be used later with
|
write all constant string comparisons to this file to be used later with
|
||||||
afl-fuzz' `-x` option.
|
afl-fuzz' `-x` option.
|
||||||
|
|
||||||
- An option to `AFL_LLVM_DICT2FILE` is `AFL_LLVM_DICT2FILE_NO_MAIN=1` which
|
|
||||||
skill not parse `main()`.
|
|
||||||
|
|
||||||
- `TMPDIR` and `AFL_KEEP_ASSEMBLY`, since no temporary assembly files are
|
- `TMPDIR` and `AFL_KEEP_ASSEMBLY`, since no temporary assembly files are
|
||||||
created.
|
created.
|
||||||
|
|
||||||
- LLVM modes compiling C++ will normally set rpath in the binary if LLVM is
|
|
||||||
not in a usual location (/usr or /lib). Setting `AFL_LLVM_NO_RPATH=1`
|
|
||||||
disables this behaviour in case it isn't desired. For example, the compiling
|
|
||||||
toolchain might be in a custom location, but the target machine has LLVM
|
|
||||||
runtime libs in the search path.
|
|
||||||
|
|
||||||
Then there are a few specific features that are only available in
|
Then there are a few specific features that are only available in
|
||||||
instrumentation mode:
|
instrumentation mode:
|
||||||
|
|
||||||
@ -162,15 +152,13 @@ Available options:
|
|||||||
- LTO - LTO instrumentation
|
- LTO - LTO instrumentation
|
||||||
- NATIVE - clang's original pcguard based instrumentation
|
- NATIVE - clang's original pcguard based instrumentation
|
||||||
- NGRAM-x - deeper previous location coverage (from NGRAM-2 up to NGRAM-16)
|
- NGRAM-x - deeper previous location coverage (from NGRAM-2 up to NGRAM-16)
|
||||||
- PCGUARD - our own pcguard based instrumentation (default)
|
- PCGUARD - our own pcgard based instrumentation (default)
|
||||||
|
|
||||||
#### CMPLOG
|
#### CMPLOG
|
||||||
|
|
||||||
Setting `AFL_LLVM_CMPLOG=1` during compilation will tell afl-clang-fast to
|
Setting `AFL_LLVM_CMPLOG=1` during compilation will tell afl-clang-fast to
|
||||||
produce a CmpLog binary.
|
produce a CmpLog binary.
|
||||||
|
|
||||||
For afl-gcc-fast, set `AFL_GCC_CMPLOG=1` instead.
|
|
||||||
|
|
||||||
For more information, see
|
For more information, see
|
||||||
[instrumentation/README.cmplog.md](../instrumentation/README.cmplog.md).
|
[instrumentation/README.cmplog.md](../instrumentation/README.cmplog.md).
|
||||||
|
|
||||||
@ -196,19 +184,6 @@ in the specified file.
|
|||||||
For more information, see
|
For more information, see
|
||||||
[instrumentation/README.instrument_list.md](../instrumentation/README.instrument_list.md).
|
[instrumentation/README.instrument_list.md](../instrumentation/README.instrument_list.md).
|
||||||
|
|
||||||
#### INJECTIONS
|
|
||||||
|
|
||||||
This feature is able to find simple injection vulnerabilities in insecure
|
|
||||||
calls to mysql/mariadb/nosql/postgresql/ldap and XSS in libxml2.
|
|
||||||
|
|
||||||
- Setting `AFL_LLVM_INJECTIONS_ALL` will enable all injection hooking
|
|
||||||
|
|
||||||
- Setting `AFL_LLVM_INJECTIONS_SQL` will enable SQL injection hooking
|
|
||||||
|
|
||||||
- Setting `AFL_LLVM_INJECTIONS_LDAP` will enable LDAP injection hooking
|
|
||||||
|
|
||||||
- Setting `AFL_LLVM_INJECTIONS_XSS` will enable XSS injection hooking
|
|
||||||
|
|
||||||
#### LAF-INTEL
|
#### LAF-INTEL
|
||||||
|
|
||||||
This great feature will split compares into series of single byte comparisons to
|
This great feature will split compares into series of single byte comparisons to
|
||||||
@ -259,9 +234,7 @@ combined.
|
|||||||
the default `0x10000`. A value of 0 or empty sets the map address to be
|
the default `0x10000`. A value of 0 or empty sets the map address to be
|
||||||
dynamic (the original AFL way, which is slower).
|
dynamic (the original AFL way, which is slower).
|
||||||
- `AFL_LLVM_MAP_DYNAMIC` sets the shared memory address to be dynamic.
|
- `AFL_LLVM_MAP_DYNAMIC` sets the shared memory address to be dynamic.
|
||||||
- `AFL_LLVM_LTO_SKIPINIT` skips adding initialization code. Some global vars
|
|
||||||
(e.g. the highest location ID) are not injected. Needed to instrument with
|
|
||||||
[WAFL](https://github.com/fgsect/WAFL.git).
|
|
||||||
For more information, see
|
For more information, see
|
||||||
[instrumentation/README.lto.md](../instrumentation/README.lto.md).
|
[instrumentation/README.lto.md](../instrumentation/README.lto.md).
|
||||||
|
|
||||||
@ -310,24 +283,12 @@ mode.
|
|||||||
TMPDIR=$PWD/assembly_here AFL_KEEP_ASSEMBLY=1 make clean all
|
TMPDIR=$PWD/assembly_here AFL_KEEP_ASSEMBLY=1 make clean all
|
||||||
```
|
```
|
||||||
|
|
||||||
- GCC_PLUGIN mode only: Setting `AFL_GCC_INSTRUMENT_FILE` or
|
- GCC_PLUGIN mode only: Setting `AFL_GCC_INSTRUMENT_FILE` with a filename will
|
||||||
`AFL_GCC_ALLOWLIST` with a filename will only instrument those files that
|
only instrument those files that match the names listed in this file (one
|
||||||
match the names listed in this file (one filename per line).
|
filename per line). See
|
||||||
|
|
||||||
Setting `AFL_GCC_DENYLIST` or `AFL_GCC_BLOCKLIST` with a file name and/or
|
|
||||||
function will only skip those files that match the names listed in the
|
|
||||||
specified file. See
|
|
||||||
[instrumentation/README.instrument_list.md](../instrumentation/README.instrument_list.md)
|
[instrumentation/README.instrument_list.md](../instrumentation/README.instrument_list.md)
|
||||||
for more information.
|
for more information.
|
||||||
|
|
||||||
Setting `AFL_GCC_OUT_OF_LINE=1` will instruct afl-gcc-fast to instrument the
|
|
||||||
code with calls to an injected subroutine instead of the much more efficient
|
|
||||||
inline instrumentation.
|
|
||||||
|
|
||||||
Setting `AFL_GCC_SKIP_NEVERZERO=1` will not implement the skip zero test. If
|
|
||||||
the target performs only a few loops, then this will give a small
|
|
||||||
performance boost.
|
|
||||||
|
|
||||||
## 4) Settings for afl-fuzz
|
## 4) Settings for afl-fuzz
|
||||||
|
|
||||||
The main fuzzer binary accepts several options that disable a couple of sanity
|
The main fuzzer binary accepts several options that disable a couple of sanity
|
||||||
@ -346,9 +307,6 @@ checks or alter some of the more exotic semantics of the tool:
|
|||||||
(`-i in`). This is an important feature to set when resuming a fuzzing
|
(`-i in`). This is an important feature to set when resuming a fuzzing
|
||||||
session.
|
session.
|
||||||
|
|
||||||
- `AFL_IGNORE_SEED_PROBLEMS` will skip over crashes and timeouts in the seeds
|
|
||||||
instead of exiting.
|
|
||||||
|
|
||||||
- Setting `AFL_CRASH_EXITCODE` sets the exit code AFL++ treats as crash. For
|
- Setting `AFL_CRASH_EXITCODE` sets the exit code AFL++ treats as crash. For
|
||||||
example, if `AFL_CRASH_EXITCODE='-1'` is set, each input resulting in a `-1`
|
example, if `AFL_CRASH_EXITCODE='-1'` is set, each input resulting in a `-1`
|
||||||
return code (i.e. `exit(-1)` got called), will be treated as if a crash had
|
return code (i.e. `exit(-1)` got called), will be treated as if a crash had
|
||||||
@ -378,18 +336,9 @@ checks or alter some of the more exotic semantics of the tool:
|
|||||||
- Setting `AFL_DISABLE_TRIM` tells afl-fuzz not to trim test cases. This is
|
- Setting `AFL_DISABLE_TRIM` tells afl-fuzz not to trim test cases. This is
|
||||||
usually a bad idea!
|
usually a bad idea!
|
||||||
|
|
||||||
- Setting `AFL_KEEP_TIMEOUTS` will keep longer running inputs if they reach
|
|
||||||
new coverage
|
|
||||||
|
|
||||||
- On the contrary, if you are not interested in any timeouts, you can set
|
|
||||||
`AFL_IGNORE_TIMEOUTS` to get a bit of speed instead.
|
|
||||||
|
|
||||||
- `AFL_EXIT_ON_SEED_ISSUES` will restore the vanilla afl-fuzz behavior which
|
- `AFL_EXIT_ON_SEED_ISSUES` will restore the vanilla afl-fuzz behavior which
|
||||||
does not allow crashes or timeout seeds in the initial -i corpus.
|
does not allow crashes or timeout seeds in the initial -i corpus.
|
||||||
|
|
||||||
- `AFL_CRASHING_SEEDS_AS_NEW_CRASH` will treat crashing seeds as new crash. these
|
|
||||||
crashes will be written to crashes folder as op:dry_run, and orig:<seed_file_name>.
|
|
||||||
|
|
||||||
- `AFL_EXIT_ON_TIME` causes afl-fuzz to terminate if no new paths were found
|
- `AFL_EXIT_ON_TIME` causes afl-fuzz to terminate if no new paths were found
|
||||||
within a specified period of time (in seconds). May be convenient for some
|
within a specified period of time (in seconds). May be convenient for some
|
||||||
types of automated jobs.
|
types of automated jobs.
|
||||||
@ -411,10 +360,10 @@ checks or alter some of the more exotic semantics of the tool:
|
|||||||
valid terminal was detected (for virtual consoles).
|
valid terminal was detected (for virtual consoles).
|
||||||
|
|
||||||
- Setting `AFL_FORKSRV_INIT_TMOUT` allows you to specify a different timeout
|
- Setting `AFL_FORKSRV_INIT_TMOUT` allows you to specify a different timeout
|
||||||
to wait for the forkserver to spin up. The specified value is the new timeout, in milliseconds.
|
to wait for the forkserver to spin up. The default is the `-t` value times
|
||||||
The default is the `-t` value times `FORK_WAIT_MULT` from `config.h` (usually 10), so for a `-t 100`, the default would wait for `1000` milliseconds.
|
`FORK_WAIT_MULT` from `config.h` (usually 10), so for a `-t 100`, the
|
||||||
The `AFL_FORKSRV_INIT_TMOUT` value does not get multiplied. It overwrites the initial timeout afl-fuzz waits for the target to come up with a constant time.
|
default would wait for `1000` milliseconds. Setting a different time here is
|
||||||
Setting a different time here is useful if the target has a very slow startup time, for example, when doing
|
useful if the target has a very slow startup time, for example, when doing
|
||||||
full-system fuzzing or emulation, but you don't want the actual runs to wait
|
full-system fuzzing or emulation, but you don't want the actual runs to wait
|
||||||
too long for timeouts.
|
too long for timeouts.
|
||||||
|
|
||||||
@ -431,45 +380,24 @@ checks or alter some of the more exotic semantics of the tool:
|
|||||||
|
|
||||||
- If afl-fuzz encounters an incorrect fuzzing setup during a fuzzing session
|
- If afl-fuzz encounters an incorrect fuzzing setup during a fuzzing session
|
||||||
(not at startup), it will terminate. If you do not want this, then you can
|
(not at startup), it will terminate. If you do not want this, then you can
|
||||||
set `AFL_IGNORE_PROBLEMS`. If you additionally want to also ignore coverage
|
set `AFL_IGNORE_PROBLEMS`.
|
||||||
from late loaded libraries, you can set `AFL_IGNORE_PROBLEMS_COVERAGE`.
|
|
||||||
|
|
||||||
- When running with multiple afl-fuzz or with `-F`, setting `AFL_IMPORT_FIRST`
|
- When running in the `-M` or `-S` mode, setting `AFL_IMPORT_FIRST` causes the
|
||||||
causes the fuzzer to import test cases from other instances before doing
|
fuzzer to import test cases from other instances before doing anything else.
|
||||||
anything else. This makes the "own finds" counter in the UI more accurate.
|
This makes the "own finds" counter in the UI more accurate. Beyond counter
|
||||||
|
aesthetics, not much else should change.
|
||||||
|
|
||||||
- When running with multiple afl-fuzz or with `-F`, setting `AFL_FINAL_SYNC`
|
- `AFL_KILL_SIGNAL`: Set the signal ID to be delivered to child processes on
|
||||||
will cause the fuzzer to perform a final import of test cases when
|
timeout. Unless you implement your own targets or instrumentation, you
|
||||||
terminating. This is beneficial for `-M` main fuzzers to ensure it has all
|
|
||||||
unique test cases and hence you only need to `afl-cmin` this single
|
|
||||||
queue.
|
|
||||||
|
|
||||||
- Setting `AFL_INPUT_LEN_MIN` and `AFL_INPUT_LEN_MAX` are an alternative to
|
|
||||||
the afl-fuzz -g/-G command line option to control the minimum/maximum
|
|
||||||
of fuzzing input generated.
|
|
||||||
|
|
||||||
- `AFL_KILL_SIGNAL`: Set the signal ID to be delivered to child processes
|
|
||||||
on timeout. Unless you implement your own targets or instrumentation, you
|
|
||||||
likely don't have to set it. By default, on timeout and on exit, `SIGKILL`
|
likely don't have to set it. By default, on timeout and on exit, `SIGKILL`
|
||||||
(`AFL_KILL_SIGNAL=9`) will be delivered to the child.
|
(`AFL_KILL_SIGNAL=9`) will be delivered to the child.
|
||||||
|
|
||||||
- `AFL_FORK_SERVER_KILL_SIGNAL`: Set the signal ID to be delivered to the
|
|
||||||
fork server when AFL++ is terminated. Unless you implement your
|
|
||||||
fork server, you likely do not have to set it. By default, `SIGTERM`
|
|
||||||
(`AFL_FORK_SERVER_KILL_SIGNAL=15`) will be delivered to the fork server.
|
|
||||||
If only `AFL_KILL_SIGNAL` is provided, `AFL_FORK_SERVER_KILL_SIGNAL` will
|
|
||||||
be set to same value as `AFL_KILL_SIGNAL` to provide backward compatibility.
|
|
||||||
If `AFL_FORK_SERVER_KILL_SIGNAL` is also set, it takes precedence.
|
|
||||||
|
|
||||||
NOTE: Uncatchable signals, such as `SIGKILL`, cause child processes of
|
|
||||||
the fork server to be orphaned and leaves them in a zombie state.
|
|
||||||
|
|
||||||
- `AFL_MAP_SIZE` sets the size of the shared map that afl-analyze, afl-fuzz,
|
- `AFL_MAP_SIZE` sets the size of the shared map that afl-analyze, afl-fuzz,
|
||||||
afl-showmap, and afl-tmin create to gather instrumentation data from the
|
afl-showmap, and afl-tmin create to gather instrumentation data from the
|
||||||
target. This must be equal or larger than the size the target was compiled
|
target. This must be equal or larger than the size the target was compiled
|
||||||
with.
|
with.
|
||||||
|
|
||||||
- Setting `AFL_MAX_DET_EXTRAS` will change the threshold at what number of
|
- Setting `AFL_MAX_DET_EXRAS` will change the threshold at what number of
|
||||||
elements in the `-x` dictionary and LTO autodict (combined) the
|
elements in the `-x` dictionary and LTO autodict (combined) the
|
||||||
probabilistic mode will kick off. In probabilistic mode, not all dictionary
|
probabilistic mode will kick off. In probabilistic mode, not all dictionary
|
||||||
entries will be used all of the time for fuzzing mutations to not slow down
|
entries will be used all of the time for fuzzing mutations to not slow down
|
||||||
@ -505,20 +433,14 @@ checks or alter some of the more exotic semantics of the tool:
|
|||||||
normally done when starting up the forkserver and causes a pretty
|
normally done when starting up the forkserver and causes a pretty
|
||||||
significant performance drop.
|
significant performance drop.
|
||||||
|
|
||||||
- `AFL_NO_SNAPSHOT` will advise afl-fuzz not to use the snapshot feature if
|
- `AFL_NO_SNAPSHOT` will advice afl-fuzz not to use the snapshot feature if
|
||||||
the snapshot lkm is loaded.
|
the snapshot lkm is loaded.
|
||||||
|
|
||||||
- Setting `AFL_NO_UI` inhibits the UI altogether and just periodically prints
|
- Setting `AFL_NO_UI` inhibits the UI altogether and just periodically prints
|
||||||
some basic stats. This behavior is also automatically triggered when the
|
some basic stats. This behavior is also automatically triggered when the
|
||||||
output from afl-fuzz is redirected to a file or to a pipe.
|
output from afl-fuzz is redirected to a file or to a pipe.
|
||||||
|
|
||||||
- Setting `AFL_NO_STARTUP_CALIBRATION` will skip the initial calibration
|
- In QEMU mode (-Q) and Frida mode (-O), `AFL_PATH` will be searched for
|
||||||
of all starting seeds, and start fuzzing at once. Use with care, this
|
|
||||||
degrades the fuzzing performance!
|
|
||||||
|
|
||||||
- Setting `AFL_NO_WARN_INSTABILITY` will suppress instability warnings.
|
|
||||||
|
|
||||||
- In QEMU mode (-Q) and FRIDA mode (-O), `AFL_PATH` will be searched for
|
|
||||||
afl-qemu-trace and afl-frida-trace.so.
|
afl-qemu-trace and afl-frida-trace.so.
|
||||||
|
|
||||||
- If you are using persistent mode (you should, see
|
- If you are using persistent mode (you should, see
|
||||||
@ -526,7 +448,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
|
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
|
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
|
re-trigger these crashes, you can use the `AFL_PERSISTENT_RECORD` variable
|
||||||
with a value of how many previous fuzz cases to keep prior a crash. If set to
|
with a value of how many previous fuzz cases to keep prio a crash. If set to
|
||||||
e.g., 10, then the 9 previous inputs are written to out/default/crashes as
|
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:000000 to RECORD:000000,cnt:000008 and
|
||||||
RECORD:000000,cnt:000009 being the crash case. NOTE: This option needs to be
|
RECORD:000000,cnt:000009 being the crash case. NOTE: This option needs to be
|
||||||
@ -575,20 +497,11 @@ checks or alter some of the more exotic semantics of the tool:
|
|||||||
(empty/non present) will add no tags to the metrics. For more information,
|
(empty/non present) will add no tags to the metrics. For more information,
|
||||||
see [rpc_statsd.md](rpc_statsd.md).
|
see [rpc_statsd.md](rpc_statsd.md).
|
||||||
|
|
||||||
- `AFL_SYNC_TIME` allows you to specify a different minimal time (in minutes)
|
|
||||||
between fuzzing instances synchronization. Default sync time is 30 minutes,
|
|
||||||
note that time is halved for -M main nodes.
|
|
||||||
|
|
||||||
- Setting `AFL_TARGET_ENV` causes AFL++ to set extra environment variables for
|
- Setting `AFL_TARGET_ENV` causes AFL++ to set extra environment variables for
|
||||||
the target binary. Example: `AFL_TARGET_ENV="VAR1=1 VAR2='a b c'" afl-fuzz
|
the target binary. Example: `AFL_TARGET_ENV="VAR1=1 VAR2='a b c'" afl-fuzz
|
||||||
... `. This exists mostly for things like `LD_LIBRARY_PATH` but it would
|
... `. This exists mostly for things like `LD_LIBRARY_PATH` but it would
|
||||||
theoretically allow fuzzing of AFL++ itself (with 'target' AFL++ using some
|
theoretically allow fuzzing of AFL++ itself (with 'target' AFL++ using some
|
||||||
AFL_ vars that would disrupt work of 'fuzzer' AFL++). Note that when using
|
AFL_ vars that would disrupt work of 'fuzzer' AFL++).
|
||||||
QEMU mode, the `AFL_TARGET_ENV` environment variables will apply to QEMU, as
|
|
||||||
well as the target binary. Therefore, in this case, you might want to use
|
|
||||||
QEMU's `QEMU_SET_ENV` environment variable (see QEMU's documentation because
|
|
||||||
the format is different from `AFL_TARGET_ENV`) to apply the environment
|
|
||||||
variables to the target and not QEMU.
|
|
||||||
|
|
||||||
- `AFL_TESTCACHE_SIZE` allows you to override the size of `#define
|
- `AFL_TESTCACHE_SIZE` allows you to override the size of `#define
|
||||||
TESTCASE_CACHE` in config.h. Recommended values are 50-250MB - or more if
|
TESTCASE_CACHE` in config.h. Recommended values are 50-250MB - or more if
|
||||||
@ -602,27 +515,9 @@ checks or alter some of the more exotic semantics of the tool:
|
|||||||
- Setting `AFL_TRY_AFFINITY` tries to attempt binding to a specific CPU core
|
- Setting `AFL_TRY_AFFINITY` tries to attempt binding to a specific CPU core
|
||||||
on Linux systems, but will not terminate if that fails.
|
on Linux systems, but will not terminate if that fails.
|
||||||
|
|
||||||
- The following environment variables are only needed if you implemented
|
- Outdated environment variables that are not supported anymore:
|
||||||
your own forkserver or persistent mode, or if __AFL_LOOP or __AFL_INIT
|
- `AFL_DEFER_FORKSRV`
|
||||||
are in a shared library and not the main binary:
|
- `AFL_PERSISTENT`
|
||||||
- `AFL_DEFER_FORKSRV` enforces a deferred forkserver even if none was
|
|
||||||
detected in the target binary
|
|
||||||
- `AFL_PERSISTENT` enforces persistent mode even if none was detected
|
|
||||||
in the target binary
|
|
||||||
|
|
||||||
- If you need an early forkserver in your target because of early
|
|
||||||
constructors in your target, you can set `AFL_EARLY_FORKSERVER`.
|
|
||||||
Note that this is not a compile time option but a runtime option :-)
|
|
||||||
|
|
||||||
- Set `AFL_PIZZA_MODE` to 1 to enable the April 1st stats menu, set to -1
|
|
||||||
to disable although it is 1st of April. 0 is the default and means enable
|
|
||||||
on the 1st of April automatically.
|
|
||||||
|
|
||||||
- If you need a specific interval to update fuzzer_stats file, you can
|
|
||||||
set `AFL_FUZZER_STATS_UPDATE_INTERVAL` to the interval in seconds you'd
|
|
||||||
the file to be updated.
|
|
||||||
Note that will not be exact and with slow targets it can take seconds
|
|
||||||
until there is a slice for the time test.
|
|
||||||
|
|
||||||
## 5) Settings for afl-qemu-trace
|
## 5) Settings for afl-qemu-trace
|
||||||
|
|
||||||
@ -650,14 +545,6 @@ The QEMU wrapper used to instrument binary-only code supports several settings:
|
|||||||
- Setting `AFL_INST_LIBS` causes the translator to also instrument the code
|
- Setting `AFL_INST_LIBS` causes the translator to also instrument the code
|
||||||
inside any dynamically linked libraries (notably including glibc).
|
inside any dynamically linked libraries (notably including glibc).
|
||||||
|
|
||||||
- You can use `AFL_QEMU_INST_RANGES=0xaaaa-0xbbbb,0xcccc-0xdddd` to just
|
|
||||||
instrument specific memory locations, e.g. a specific library.
|
|
||||||
Excluding ranges takes priority over any included ranges or `AFL_INST_LIBS`.
|
|
||||||
|
|
||||||
- You can use `AFL_QEMU_EXCLUDE_RANGES=0xaaaa-0xbbbb,0xcccc-0xdddd` to **NOT**
|
|
||||||
instrument specific memory locations, e.g. a specific library.
|
|
||||||
Excluding ranges takes priority over any included ranges or `AFL_INST_LIBS`.
|
|
||||||
|
|
||||||
- It is possible to set `AFL_INST_RATIO` to skip the instrumentation on some
|
- It is possible to set `AFL_INST_RATIO` to skip the instrumentation on some
|
||||||
of the basic blocks, which can be useful when dealing with very complex
|
of the basic blocks, which can be useful when dealing with very complex
|
||||||
binaries.
|
binaries.
|
||||||
@ -692,10 +579,6 @@ The QEMU wrapper used to instrument binary-only code supports several settings:
|
|||||||
emulation" variables (e.g., `QEMU_STACK_SIZE`), but there should be no
|
emulation" variables (e.g., `QEMU_STACK_SIZE`), but there should be no
|
||||||
reason to touch them.
|
reason to touch them.
|
||||||
|
|
||||||
- Normally a `README.txt` is written to the `crashes/` directory when a first
|
|
||||||
crash is found. Setting `AFL_NO_CRASH_README` will prevent this. Useful when
|
|
||||||
counting crashes based on a file count in that directory.
|
|
||||||
|
|
||||||
## 7) Settings for afl-frida-trace
|
## 7) Settings for afl-frida-trace
|
||||||
|
|
||||||
The FRIDA wrapper used to instrument binary-only code supports many of the same
|
The FRIDA wrapper used to instrument binary-only code supports many of the same
|
||||||
@ -719,8 +602,6 @@ support.
|
|||||||
* `AFL_FRIDA_INST_JIT` - Enable the instrumentation of Just-In-Time compiled
|
* `AFL_FRIDA_INST_JIT` - Enable the instrumentation of Just-In-Time compiled
|
||||||
code. Code is considered to be JIT if the executable segment is not backed by
|
code. Code is considered to be JIT if the executable segment is not backed by
|
||||||
a file.
|
a file.
|
||||||
* `AFL_FRIDA_INST_NO_DYNAMIC_LOAD` - Don't instrument the code loaded late at
|
|
||||||
runtime. Strictly limits instrumentation to what has been included.
|
|
||||||
* `AFL_FRIDA_INST_NO_OPTIMIZE` - Don't use optimized inline assembly coverage
|
* `AFL_FRIDA_INST_NO_OPTIMIZE` - Don't use optimized inline assembly coverage
|
||||||
instrumentation (the default where available). Required to use
|
instrumentation (the default where available). Required to use
|
||||||
`AFL_FRIDA_INST_TRACE`.
|
`AFL_FRIDA_INST_TRACE`.
|
||||||
@ -764,8 +645,8 @@ support.
|
|||||||
* `AFL_FRIDA_STALKER_ADJACENT_BLOCKS` - Configure the number of adjacent blocks
|
* `AFL_FRIDA_STALKER_ADJACENT_BLOCKS` - Configure the number of adjacent blocks
|
||||||
to fetch when generating instrumented code. By fetching blocks in the same
|
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
|
order they appear in the original program, rather than the order of execution
|
||||||
should help reduce locality and adjacency. This includes allowing us to
|
should help reduce locallity and adjacency. This includes allowing us to
|
||||||
vector between adjacent blocks using a NOP slide rather than an immediate
|
vector between adjancent blocks using a NOP slide rather than an immediate
|
||||||
branch.
|
branch.
|
||||||
* `AFL_FRIDA_STALKER_IC_ENTRIES` - Configure the number of inline cache entries
|
* `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
|
stored along-side branch instructions which provide a cache to avoid having to
|
||||||
|
103
docs/features.md
103
docs/features.md
@ -1,96 +1,39 @@
|
|||||||
# Important features of AFL++
|
# Important features of AFL++
|
||||||
|
|
||||||
AFL++ supports llvm from 3.8 up to version 12, very fast binary fuzzing with
|
AFL++ supports llvm from 3.8 up to version 12, very fast binary fuzzing with
|
||||||
QEMU 5.1 with laf-intel and Redqueen, FRIDA mode, unicorn mode, gcc plugin, full
|
QEMU 5.1 with laf-intel and redqueen, FRIDA mode, unicorn mode, gcc plugin, full
|
||||||
*BSD, Mac OS, Solaris and Android support and much, much, much more.
|
*BSD, Mac OS, Solaris and Android support and much, much, much more.
|
||||||
|
|
||||||
## Features and instrumentation
|
| Feature/Instrumentation | afl-gcc | llvm | gcc_plugin | FRIDA mode(9) | QEMU mode(10) |unicorn_mode(10) |coresight_mode(11)|
|
||||||
|
| -------------------------|:-------:|:---------:|:----------:|:----------------:|:----------------:|:----------------:|:----------------:|
|
||||||
|
| Threadsafe counters | | x(3) | | | | | |
|
||||||
|
| NeverZero | x86[_64]| x(1) | x | x | x | x | |
|
||||||
|
| Persistent Mode | | x | x | x86[_64]/arm64 | x86[_64]/arm[64] | x | |
|
||||||
|
| LAF-Intel / CompCov | | x | | | x86[_64]/arm[64] | x86[_64]/arm[64] | |
|
||||||
|
| CmpLog | | x | | x86[_64]/arm64 | x86[_64]/arm[64] | | |
|
||||||
|
| Selective Instrumentation| | x | x | x | x | | |
|
||||||
|
| Non-Colliding Coverage | | x(4) | | | (x)(5) | | |
|
||||||
|
| Ngram prev_loc Coverage | | x(6) | | | | | |
|
||||||
|
| Context Coverage | | x(6) | | | | | |
|
||||||
|
| Auto Dictionary | | x(7) | | | | | |
|
||||||
|
| Snapshot LKM Support | | (x)(8) | (x)(8) | | (x)(5) | | |
|
||||||
|
| Shared Memory Test cases | | x | x | x86[_64]/arm64 | x | x | |
|
||||||
|
|
||||||
| Feature/Instrumentation | afl-gcc | llvm | gcc_plugin | FRIDA mode(9) | QEMU mode(10) | unicorn_mode(10) | nyx_mode(12) | coresight_mode(11) |
|
1. default for LLVM >= 9.0, environment variable for older version due an
|
||||||
| ------------------------------|:--------:|:---------:|:----------:|:--------------:|:----------------:|:----------------:|:------------:|:------------------:|
|
|
||||||
| Threadsafe counters [A] | | x(3) | | | | | x | |
|
|
||||||
| NeverZero [B] | x86[_64] | x(1) | x | x | x | x | | |
|
|
||||||
| Persistent Mode [C] | | x | x | x86[_64]/arm64 | x86[_64]/arm[64] | x | | |
|
|
||||||
| LAF-Intel / CompCov [D] | | x | | | x86[_64]/arm[64] | x86[_64]/arm[64] | x86[_64] | |
|
|
||||||
| CmpLog [E] | | x | x | x86[_64]/arm64 | x86[_64]/arm[64] | | | |
|
|
||||||
| Selective Instrumentation [F] | | x | x | x | x | | | |
|
|
||||||
| Non-Colliding Coverage [G] | | x(4) | | | (x)(5) | | | |
|
|
||||||
| Ngram prev_loc Coverage [H] | | x(6) | | | | | | |
|
|
||||||
| Context Coverage [I] | | x(6) | | | | | | |
|
|
||||||
| Auto Dictionary [J] | | x(7) | | | | | | |
|
|
||||||
| Snapshot Support [K] | | (x)(8) | (x)(8) | | (x)(5) | | x | |
|
|
||||||
| Shared Memory Test cases [L] | | x | x | x86[_64]/arm64 | x | x | x | |
|
|
||||||
|
|
||||||
## More information about features
|
|
||||||
|
|
||||||
A. Default is not thread-safe coverage counter updates for better performance,
|
|
||||||
see [instrumentation/README.llvm.md](../instrumentation/README.llvm.md)
|
|
||||||
|
|
||||||
B. On wrapping coverage counters (255 + 1), skip the 0 value and jump to 1
|
|
||||||
instead. This has shown to give better coverage data and is the default; see
|
|
||||||
[instrumentation/README.llvm.md](../instrumentation/README.llvm.md).
|
|
||||||
|
|
||||||
C. Instead of forking, reiterate the fuzz target function in a loop (like
|
|
||||||
`LLVMFuzzerTestOneInput`. Great speed increase but only works with target
|
|
||||||
functions that do not keep state, leak memory, or exit; see
|
|
||||||
[instrumentation/README.persistent_mode.md](../instrumentation/README.persistent_mode.md)
|
|
||||||
|
|
||||||
D. Split any non-8-bit comparison to 8-bit comparison; see
|
|
||||||
[instrumentation/README.laf-intel.md](../instrumentation/README.laf-intel.md)
|
|
||||||
|
|
||||||
E. CmpLog is our enhanced
|
|
||||||
[Redqueen](https://www.ndss-symposium.org/ndss-paper/redqueen-fuzzing-with-input-to-state-correspondence/)
|
|
||||||
implementation, see
|
|
||||||
[instrumentation/README.cmplog.md](../instrumentation/README.cmplog.md)
|
|
||||||
|
|
||||||
F. Similar and compatible to clang 13+ sancov sanitize-coverage-allow/deny but
|
|
||||||
for all llvm versions and all our compile modes, only instrument what should
|
|
||||||
be instrumented, for more speed, directed fuzzing and less instability; see
|
|
||||||
[instrumentation/README.instrument_list.md](../instrumentation/README.instrument_list.md)
|
|
||||||
|
|
||||||
G. Vanilla AFL uses coverage where edges could collide to the same coverage
|
|
||||||
bytes the larger the target is. Our default instrumentation in LTO and
|
|
||||||
afl-clang-fast (PCGUARD) uses non-colliding coverage that also makes it
|
|
||||||
faster. Vanilla AFL style is available with `AFL_LLVM_INSTRUMENT=AFL`; see
|
|
||||||
[instrumentation/README.llvm.md](../instrumentation/README.llvm.md).
|
|
||||||
|
|
||||||
H.+I. Alternative coverage based on previous edges (NGRAM) or depending on the
|
|
||||||
caller (CTX), based on
|
|
||||||
[https://www.usenix.org/system/files/raid2019-wang-jinghan.pdf](https://www.usenix.org/system/files/raid2019-wang-jinghan.pdf);
|
|
||||||
see [instrumentation/README.llvm.md](../instrumentation/README.llvm.md).
|
|
||||||
|
|
||||||
J. An LTO feature that creates a fuzzing dictionary based on comparisons found
|
|
||||||
during compilation/instrumentation. Automatic feature :) See
|
|
||||||
[instrumentation/README.lto.md](../instrumentation/README.lto.md)
|
|
||||||
|
|
||||||
K. The snapshot feature requires a kernel module that was a lot of work to get
|
|
||||||
right and maintained so it is no longer supported. We have
|
|
||||||
[nyx_mode](../nyx_mode/README.md) instead.
|
|
||||||
|
|
||||||
L. Faster fuzzing and less kernel syscall overhead by in-memory fuzz testcase
|
|
||||||
delivery, see
|
|
||||||
[instrumentation/README.persistent_mode.md](../instrumentation/README.persistent_mode.md)
|
|
||||||
|
|
||||||
## More information about instrumentation
|
|
||||||
|
|
||||||
1. Default for LLVM >= 9.0, environment variable for older version due an
|
|
||||||
efficiency bug in previous llvm versions
|
efficiency bug in previous llvm versions
|
||||||
2. GCC creates non-performant code, hence it is disabled in gcc_plugin
|
2. GCC creates non-performant code, hence it is disabled in gcc_plugin
|
||||||
3. With `AFL_LLVM_THREADSAFE_INST`, disables NeverZero
|
3. with `AFL_LLVM_THREADSAFE_INST`, disables NeverZero
|
||||||
4. With pcguard mode and LTO mode for LLVM 11 and newer
|
4. with pcguard mode and LTO mode for LLVM 11 and newer
|
||||||
5. Upcoming, development in the branch
|
5. upcoming, development in the branch
|
||||||
6. Not compatible with LTO instrumentation and needs at least LLVM v4.1
|
6. not compatible with LTO instrumentation and needs at least LLVM v4.1
|
||||||
7. Automatic in LTO mode with LLVM 11 and newer, an extra pass for all LLVM
|
7. automatic in LTO mode with LLVM 11 and newer, an extra pass for all LLVM
|
||||||
versions that write to a file to use with afl-fuzz' `-x`
|
versions that write to a file to use with afl-fuzz' `-x`
|
||||||
8. The snapshot LKM is currently unmaintained due to too many kernel changes
|
8. the snapshot LKM is currently unmaintained due to too many kernel changes
|
||||||
coming too fast :-(
|
coming too fast :-(
|
||||||
9. FRIDA mode is supported on Linux and MacOS for Intel and ARM
|
9. FRIDA mode is supported on Linux and MacOS for Intel and ARM
|
||||||
10. QEMU/Unicorn is only supported on Linux
|
10. QEMU/Unicorn is only supported on Linux
|
||||||
11. Coresight mode is only available on AARCH64 Linux with a CPU with Coresight
|
11. Coresight mode is only available on AARCH64 Linux with a CPU with Coresight
|
||||||
extension
|
extension
|
||||||
12. Nyx mode is only supported on Linux and currently restricted to x86_x64
|
|
||||||
|
|
||||||
## Integrated features and patches
|
|
||||||
|
|
||||||
Among others, the following features and patches have been integrated:
|
Among others, the following features and patches have been integrated:
|
||||||
|
|
||||||
@ -100,7 +43,7 @@ Among others, the following features and patches have been integrated:
|
|||||||
* Unicorn mode which allows fuzzing of binaries from completely different
|
* Unicorn mode which allows fuzzing of binaries from completely different
|
||||||
platforms (integration provided by domenukk)
|
platforms (integration provided by domenukk)
|
||||||
* The new CmpLog instrumentation for LLVM and QEMU inspired by
|
* The new CmpLog instrumentation for LLVM and QEMU inspired by
|
||||||
[Redqueen](https://github.com/RUB-SysSec/redqueen)
|
[Redqueen](https://www.syssec.ruhr-uni-bochum.de/media/emma/veroeffentlichungen/2018/12/17/NDSS19-Redqueen.pdf)
|
||||||
* Win32 PE binary-only fuzzing with QEMU and Wine
|
* Win32 PE binary-only fuzzing with QEMU and Wine
|
||||||
* AFLfast's power schedules by Marcel Böhme:
|
* AFLfast's power schedules by Marcel Böhme:
|
||||||
[https://github.com/mboehme/aflfast](https://github.com/mboehme/aflfast)
|
[https://github.com/mboehme/aflfast](https://github.com/mboehme/aflfast)
|
||||||
|
@ -12,11 +12,11 @@ fuzzed with AFL++.
|
|||||||
|
|
||||||
## TL;DR:
|
## TL;DR:
|
||||||
|
|
||||||
FRIDA mode and QEMU mode in persistent mode are the fastest - if persistent mode
|
QEMU mode in persistent mode is the fastest - if the stability is high enough.
|
||||||
is possible and the stability is high enough.
|
Otherwise, try RetroWrite, Dyninst, and if these fail, too, then try standard
|
||||||
|
QEMU mode with `AFL_ENTRYPOINT` to where you need it.
|
||||||
|
|
||||||
Otherwise, try Zafl, RetroWrite, Dyninst, and if these fail, too, then try
|
If your target is a library, then use FRIDA mode.
|
||||||
standard FRIDA/QEMU mode with `AFL_ENTRYPOINT` to where you need it.
|
|
||||||
|
|
||||||
If your target is non-linux, then use unicorn_mode.
|
If your target is non-linux, then use unicorn_mode.
|
||||||
|
|
||||||
@ -48,12 +48,11 @@ The following setup to use QEMU mode is recommended:
|
|||||||
|
|
||||||
Then run as many instances as you have cores left with either -Q mode or - even
|
Then run as many instances as you have cores left with either -Q mode or - even
|
||||||
better - use a binary rewriter like Dyninst, RetroWrite, ZAFL, etc.
|
better - use a binary rewriter like Dyninst, RetroWrite, ZAFL, etc.
|
||||||
The binary rewriters all have their own advantages and caveats.
|
|
||||||
ZAFL is the best but cannot be used in a business/commercial context.
|
|
||||||
|
|
||||||
If a binary rewriter works for your target then you can use afl-fuzz normally
|
If [afl-dyninst](https://github.com/vanhauser-thc/afl-dyninst) works for your
|
||||||
and it will have twice the speed compared to QEMU mode (but slower than QEMU
|
binary, then you can use afl-fuzz normally and it will have twice the speed
|
||||||
persistent mode).
|
compared to QEMU mode (but slower than QEMU persistent mode). Note that several
|
||||||
|
other binary rewriters exist, all with their advantages and caveats.
|
||||||
|
|
||||||
The speed decrease of QEMU mode is at about 50%. However, various options exist
|
The speed decrease of QEMU mode is at about 50%. However, various options exist
|
||||||
to increase the speed:
|
to increase the speed:
|
||||||
@ -93,14 +92,15 @@ For more information, see
|
|||||||
### FRIDA mode
|
### FRIDA mode
|
||||||
|
|
||||||
In FRIDA mode, you can fuzz binary-only targets as easily as with QEMU mode.
|
In FRIDA mode, you can fuzz binary-only targets as easily as with QEMU mode.
|
||||||
FRIDA mode is most of the times slightly faster than QEMU mode. It is also
|
FRIDA mode is sometimes faster and sometimes slower than QEMU mode. It is also
|
||||||
newer, and has the advantage that it works on MacOS (both intel and M1).
|
newer, lacks COMPCOV, and has the advantage that it works on MacOS (both intel
|
||||||
|
and M1).
|
||||||
|
|
||||||
To build FRIDA mode:
|
To build FRIDA mode:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
cd frida_mode
|
cd frida_mode
|
||||||
gmake
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
For additional instructions and caveats, see
|
For additional instructions and caveats, see
|
||||||
@ -112,6 +112,10 @@ The mode is approximately 2-5x slower than compile-time instrumentation, and is
|
|||||||
less conducive to parallelization. But for binary-only fuzzing, it gives a huge
|
less conducive to parallelization. But for binary-only fuzzing, it gives a huge
|
||||||
speed improvement if it is possible to use.
|
speed improvement if it is possible to use.
|
||||||
|
|
||||||
|
If you want to fuzz a binary-only library, then you can fuzz it with frida-gum
|
||||||
|
via frida_mode/. You will have to write a harness to call the target function in
|
||||||
|
the library, use afl-frida.c as a template.
|
||||||
|
|
||||||
You can also perform remote fuzzing with frida, e.g., if you want to fuzz on
|
You can also perform remote fuzzing with frida, e.g., if you want to fuzz on
|
||||||
iPhone or Android devices, for this you can use
|
iPhone or Android devices, for this you can use
|
||||||
[https://github.com/ttdennis/fpicker/](https://github.com/ttdennis/fpicker/) as
|
[https://github.com/ttdennis/fpicker/](https://github.com/ttdennis/fpicker/) as
|
||||||
@ -122,16 +126,6 @@ to check out our sister project libafl which supports Frida, too:
|
|||||||
[https://github.com/AFLplusplus/LibAFL](https://github.com/AFLplusplus/LibAFL).
|
[https://github.com/AFLplusplus/LibAFL](https://github.com/AFLplusplus/LibAFL).
|
||||||
Working examples already exist :-)
|
Working examples already exist :-)
|
||||||
|
|
||||||
### Nyx mode
|
|
||||||
|
|
||||||
Nyx is a full system emulation fuzzing environment with snapshot support that is
|
|
||||||
built upon KVM and QEMU. It is only available on Linux and currently restricted
|
|
||||||
to x86_x64.
|
|
||||||
|
|
||||||
For binary-only fuzzing a special 5.10 kernel is required.
|
|
||||||
|
|
||||||
See [nyx_mode/README.md](../nyx_mode/README.md).
|
|
||||||
|
|
||||||
### Unicorn
|
### Unicorn
|
||||||
|
|
||||||
Unicorn is a fork of QEMU. The instrumentation is, therefore, very similar. In
|
Unicorn is a fork of QEMU. The instrumentation is, therefore, very similar. In
|
||||||
@ -195,15 +189,12 @@ afl-clang-fast's.
|
|||||||
|
|
||||||
### RetroWrite
|
### RetroWrite
|
||||||
|
|
||||||
RetroWrite is a static binary rewriter that can be combined with AFL++. If you
|
If you have an x86/x86_64 binary that still has its symbols, is compiled with
|
||||||
have an x86_64 or arm64 binary that does not contain C++ exceptions and - if
|
position independent code (PIC/PIE), and does not use most of the C++ features,
|
||||||
x86_64 - still has it's symbols and compiled with position independent code
|
then the RetroWrite solution might be for you. It decompiles to ASM files which
|
||||||
(PIC/PIE), then the RetroWrite solution might be for you.
|
can then be instrumented with afl-gcc.
|
||||||
It decompiles to ASM files which can then be instrumented with afl-gcc.
|
|
||||||
|
|
||||||
Binaries that are statically instrumented for fuzzing using RetroWrite are close
|
It is at about 80-85% performance.
|
||||||
in performance to compiler-instrumented binaries and outperform the QEMU-based
|
|
||||||
instrumentation.
|
|
||||||
|
|
||||||
[https://github.com/HexHive/retrowrite](https://github.com/HexHive/retrowrite)
|
[https://github.com/HexHive/retrowrite](https://github.com/HexHive/retrowrite)
|
||||||
|
|
||||||
@ -286,7 +277,7 @@ its IPT performance is just 6%!
|
|||||||
|
|
||||||
There are many binary-only fuzzing frameworks. Some are great for CTFs but don't
|
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,
|
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:
|
* Jackalope:
|
||||||
[https://github.com/googleprojectzero/Jackalope](https://github.com/googleprojectzero/Jackalope)
|
[https://github.com/googleprojectzero/Jackalope](https://github.com/googleprojectzero/Jackalope)
|
||||||
@ -297,8 +288,9 @@ some are very hard to set up...
|
|||||||
* S2E: [https://github.com/S2E](https://github.com/S2E)
|
* S2E: [https://github.com/S2E](https://github.com/S2E)
|
||||||
* TinyInst:
|
* TinyInst:
|
||||||
[https://github.com/googleprojectzero/TinyInst](https://github.com/googleprojectzero/TinyInst)
|
[https://github.com/googleprojectzero/TinyInst](https://github.com/googleprojectzero/TinyInst)
|
||||||
|
(Mac/Windows only)
|
||||||
* ... please send me any missing that are good
|
* ... please send me any missing that are good
|
||||||
|
|
||||||
## Closing words
|
## Closing words
|
||||||
|
|
||||||
That's it! News, corrections, updates? Send an email to vh@thc.org.
|
That's it! News, corrections, updates? Send an email to vh@thc.org.
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user