1*7eba2f3bSAndroid Build Coastguard Worker#!/bin/bash 2*7eba2f3bSAndroid Build Coastguard Worker 3*7eba2f3bSAndroid Build Coastguard Worker# Due to the complexity to android buile environment this script is created for 4*7eba2f3bSAndroid Build Coastguard Worker# development purpose to build, run and debug the fuzzers. It's not needed or 5*7eba2f3bSAndroid Build Coastguard Worker# required for official build and fuzzing. 6*7eba2f3bSAndroid Build Coastguard Worker 7*7eba2f3bSAndroid Build Coastguard Workerfunction init() { 8*7eba2f3bSAndroid Build Coastguard Worker if [ -z "$ANDROID_BUILD_TOP" ]; 9*7eba2f3bSAndroid Build Coastguard Worker then 10*7eba2f3bSAndroid Build Coastguard Worker echo "Did you forget lunch?" 11*7eba2f3bSAndroid Build Coastguard Worker exit 1 12*7eba2f3bSAndroid Build Coastguard Worker fi 13*7eba2f3bSAndroid Build Coastguard Worker source $ANDROID_BUILD_TOP/build/envsetup.sh 14*7eba2f3bSAndroid Build Coastguard Worker 15*7eba2f3bSAndroid Build Coastguard Worker PROJ=$(basename $PWD) 16*7eba2f3bSAndroid Build Coastguard Worker FUZZER_NAME=nfc_${PROJ}_fuzzer 17*7eba2f3bSAndroid Build Coastguard Worker FUZZ_DIR=data/fuzz/$(get_build_var TARGET_ARCH)/$FUZZER_NAME 18*7eba2f3bSAndroid Build Coastguard Worker FUZZ_OPTIONS="$FUZZ_OPTIONS -close_fd_mask=3 -max_len=512 -artifact_prefix=/$FUZZ_DIR/crashes/" 19*7eba2f3bSAndroid Build Coastguard Worker} 20*7eba2f3bSAndroid Build Coastguard Worker 21*7eba2f3bSAndroid Build Coastguard Workerfunction run_once() { 22*7eba2f3bSAndroid Build Coastguard Worker if [ "$1" == "-c" ]; 23*7eba2f3bSAndroid Build Coastguard Worker then 24*7eba2f3bSAndroid Build Coastguard Worker adb shell rm -rf /$FUZZ_DIR/corpus /$FUZZ_DIR/crashes /$FUZZ_DIR/gcov 25*7eba2f3bSAndroid Build Coastguard Worker adb shell mkdir -p /$FUZZ_DIR/corpus /$FUZZ_DIR/crashes /$FUZZ_DIR/gcov 26*7eba2f3bSAndroid Build Coastguard Worker adb push ./corpus/* /$FUZZ_DIR/corpus/ >/dev/null 2>&1 27*7eba2f3bSAndroid Build Coastguard Worker rm -rf ./logs ./coverage 28*7eba2f3bSAndroid Build Coastguard Worker 29*7eba2f3bSAndroid Build Coastguard Worker shift 30*7eba2f3bSAndroid Build Coastguard Worker fi 31*7eba2f3bSAndroid Build Coastguard Worker 32*7eba2f3bSAndroid Build Coastguard Worker adb logcat -c 33*7eba2f3bSAndroid Build Coastguard Worker if [ -z "$1" ]; 34*7eba2f3bSAndroid Build Coastguard Worker then 35*7eba2f3bSAndroid Build Coastguard Worker PAYLOAD=/$FUZZ_DIR/corpus 36*7eba2f3bSAndroid Build Coastguard Worker echo "Fuzzing with corpus from $PAYLOAD..." 37*7eba2f3bSAndroid Build Coastguard Worker else 38*7eba2f3bSAndroid Build Coastguard Worker PAYLOAD=$1 39*7eba2f3bSAndroid Build Coastguard Worker echo "Verifying payload $PAYLOAD..." 40*7eba2f3bSAndroid Build Coastguard Worker fi 41*7eba2f3bSAndroid Build Coastguard Worker 42*7eba2f3bSAndroid Build Coastguard Worker adb shell mkdir -p /$FUZZ_DIR/corpus /$FUZZ_DIR/crashes /$FUZZ_DIR/gcov 43*7eba2f3bSAndroid Build Coastguard Worker adb shell LD_LIBRARY_PATH=/system/lib64/vndk-29 GCOV_PREFIX=/$FUZZ_DIR/gcov GCOV_PREFIX_STRIP=3 /$FUZZ_DIR/$FUZZER_NAME $FUZZ_OPTIONS $PAYLOAD 44*7eba2f3bSAndroid Build Coastguard Worker 45*7eba2f3bSAndroid Build Coastguard Worker echo "===========================================================================================" 46*7eba2f3bSAndroid Build Coastguard Worker adb logcat -d| $ANDROID_BUILD_TOP/external/compiler-rt/lib/asan/scripts/symbolize.py 47*7eba2f3bSAndroid Build Coastguard Worker} 48*7eba2f3bSAndroid Build Coastguard Worker 49*7eba2f3bSAndroid Build Coastguard Workerfunction run_fuzz() { 50*7eba2f3bSAndroid Build Coastguard Worker if [ "$1" == "-c" ]; 51*7eba2f3bSAndroid Build Coastguard Worker then 52*7eba2f3bSAndroid Build Coastguard Worker adb shell rm -rf /$FUZZ_DIR/corpus /$FUZZ_DIR/crashes /$FUZZ_DIR/gcov 53*7eba2f3bSAndroid Build Coastguard Worker adb shell mkdir -p /$FUZZ_DIR/corpus /$FUZZ_DIR/crashes /$FUZZ_DIR/gcov 54*7eba2f3bSAndroid Build Coastguard Worker adb push ./corpus/* /$FUZZ_DIR/corpus/ >/dev/null 2>&1 55*7eba2f3bSAndroid Build Coastguard Worker rm -rf ./logs ./coverage 56*7eba2f3bSAndroid Build Coastguard Worker fi 57*7eba2f3bSAndroid Build Coastguard Worker 58*7eba2f3bSAndroid Build Coastguard Worker mkdir -p ./logs/ERROR ./logs/UNKNOWN ./coverage 59*7eba2f3bSAndroid Build Coastguard Worker while true 60*7eba2f3bSAndroid Build Coastguard Worker do 61*7eba2f3bSAndroid Build Coastguard Worker echo "Running ..." 62*7eba2f3bSAndroid Build Coastguard Worker TS=`date +"%m-%d-%Y-%H-%M-%S"` 63*7eba2f3bSAndroid Build Coastguard Worker run_once >./logs/fuzz.log 2>&1 64*7eba2f3bSAndroid Build Coastguard Worker 65*7eba2f3bSAndroid Build Coastguard Worker echo "Fuzzer crashed, looking for crash input ..." 66*7eba2f3bSAndroid Build Coastguard Worker CRASH=$(grep -aoP "Test unit written to \K\S+" ./logs/fuzz.log) 67*7eba2f3bSAndroid Build Coastguard Worker if [ -z "$CRASH" ]; 68*7eba2f3bSAndroid Build Coastguard Worker then 69*7eba2f3bSAndroid Build Coastguard Worker echo "Error, crash not found!" 70*7eba2f3bSAndroid Build Coastguard Worker mv ./logs/fuzz.log ./logs/ERROR/run_$TS.log 71*7eba2f3bSAndroid Build Coastguard Worker continue 72*7eba2f3bSAndroid Build Coastguard Worker fi 73*7eba2f3bSAndroid Build Coastguard Worker 74*7eba2f3bSAndroid Build Coastguard Worker echo "Verifying crash ..." 75*7eba2f3bSAndroid Build Coastguard Worker run_once $CRASH >./logs/verify.log 2>&1 76*7eba2f3bSAndroid Build Coastguard Worker SIG=$(grep -m 1 -aoP "#?? \S+ in \K\S+ system/nfc/src\S+:\S+" ./logs/verify.log) 77*7eba2f3bSAndroid Build Coastguard Worker if [ -z "$SIG" ]; 78*7eba2f3bSAndroid Build Coastguard Worker then 79*7eba2f3bSAndroid Build Coastguard Worker SIG='UNKNOWN' 80*7eba2f3bSAndroid Build Coastguard Worker cat ./logs/verify.log>>./logs/fuzz.log 81*7eba2f3bSAndroid Build Coastguard Worker else 82*7eba2f3bSAndroid Build Coastguard Worker cp ./logs/verify.log ./logs/fuzz.log 83*7eba2f3bSAndroid Build Coastguard Worker fi 84*7eba2f3bSAndroid Build Coastguard Worker 85*7eba2f3bSAndroid Build Coastguard Worker SIG_DIR=$(echo $SIG | tr " /:" '#@#') 86*7eba2f3bSAndroid Build Coastguard Worker if [ ! -d "./logs/$SIG_DIR" ]; 87*7eba2f3bSAndroid Build Coastguard Worker then 88*7eba2f3bSAndroid Build Coastguard Worker echo "New crash category found: $SIG" 89*7eba2f3bSAndroid Build Coastguard Worker mkdir -p ./logs/$SIG_DIR 90*7eba2f3bSAndroid Build Coastguard Worker else 91*7eba2f3bSAndroid Build Coastguard Worker echo "Known crash: $SIG" 92*7eba2f3bSAndroid Build Coastguard Worker fi 93*7eba2f3bSAndroid Build Coastguard Worker 94*7eba2f3bSAndroid Build Coastguard Worker mv ./logs/fuzz.log ./logs/$SIG_DIR/run_$TS.log 95*7eba2f3bSAndroid Build Coastguard Worker adb pull $CRASH ./logs/$SIG_DIR/crash_$TS.bin >/dev/null 2>&1 96*7eba2f3bSAndroid Build Coastguard Worker adb rm $CRASH >/dev/null 2>&1 97*7eba2f3bSAndroid Build Coastguard Worker done 98*7eba2f3bSAndroid Build Coastguard Worker} 99*7eba2f3bSAndroid Build Coastguard Worker 100*7eba2f3bSAndroid Build Coastguard Workerfunction build() { 101*7eba2f3bSAndroid Build Coastguard Worker pushd $ANDROID_BUILD_TOP 102*7eba2f3bSAndroid Build Coastguard Worker SANITIZE_HOST="address" \ 103*7eba2f3bSAndroid Build Coastguard Worker SANITIZE_TARGET="hwaddress fuzzer" \ 104*7eba2f3bSAndroid Build Coastguard Worker NATIVE_COVERAGE="true" \ 105*7eba2f3bSAndroid Build Coastguard Worker NATIVE_COVERAGE_PATHS="system/nfc/src" \ 106*7eba2f3bSAndroid Build Coastguard Worker make -j $FUZZER_NAME 107*7eba2f3bSAndroid Build Coastguard Worker popd 108*7eba2f3bSAndroid Build Coastguard Worker adb shell mkdir -p /$FUZZ_DIR 109*7eba2f3bSAndroid Build Coastguard Worker adb push $OUT/symbols/$FUZZ_DIR/$FUZZER_NAME /$FUZZ_DIR/ 110*7eba2f3bSAndroid Build Coastguard Worker} 111*7eba2f3bSAndroid Build Coastguard Worker 112*7eba2f3bSAndroid Build Coastguard Workerfunction run() { 113*7eba2f3bSAndroid Build Coastguard Worker if [ "$1" == "--once" ]; 114*7eba2f3bSAndroid Build Coastguard Worker then 115*7eba2f3bSAndroid Build Coastguard Worker shift 116*7eba2f3bSAndroid Build Coastguard Worker run_once $@ 117*7eba2f3bSAndroid Build Coastguard Worker else 118*7eba2f3bSAndroid Build Coastguard Worker echo "fuzzing..." 119*7eba2f3bSAndroid Build Coastguard Worker run_fuzz $@ 120*7eba2f3bSAndroid Build Coastguard Worker fi 121*7eba2f3bSAndroid Build Coastguard Worker} 122*7eba2f3bSAndroid Build Coastguard Worker 123*7eba2f3bSAndroid Build Coastguard Workerfunction debug() { 124*7eba2f3bSAndroid Build Coastguard Worker if [ -z "$1" ]; 125*7eba2f3bSAndroid Build Coastguard Worker then 126*7eba2f3bSAndroid Build Coastguard Worker echo "Which payload?" 127*7eba2f3bSAndroid Build Coastguard Worker exit 128*7eba2f3bSAndroid Build Coastguard Worker fi 129*7eba2f3bSAndroid Build Coastguard Worker 130*7eba2f3bSAndroid Build Coastguard Worker FUZZ_PAYLOAD=$1 131*7eba2f3bSAndroid Build Coastguard Worker 132*7eba2f3bSAndroid Build Coastguard Worker adb forward tcp:5039 tcp:5039 133*7eba2f3bSAndroid Build Coastguard Worker adb shell LD_LIBRARY_PATH=/system/lib64/vndk-29 gdbserver64 remote:5039 /$FUZZ_DIR/$FUZZER_NAME $FUZZ_OPTIONS $FUZZ_PAYLOAD 2>&1 >/dev/null& 134*7eba2f3bSAndroid Build Coastguard Worker sleep 5 135*7eba2f3bSAndroid Build Coastguard Worker $ANDROID_BUILD_TOP/prebuilts/gdb/linux-x86/bin/gdb --directory=$ANDROID_BUILD_TOP -ex "target remote:5039" 136*7eba2f3bSAndroid Build Coastguard Worker} 137*7eba2f3bSAndroid Build Coastguard Worker 138*7eba2f3bSAndroid Build Coastguard Workerfunction get_cov() { 139*7eba2f3bSAndroid Build Coastguard Worker mkdir -p ./coverage && adb pull /$FUZZ_DIR/gcov/0/out/soong ./coverage 140*7eba2f3bSAndroid Build Coastguard Worker unzip -o $OUT/coverage/$FUZZ_DIR/$FUZZER_NAME.zip -d ./coverage 141*7eba2f3bSAndroid Build Coastguard Worker lcov --directory ./coverage --base-directory $ANDROID_BUILD_TOP --gcov-tool $(pwd)/../llvm-gcov --capture -o ./coverage/cov.info 142*7eba2f3bSAndroid Build Coastguard Worker TS=`date +"%m-%d-%Y-%H-%M-%S"` 143*7eba2f3bSAndroid Build Coastguard Worker genhtml ./coverage/cov.info -o ./coverage/report_$TS 144*7eba2f3bSAndroid Build Coastguard Worker xdg-open ./coverage/report_$TS/index.html 145*7eba2f3bSAndroid Build Coastguard Worker} 146*7eba2f3bSAndroid Build Coastguard Worker 147*7eba2f3bSAndroid Build Coastguard Workerfunction fuzz() { 148*7eba2f3bSAndroid Build Coastguard Worker init 149*7eba2f3bSAndroid Build Coastguard Worker action=$1 150*7eba2f3bSAndroid Build Coastguard Worker shift 151*7eba2f3bSAndroid Build Coastguard Worker 152*7eba2f3bSAndroid Build Coastguard Worker case "$action" in 153*7eba2f3bSAndroid Build Coastguard Worker run) 154*7eba2f3bSAndroid Build Coastguard Worker run $@ 155*7eba2f3bSAndroid Build Coastguard Worker ;; 156*7eba2f3bSAndroid Build Coastguard Worker build) 157*7eba2f3bSAndroid Build Coastguard Worker build $@ 158*7eba2f3bSAndroid Build Coastguard Worker ;; 159*7eba2f3bSAndroid Build Coastguard Worker debug) 160*7eba2f3bSAndroid Build Coastguard Worker debug $@ 161*7eba2f3bSAndroid Build Coastguard Worker ;; 162*7eba2f3bSAndroid Build Coastguard Worker gcov) 163*7eba2f3bSAndroid Build Coastguard Worker get_cov $@ 164*7eba2f3bSAndroid Build Coastguard Worker ;; 165*7eba2f3bSAndroid Build Coastguard Worker *) 166*7eba2f3bSAndroid Build Coastguard Worker echo "Usage: $0 {run|build|debug|gcov}" 167*7eba2f3bSAndroid Build Coastguard Worker exit 1 168*7eba2f3bSAndroid Build Coastguard Worker esac 169*7eba2f3bSAndroid Build Coastguard Worker} 170*7eba2f3bSAndroid Build Coastguard Worker 171*7eba2f3bSAndroid Build Coastguard Workerif [ "$0" == "${BASH_SOURCE[0]}" ]; 172*7eba2f3bSAndroid Build Coastguard Workerthen 173*7eba2f3bSAndroid Build Coastguard Worker fuzz $@ 174*7eba2f3bSAndroid Build Coastguard Workerfi 175*7eba2f3bSAndroid Build Coastguard Worker 176