1*08b48e0bSAndroid Build Coastguard Worker#!/bin/sh 2*08b48e0bSAndroid Build Coastguard Worker# 3*08b48e0bSAndroid Build Coastguard Worker# american fuzzy lop++ - crash triage utility 4*08b48e0bSAndroid Build Coastguard Worker# ----------------------------------------- 5*08b48e0bSAndroid Build Coastguard Worker# 6*08b48e0bSAndroid Build Coastguard Worker# Originally written by Michal Zalewski 7*08b48e0bSAndroid Build Coastguard Worker# 8*08b48e0bSAndroid Build Coastguard Worker# Copyright 2013, 2014, 2017 Google Inc. All rights reserved. 9*08b48e0bSAndroid Build Coastguard Worker# 10*08b48e0bSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 11*08b48e0bSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 12*08b48e0bSAndroid Build Coastguard Worker# You may obtain a copy of the License at: 13*08b48e0bSAndroid Build Coastguard Worker# 14*08b48e0bSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 15*08b48e0bSAndroid Build Coastguard Worker# 16*08b48e0bSAndroid Build Coastguard Worker# Note that this assumes that the targeted application reads from stdin 17*08b48e0bSAndroid Build Coastguard Worker# and requires no other cmdline parameters. Modify as needed if this is 18*08b48e0bSAndroid Build Coastguard Worker# not the case. 19*08b48e0bSAndroid Build Coastguard Worker# 20*08b48e0bSAndroid Build Coastguard Worker# Note that on OpenBSD, you may need to install a newer version of gdb 21*08b48e0bSAndroid Build Coastguard Worker# (e.g., from ports). You can set GDB=/some/path to point to it if 22*08b48e0bSAndroid Build Coastguard Worker# necessary. 23*08b48e0bSAndroid Build Coastguard Worker# 24*08b48e0bSAndroid Build Coastguard Worker 25*08b48e0bSAndroid Build Coastguard Workerecho "crash triage utility for afl-fuzz by Michal Zalewski" 26*08b48e0bSAndroid Build Coastguard Workerecho 27*08b48e0bSAndroid Build Coastguard Worker 28*08b48e0bSAndroid Build Coastguard Workerulimit -v 100000 2>/dev/null 29*08b48e0bSAndroid Build Coastguard Workerulimit -d 100000 2>/dev/null 30*08b48e0bSAndroid Build Coastguard Worker 31*08b48e0bSAndroid Build Coastguard Workerif [ "$#" -lt "2" ]; then 32*08b48e0bSAndroid Build Coastguard Worker echo "Usage: $0 /path/to/afl_output_dir /path/to/tested_binary [...target params...]" 1>&2 33*08b48e0bSAndroid Build Coastguard Worker echo 1>&2 34*08b48e0bSAndroid Build Coastguard Worker exit 1 35*08b48e0bSAndroid Build Coastguard Workerfi 36*08b48e0bSAndroid Build Coastguard Worker 37*08b48e0bSAndroid Build Coastguard WorkerDIR="$1" 38*08b48e0bSAndroid Build Coastguard WorkerBIN="$2" 39*08b48e0bSAndroid Build Coastguard Workershift 40*08b48e0bSAndroid Build Coastguard Workershift 41*08b48e0bSAndroid Build Coastguard Worker 42*08b48e0bSAndroid Build Coastguard Workerif [ "$AFL_ALLOW_TMP" = "" ]; then 43*08b48e0bSAndroid Build Coastguard Worker 44*08b48e0bSAndroid Build Coastguard Worker echo "$DIR" | grep -qE '^(/var)?/tmp/' 45*08b48e0bSAndroid Build Coastguard Worker T1="$?" 46*08b48e0bSAndroid Build Coastguard Worker 47*08b48e0bSAndroid Build Coastguard Worker echo "$BIN" | grep -qE '^(/var)?/tmp/' 48*08b48e0bSAndroid Build Coastguard Worker T2="$?" 49*08b48e0bSAndroid Build Coastguard Worker 50*08b48e0bSAndroid Build Coastguard Worker if [ "$T1" = "0" -o "$T2" = "0" ]; then 51*08b48e0bSAndroid Build Coastguard Worker echo "[-] Error: do not use shared /tmp or /var/tmp directories with this script." 1>&2 52*08b48e0bSAndroid Build Coastguard Worker exit 1 53*08b48e0bSAndroid Build Coastguard Worker fi 54*08b48e0bSAndroid Build Coastguard Worker 55*08b48e0bSAndroid Build Coastguard Workerfi 56*08b48e0bSAndroid Build Coastguard Worker 57*08b48e0bSAndroid Build Coastguard Workerif 58*08b48e0bSAndroid Build Coastguard Worker [ "$GDB" = "" ]; then 59*08b48e0bSAndroid Build Coastguard Worker GDB=gdb 60*08b48e0bSAndroid Build Coastguard Workerfi 61*08b48e0bSAndroid Build Coastguard Worker 62*08b48e0bSAndroid Build Coastguard Workerif [ ! -f "$BIN" -o ! -x "$BIN" ]; then 63*08b48e0bSAndroid Build Coastguard Worker echo "[-] Error: binary '$BIN' not found or is not executable." 1>&2 64*08b48e0bSAndroid Build Coastguard Worker exit 1 65*08b48e0bSAndroid Build Coastguard Workerfi 66*08b48e0bSAndroid Build Coastguard Worker 67*08b48e0bSAndroid Build Coastguard Workerif [ ! -d "$DIR/queue" ]; then 68*08b48e0bSAndroid Build Coastguard Worker echo "[-] Error: directory '$DIR' not found or not created by afl-fuzz." 1>&2 69*08b48e0bSAndroid Build Coastguard Worker exit 1 70*08b48e0bSAndroid Build Coastguard Workerfi 71*08b48e0bSAndroid Build Coastguard Worker 72*08b48e0bSAndroid Build Coastguard WorkerCCOUNT=$((`ls -- "$DIR/crashes" 2>/dev/null | wc -l`)) 73*08b48e0bSAndroid Build Coastguard Worker 74*08b48e0bSAndroid Build Coastguard Workerif [ "$CCOUNT" = "0" ]; then 75*08b48e0bSAndroid Build Coastguard Worker echo "No crashes recorded in the target directory - nothing to be done." 76*08b48e0bSAndroid Build Coastguard Worker exit 0 77*08b48e0bSAndroid Build Coastguard Workerfi 78*08b48e0bSAndroid Build Coastguard Worker 79*08b48e0bSAndroid Build Coastguard Workerecho 80*08b48e0bSAndroid Build Coastguard Worker 81*08b48e0bSAndroid Build Coastguard Workerfor crash in $DIR/crashes/id:*; do 82*08b48e0bSAndroid Build Coastguard Worker 83*08b48e0bSAndroid Build Coastguard Worker id=`basename -- "$crash" | cut -d, -f1 | cut -d: -f2` 84*08b48e0bSAndroid Build Coastguard Worker sig=`basename -- "$crash" | cut -d, -f2 | cut -d: -f2` 85*08b48e0bSAndroid Build Coastguard Worker 86*08b48e0bSAndroid Build Coastguard Worker # Grab the args, converting @@ to $crash 87*08b48e0bSAndroid Build Coastguard Worker 88*08b48e0bSAndroid Build Coastguard Worker use_args="" 89*08b48e0bSAndroid Build Coastguard Worker use_stdio=1 90*08b48e0bSAndroid Build Coastguard Worker 91*08b48e0bSAndroid Build Coastguard Worker for a in $@; do 92*08b48e0bSAndroid Build Coastguard Worker 93*08b48e0bSAndroid Build Coastguard Worker case "$a" in 94*08b48e0bSAndroid Build Coastguard Worker *@@*) 95*08b48e0bSAndroid Build Coastguard Worker unset use_stdio 96*08b48e0bSAndroid Build Coastguard Worker use_args="$use_args `printf %s "$a" | sed -e 's<@@<'$crash'<g'`" 97*08b48e0bSAndroid Build Coastguard Worker ;; 98*08b48e0bSAndroid Build Coastguard Worker *) 99*08b48e0bSAndroid Build Coastguard Worker use_args="$use_args $a" 100*08b48e0bSAndroid Build Coastguard Worker ;; 101*08b48e0bSAndroid Build Coastguard Worker esac 102*08b48e0bSAndroid Build Coastguard Worker 103*08b48e0bSAndroid Build Coastguard Worker done 104*08b48e0bSAndroid Build Coastguard Worker 105*08b48e0bSAndroid Build Coastguard Worker # Strip the trailing space 106*08b48e0bSAndroid Build Coastguard Worker use_args="${use_args# }" 107*08b48e0bSAndroid Build Coastguard Worker 108*08b48e0bSAndroid Build Coastguard Worker echo "+++ ID $id, SIGNAL $sig +++" 109*08b48e0bSAndroid Build Coastguard Worker echo 110*08b48e0bSAndroid Build Coastguard Worker 111*08b48e0bSAndroid Build Coastguard Worker if [ "$use_stdio" = "1" ]; then 112*08b48e0bSAndroid Build Coastguard Worker $GDB --batch -q --ex "r $use_args <$crash" --ex 'back' --ex 'disass $pc, $pc+16' --ex 'info reg' --ex 'quit' "$BIN" 0</dev/null 113*08b48e0bSAndroid Build Coastguard Worker else 114*08b48e0bSAndroid Build Coastguard Worker $GDB --batch -q --ex "r $use_args" --ex 'back' --ex 'disass $pc, $pc+16' --ex 'info reg' --ex 'quit' "$BIN" 0</dev/null 115*08b48e0bSAndroid Build Coastguard Worker fi 116*08b48e0bSAndroid Build Coastguard Worker echo 117*08b48e0bSAndroid Build Coastguard Worker 118*08b48e0bSAndroid Build Coastguard Workerdone 119