Antoine Poinsot
4 years ago
committed by
Christian Decker
1 changed files with 78 additions and 0 deletions
@ -0,0 +1,78 @@ |
|||
#!/usr/bin/env python3 |
|||
import argparse |
|||
import logging |
|||
import os |
|||
import re |
|||
import subprocess |
|||
|
|||
from concurrent.futures import ThreadPoolExecutor, as_completed |
|||
|
|||
|
|||
def job(command): |
|||
"""Takes a list of str, and runs it as a subprocess.""" |
|||
command_line = " ".join(command) |
|||
logging.debug(f"Running '{command_line}'\n") |
|||
res = subprocess.run(command, check=True, stderr=subprocess.PIPE, |
|||
universal_newlines=True).stderr |
|||
logging.debug(f"Command '{command_line} output:\n'{res}'") |
|||
|
|||
|
|||
if __name__ == "__main__": |
|||
parser = argparse.ArgumentParser( |
|||
description="Run the fuzz targets a given amount of times, or generate" |
|||
" new seeds.", |
|||
) |
|||
parser.add_argument( |
|||
"seed_dir", |
|||
help="The parent directory for the seed corpora of each target.", |
|||
) |
|||
parser.add_argument("-g", "--generate", action="store_true") |
|||
parser.add_argument( |
|||
"-j", |
|||
"--par", |
|||
type=int, |
|||
default=1, |
|||
help="How many targets to run in parallel.", |
|||
) |
|||
parser.add_argument( |
|||
"-n", |
|||
"--runs", |
|||
default=100000, |
|||
help="How many times to run each target (if generating).", |
|||
) |
|||
parser.add_argument( |
|||
"-m", |
|||
"--merge_dir", |
|||
default=None, |
|||
help="The parent directory to merge each target corpus from.", |
|||
) |
|||
|
|||
args = parser.parse_args() |
|||
|
|||
logging.basicConfig(level=logging.DEBUG) |
|||
|
|||
target_dir = os.path.abspath(os.path.dirname(__file__)) |
|||
targets = [os.path.join(target_dir, f) for f in os.listdir(target_dir) |
|||
if re.compile(r"^fuzz-[\w-]*$").findall(f)] |
|||
with ThreadPoolExecutor(max_workers=args.par) as pool: |
|||
jobs = [] |
|||
runs = args.runs if args.generate else 1 |
|||
|
|||
for target in targets: |
|||
seed_dir = os.path.join(args.seed_dir, os.path.basename(target)) |
|||
os.makedirs(seed_dir, exist_ok=True) |
|||
command = [ |
|||
target, |
|||
f"-runs={runs}" if args.merge_dir is None else "-merge=1", |
|||
seed_dir, |
|||
] |
|||
if args.merge_dir is not None: |
|||
input_target = os.path.join(args.merge_dir, |
|||
os.path.basename(target)) |
|||
if not os.path.exists(input_target): |
|||
continue |
|||
command.append(input_target) |
|||
jobs.append(pool.submit(job, command)) |
|||
|
|||
for completed in as_completed(jobs): |
|||
completed.result() |
Loading…
Reference in new issue