272 lines
12 KiB
Plaintext
272 lines
12 KiB
Plaintext
import csv
|
|
import os
|
|
def_flags="--no-default-features --features std,snapshot_restore,singlecore,restarting,do_hash_notify_state"
|
|
remote="remote/"
|
|
RUNTIME=1800
|
|
TARGET_REPS_A=2
|
|
TARGET_REPS_B=2
|
|
NUM_NODES=2
|
|
REP_PER_NODE_A=int(TARGET_REPS_A/NUM_NODES)
|
|
REP_PER_NODE_B=int(TARGET_REPS_B/NUM_NODES)
|
|
NODE_ID= 0 if os.getenv('NODE_ID') == None else int(os.environ['NODE_ID'])
|
|
MY_RANGE_A=range(NODE_ID*REP_PER_NODE_A,(NODE_ID+1)*REP_PER_NODE_A)
|
|
MY_RANGE_B=range(NODE_ID*REP_PER_NODE_B,(NODE_ID+1)*REP_PER_NODE_B)
|
|
|
|
rule build_showmap:
|
|
output:
|
|
directory("bins/target_showmap")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},config_stg"
|
|
|
|
rule build_random:
|
|
output:
|
|
directory("bins/target_random")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},feed_longest"
|
|
|
|
rule build_frafl:
|
|
output:
|
|
directory("bins/target_frafl")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},config_frafl,feed_longest"
|
|
|
|
rule build_afl:
|
|
output:
|
|
directory("bins/target_afl")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},config_afl,observer_hitcounts"
|
|
|
|
rule build_stg:
|
|
output:
|
|
directory("bins/target_stg")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},config_stg"
|
|
|
|
rule build_stgpath:
|
|
output:
|
|
directory("bins/target_stgpath")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},feed_stg_abbhash,sched_stg_abbhash,mutate_stg"
|
|
|
|
rule build_showmap_int:
|
|
output:
|
|
directory("bins/target_showmap_int")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},config_stg,fuzz_int"
|
|
|
|
rule build_random_int:
|
|
output:
|
|
directory("bins/target_random_int")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},feed_longest,fuzz_int"
|
|
|
|
|
|
rule build_frafl_int:
|
|
output:
|
|
directory("bins/target_frafl_int")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},config_frafl,fuzz_int"
|
|
|
|
rule build_afl_int:
|
|
output:
|
|
directory("bins/target_afl_int")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},config_afl,fuzz_int,"
|
|
|
|
rule build_stg_int:
|
|
output:
|
|
directory("bins/target_stg_int")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},config_stg,fuzz_int"
|
|
|
|
rule build_stgpath_int:
|
|
output:
|
|
directory("bins/target_stgpath_int")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},feed_stg_abbhash,sched_stg_abbhash,mutate_stg,fuzz_int"
|
|
|
|
rule build_feedgeneration1:
|
|
output:
|
|
directory("bins/target_feedgeneration1")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},feed_genetic,gensize_1"
|
|
|
|
rule build_feedgeneration1_int:
|
|
output:
|
|
directory("bins/target_feedgeneration1_int")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},feed_genetic,fuzz_int,gensize_1"
|
|
|
|
rule build_feedgeneration10:
|
|
output:
|
|
directory("bins/target_feedgeneration10")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},feed_genetic,gensize_10"
|
|
|
|
rule build_feedgeneration10_int:
|
|
output:
|
|
directory("bins/target_feedgeneration10_int")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},feed_genetic,fuzz_int,gensize_10"
|
|
|
|
rule build_feedgeneration100:
|
|
output:
|
|
directory("bins/target_feedgeneration100")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},config_genetic,gensize_100"
|
|
|
|
rule build_feedgeneration100_int:
|
|
output:
|
|
directory("bins/target_feedgeneration100_int")
|
|
shell:
|
|
"cargo build --target-dir {output} {def_flags},config_genetic,fuzz_int,gensize_100"
|
|
|
|
rule run_bench:
|
|
input:
|
|
"build/{target}.elf",
|
|
"bins/target_{fuzzer}"
|
|
output:
|
|
multiext("timedump/{fuzzer}/{target}#{num}", ".time", ".log") # , ".case"
|
|
run:
|
|
with open('target_symbols.csv') as csvfile:
|
|
reader = csv.DictReader(csvfile)
|
|
line = next((x for x in reader if x['kernel']==wildcards.target), None)
|
|
if line == None:
|
|
return False
|
|
kernel=line['kernel']
|
|
fuzz_main=line['main_function']
|
|
fuzz_input=line['input_symbol']
|
|
fuzz_len=line['input_size']
|
|
bkp=line['return_function']
|
|
if wildcards.fuzzer.find('random') >= 0:
|
|
script="""
|
|
export RUST_BACKTRACE=1
|
|
mkdir -p $(dirname {output[0]})
|
|
set +e
|
|
echo $(pwd)/{input[1]}/debug/fret -n $(pwd)/timedump/{wildcards.fuzzer}/{wildcards.target}#{wildcards.num} -t -a -g -k {input[0]} -c ./target_symbols.csv fuzz --random -t {RUNTIME} -s {wildcards.num}
|
|
$(pwd)/{input[1]}/debug/fret -n $(pwd)/timedump/{wildcards.fuzzer}/{wildcards.target}#{wildcards.num} -t -a -g -k {input[0]} -c ./target_symbols.csv fuzz --random -t {RUNTIME} -s {wildcards.num} > {output[1]} 2>&1
|
|
exit 0
|
|
"""
|
|
else:
|
|
script="""
|
|
export RUST_BACKTRACE=1
|
|
mkdir -p $(dirname {output[0]})
|
|
set +e
|
|
echo $(pwd)/{input[1]}/debug/fret -n $(pwd)/timedump/{wildcards.fuzzer}/{wildcards.target}#{wildcards.num} -t -a -g -k {input[0]} -c ./target_symbols.csv fuzz -t {RUNTIME} -s {wildcards.num}
|
|
$(pwd)/{input[1]}/debug/fret -n $(pwd)/timedump/{wildcards.fuzzer}/{wildcards.target}#{wildcards.num} -t -a -g -k {input[0]} -c ./target_symbols.csv fuzz -t {RUNTIME} -s {wildcards.num} > {output[1]} 2>&1
|
|
exit 0
|
|
"""
|
|
shell(script)
|
|
|
|
rule run_showmap:
|
|
input:
|
|
"{remote}build/{target}.elf",
|
|
"bins/target_showmap",
|
|
"bins/target_showmap_int",
|
|
"{remote}timedump/{fuzzer}/{target}#{num}.case"
|
|
output:
|
|
"{remote}timedump/{fuzzer}/{target}#{num}_case.trace.ron",
|
|
"{remote}timedump/{fuzzer}/{target}#{num}_case.time",
|
|
run:
|
|
with open('target_symbols.csv') as csvfile:
|
|
reader = csv.DictReader(csvfile)
|
|
line = next((x for x in reader if x['kernel']==wildcards.target), None)
|
|
if line == None:
|
|
return False
|
|
kernel=line['kernel']
|
|
fuzz_main=line['main_function']
|
|
fuzz_input=line['input_symbol']
|
|
fuzz_len=line['input_size']
|
|
bkp=line['return_function']
|
|
script=""
|
|
if wildcards.fuzzer.find('_int') > -1:
|
|
script="export FUZZER=$(pwd)/{input[2]}/debug/fret\n"
|
|
else:
|
|
script="export FUZZER=$(pwd)/{input[1]}/debug/fret\n"
|
|
script+="""
|
|
mkdir -p $(dirname {output})
|
|
set +e
|
|
echo $(pwd)/{input[1]}/debug/fret -n $(pwd)/{remote}/timedump/{wildcards.fuzzer}/{wildcards.target}#{wildcards.num}_case -t -a -r -g -k {input[0]} -c ./target_symbols.csv showmap -i {input[3]}
|
|
$(pwd)/{input[1]}/debug/fret -n $(pwd)/{remote}/timedump/{wildcards.fuzzer}/{wildcards.target}#{wildcards.num}_case -t -a -r -g -k {input[0]} -c ./target_symbols.csv showmap -i {input[3]}
|
|
exit 0
|
|
"""
|
|
if wildcards.fuzzer.find('random') >= 0:
|
|
script="export FUZZ_RANDOM=1\n"+script
|
|
shell(script)
|
|
|
|
rule tarnsform_trace:
|
|
input:
|
|
"{remote}timedump/{fuzzer}/{target}.{num}.trace.ron"
|
|
output:
|
|
"{remote}timedump/{fuzzer}/{target}.{num}.trace.csv"
|
|
shell:
|
|
"$(pwd)/../../../../state2gantt/target/debug/state2gantt {input} > {output[0]}"
|
|
|
|
rule trace2gantt:
|
|
input:
|
|
"{remote}timedump/{fuzzer}/{target}.{num}.trace.csv"
|
|
output:
|
|
"{remote}timedump/{fuzzer}/{target}.{num}.trace.csv.png"
|
|
shell:
|
|
"Rscript --vanilla $(pwd)/../../../../state2gantt/gantt.R {input}"
|
|
|
|
rule all_main:
|
|
input:
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['random','afl','feedgeneration10','state'], target=['waters','watersv2'],num=range(0,3))
|
|
|
|
rule all_main_int:
|
|
input:
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['random_int','afl_int','feedgeneration10_int','state_int'], target=['waters_int','watersv2_int'],num=range(0,4))
|
|
|
|
rule all_compare_feedgeneration:
|
|
input:
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['feedgeneration1','feedgeneration10','feedgeneration100'], target=['waters_int','watersv2'],num=range(0,10))
|
|
|
|
rule all_compare_feedgeneration_int:
|
|
input:
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['feedgeneration1_int','feedgeneration10_int','feedgeneration100_int'], target=['waters_int','watersv2_int'],num=range(0,10))
|
|
|
|
rule all_compare_afl:
|
|
input:
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['afl','frafl','feedlongest'], target=['waters','watersv2'],num=range(0,10))
|
|
|
|
rule all_compare_afl_int:
|
|
input:
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['afl_int','frafl_int','feedlongest_int'], target=['waters_int','watersv2_int'],num=range(0,10))
|
|
|
|
rule all_images:
|
|
input:
|
|
expand("{remote}timedump/{fuzzer}/{target}.{num}.trace.csv.png",remote=remote, fuzzer=['afl','feedgeneration10','state'], target=['waters','watersv2'],num=range(0,3))
|
|
|
|
rule all_images_int:
|
|
input:
|
|
expand("{remote}timedump/{fuzzer}/{target}.{num}.trace.csv.png",remote=remote, fuzzer=['afl_int','feedgeneration10_int','state_int'], target=['waters_int','watersv2_int'],num=range(0,3))
|
|
|
|
rule clusterfuzz:
|
|
input:
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['random','afl','feedgeneration10','state'], target=['waters','watersv2'],num=MY_RANGE_A),
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['random_int','afl_int','feedgeneration10_int','state_int'], target=['waters_int','watersv2_int'],num=MY_RANGE_A),
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['feedgeneration1','feedgeneration10','feedgeneration100'], target=['waters_int','watersv2'],num=MY_RANGE_B),
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['feedgeneration1_int','feedgeneration10_int','feedgeneration100_int'], target=['waters_int','watersv2_int'],num=MY_RANGE_B),
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['afl','frafl','feedlongest'], target=['waters','watersv2'],num=MY_RANGE_B),
|
|
expand("timedump/{fuzzer}/{target}.{num}", fuzzer=['afl_int','frafl_int','feedlongest_int'], target=['waters_int','watersv2_int'],num=MY_RANGE_B),
|
|
|
|
rule all_new:
|
|
input:
|
|
expand("timedump/{fuzzer}/{target}#{num}.time", fuzzer=['feedgeneration100', 'frafl', 'stg'], target=['waters', 'watersv2'],num=range(0,3)),
|
|
expand("timedump/{fuzzer}/{target}#{num}.time", fuzzer=['feedgeneration100_int', 'frafl_int', 'stg_int'], target=['waters_int', 'watersv2_int'],num=range(0,3)),
|
|
expand("timedump/{fuzzer}/{target}#{num}.time", fuzzer=['random', 'stgpath'], target=['waters', 'watersv2'],num=range(0,3)),
|
|
expand("timedump/{fuzzer}/{target}#{num}.time", fuzzer=['random_int', 'stgpath_int'], target=['waters_int', 'watersv2_int'],num=range(0,3))
|
|
|
|
rule all_showmap:
|
|
input:
|
|
expand("{remote}timedump/{fuzzer}/{target}#{num}_case.trace.ron",remote=remote, fuzzer=['frafl', 'stg'], target=['watersv2'],num=range(2,3)),
|
|
expand("{remote}timedump/{fuzzer}/{target}#{num}_case.trace.ron",remote=remote, fuzzer=['frafl_int', 'stg_int'], target=['watersv2_int'],num=range(0,3)),
|
|
expand("{remote}timedump/{fuzzer}/{target}#{num}_case.trace.ron",remote=remote, fuzzer=['random', 'stgpath'], target=['watersv2'],num=range(0,1)),
|
|
expand("{remote}timedump/{fuzzer}/{target}#{num}_case.trace.ron",remote=remote, fuzzer=['random_int', 'stgpath_int'], target=['watersv2_int'],num=range(0,1))
|
|
|
|
|
|
|
|
rule all_bins:
|
|
input:
|
|
expand("bins/target_{target}{flag}",target=['random','frafl','stg','stgpath','feedgeneration100'],flag=['','_int']) |