diff --git a/.gitattributes b/.gitattributes index 800e5a816563a51c7eeafbc5c0ecca07642f3383..7b62fb5202a3ae606d0ca6e5379575d004189c3c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -376,6 +376,7 @@ tools/do_concolic.sh -text tools/do_idapro.sh -text tools/do_integertransform.sh -text tools/do_makepeasoupbinary.sh -text +tools/do_manual_cover.sh -text tools/do_manualtests.sh -text tools/do_p1transform.sh -text tools/generate_exe.sh -text @@ -383,6 +384,7 @@ tools/generate_io_baseline.sh -text tools/getlibs.sh -text tools/getsyms.sh -text tools/libc_functions.txt -text +tools/manual_cover.sh -text tools/manual_test_import.sh -text tools/p1xform.filter.deprecated.sh -text tools/p1xform.pbed.deprecated.sh -text diff --git a/tools/cover.sh b/tools/cover.sh index 60d15e6f15d749eb8ad1190f9789168544e7428d..e2893c7298d8d6a1f2a792cae520d7ca2deb1598 100755 --- a/tools/cover.sh +++ b/tools/cover.sh @@ -11,9 +11,10 @@ FILTER_FILE=$4 # list of known functions to blacklist, e.g # outputs OUTPUT_COVERAGE_FILE=$5 # output file with coverage info per function OUTPUT_BLACKLIST_FILE=$6 # output file with list of functions to blacklist - # other -#CANDIDATE_FNS_PRE_FILTER=$P1_DIR/p1.candidates.prelibc + + +CANDIDATE_FNS_PRE_LIBC=`dirname $6`/p1.candidates.prelibc # # Prune out functions that do not have sufficient coverage @@ -32,8 +33,8 @@ if [ ! -f $OUTPUT_COVERAGE_FILE ]; then return 1 fi -#grep -v "0\.0" $OUTPUT_COVERAGE_FILE | cut -f1 -d" " > $CANDIDATE_FNS_PRE_LIBC -grep "0\.0" $OUTPUT_COVERAGE_FILE | cut -f1 -d" " > $OUTPUT_BLACKLIST_FILE +grep -v "0\.000" $OUTPUT_COVERAGE_FILE | cut -f1 -d" " > $CANDIDATE_FNS_PRE_LIBC +grep "0\.000" $OUTPUT_COVERAGE_FILE | cut -f1 -d" " > $OUTPUT_BLACKLIST_FILE # Filter out functions that: # 1. are not sufficiently covered @@ -41,6 +42,5 @@ grep "0\.0" $OUTPUT_COVERAGE_FILE | cut -f1 -d" " > $OUTPUT_BLACKLIST_FILE cat $FILTER_FILE >> $OUTPUT_BLACKLIST_FILE sort $OUTPUT_BLACKLIST_FILE | uniq > tmp.$$ mv tmp.$$ $OUTPUT_BLACKLIST_FILE -rm tmp.$$ return 0 diff --git a/tools/do_manual_cover.sh b/tools/do_manual_cover.sh new file mode 100755 index 0000000000000000000000000000000000000000..0eeb39c3cde689dfd3f53afd5e023c35f2b7f84e --- /dev/null +++ b/tools/do_manual_cover.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +# +# Generate coverage information for each manual test +# Aggregate all coverage into one final file +# + +PEASOUP_DIR=`pwd` +MANUAL_TEST_DIR=$PEASOUP_DIR/manual_tests +COVER_SCRIPT=generate_cover_orig_cmd.sh +AGGREGATE_COVERAGE=$PEASOUP_DIR/manual_coverage.txt # final output file + +ls $MANUAL_TEST_DIR/* >/dev/null 2>/dev/null +if [ ! $? -eq 0 ]; then + echo "do_manual_cover.sh: error: no manual test specifications found -- exiting" + exit 1 +fi + +touch $AGGREGATE_COVERAGE + +for testname in `ls $MANUAL_TEST_DIR` +do + echo "do moi: $MANUAL_TEST_DIR/$testname/spec/$COVER_SCRIPT" + $MANUAL_TEST_DIR/$testname/spec/$COVER_SCRIPT + cat $MANUAL_TEST_DIR/$testname/spec/coverage/executed_addresses.txt >> $AGGREGATE_COVERAGE +done + +sort $AGGREGATE_COVERAGE | uniq > tmp.$$ +mv tmp.$$ $AGGREGATE_COVERAGE + +exit 0 diff --git a/tools/do_p1transform.sh b/tools/do_p1transform.sh index 4dc3ae9cf03167eca1747bd105b70c095a3a2355..273f9324867b591342d111f4dc9780e2626dd200 100755 --- a/tools/do_p1transform.sh +++ b/tools/do_p1transform.sh @@ -16,13 +16,24 @@ echo "P1: transforming binary: cloneid=$CLONE_ID bed_script=$BED_SCRIPT" # configuration variables P1_DIR=p1.xform EXECUTED_ADDRESSES=concolic.files_a.stratafied_0001/executed_address_list.txt +EXECUTED_ADDRESSES_MANUAL=manual_coverage.txt +EXECUTED_ADDRESSES_FINAL=final.coverage.txt LIBC_FILTER=$PEASOUP_HOME/tools/libc_functions.txt BLACK_LIST=$P1_DIR/p1.filtered_out # list of functions to blacklist COVERAGE_FILE=$P1_DIR/p1.coverage mkdir $P1_DIR -$PEASOUP_HOME/tools/cover.sh $ORIGINAL_BINARY $MEDS_ANNOTATION_FILE $EXECUTED_ADDRESSES $LIBC_FILTER $COVERAGE_FILE $BLACK_LIST +# generate coverage info for manually-specified tests +$PEASOUP_HOME/tools/do_manual_cover.sh + +# merge all execution traces +touch $EXECUTED_ADDRESSES_FINAL +cat $EXECUTED_ADDRESSES_MANUAL >> $EXECUTED_ADDRESSES_FINAL +cat $EXECUTED_ADDRESSES >> $EXECUTED_ADDRESSES_FINAL + +$PEASOUP_HOME/tools/cover.sh $ORIGINAL_BINARY $MEDS_ANNOTATION_FILE $EXECUTED_ADDRESSES_FINAL $LIBC_FILTER $COVERAGE_FILE $BLACK_LIST + if [ $? -eq 0 ]; then if [ -f $COVERAGE_FILE ]; then echo "P1: issuing command: $SECURITY_TRANSFORMS_HOME/tools/transforms/p1transform.exe $cloneid $BLACK_LIST" diff --git a/tools/manual_cover.sh b/tools/manual_cover.sh new file mode 100755 index 0000000000000000000000000000000000000000..7f54078484e7ed3aed160975e52bac133f5fe65f --- /dev/null +++ b/tools/manual_cover.sh @@ -0,0 +1,22 @@ +# Coverage tool for manual tests +# +# Usage: +# manual_cover.sh <coverageOutputFile> -- cmd arg1 .. argn +# +# Example: +# manual_cover.sh test1.executed_addresses.txt -- ls -lt . + +# If you don't have a coverage tool: uncomment below +# exit 1 + +# Otherwise, compute coverage below +OUTPUT_FILE=$1 +shift +shift + +FULL_COMMAND=$* + +# We use pin for extracting coverage info +$PEASOUP_HOME/tools/pin/pin -t $PEASOUP_HOME/tools/pin/itraceunique.so -- $FULL_COMMAND + +cat itrace.out | grep -v eof > $OUTPUT_FILE diff --git a/tools/manual_test_import.sh b/tools/manual_test_import.sh index 89f8801f2ef01a3201b4d71ef4fe95708d3e8ddf..491c6399cb16b7f2468c84697b85674300230b0b 100755 --- a/tools/manual_test_import.sh +++ b/tools/manual_test_import.sh @@ -17,7 +17,7 @@ INFILES="" OUTFILES="" -NAME="" +TEST_NAME="" while [ $# -gt 0 ] do case "$1" in @@ -25,13 +25,13 @@ do "--prog") PROG=$2; shift;; "--infile") INFILES="$2 $INFILES"; shift;; "--outfile") OUTFILES="$2 $OUTFILES"; shift;; - "--name") NAME=$2; shift;; + "--name") TEST_NAME=$2; shift;; *) break;; esac shift done -echo "NAME = $NAME" +echo "TEST_NAME = $TEST_NAME" echo "INFILES = $INFILES" echo "OUTFILES = $OUTFILES" echo "PROG = $PROG" @@ -51,14 +51,18 @@ echo "CMD = $CMD" # setup test directory PWD=`pwd` -if [ -z $NAME ]; then +if [ -z $TEST_NAME ]; then TEST_DIR=${PWD}/manual_tests/test.$$ + TEST_NAME=test.$$ else - TEST_DIR=${PWD}/manual_tests/$NAME + TEST_DIR=${PWD}/manual_tests/$TEST_NAME fi TEST_SPEC_DIR=${TEST_DIR}/spec SPEC_INPUT_DIR=$TEST_SPEC_DIR/input SPEC_OUTPUT_DIR=$TEST_SPEC_DIR/output +TEST_ORIG_COVERAGE=$TEST_SPEC_DIR/coverage +TEST_ORIG_CMD_SCRIPT=$TEST_SPEC_DIR/generate_cover_orig_cmd.sh + TEST_DIR_XFORMED=$TEST_DIR/transformed TEST_XFORMED_CMD_SCRIPT=$TEST_DIR_XFORMED/test_new_cmd.sh TEST_XFORMED_OUTPUT_DIR=$TEST_DIR_XFORMED/output @@ -66,6 +70,7 @@ TEST_XFORMED_OUTPUT_DIR=$TEST_DIR_XFORMED/output mkdir -p $SPEC_INPUT_DIR mkdir -p $SPEC_OUTPUT_DIR mkdir -p $TEST_XFORMED_OUTPUT_DIR +mkdir -p $TEST_ORIG_COVERAGE # copy input files for i in $INFILES @@ -79,6 +84,35 @@ do cp $i $SPEC_OUTPUT_DIR done +#--------------------------------------- +# Original cmd/program +#--------------------------------------- +# +# create script to run original command with coverage info +# + +touch $TEST_ORIG_CMD_SCRIPT + +# cleanup input/output files +for i in $INFILES +do + echo " rm $i 2>/dev/null" >> $TEST_ORIG_CMD_SCRIPT +done + +for i in $OUTFILES +do + echo " rm $i 2>/dev/null" >> $TEST_ORIG_CMD_SCRIPT + echo " rm $TEST_ORIG_OUTPUT_DIR/$i 2>/dev/null" >> $TEST_ORIG_CMD_SCRIPT +done + +# stage in input (if any) +for i in $INFILES +do + echo " cp $SPEC_INPUT_DIR/$i ." >> $TEST_ORIG_CMD_SCRIPT +done + +echo "\$PEASOUP_HOME/tools/manual_cover.sh $TEST_ORIG_COVERAGE/executed_addresses.txt -- $CMD" >> $TEST_ORIG_CMD_SCRIPT + #--------------------------------------- # Transformed cmd/program #--------------------------------------- @@ -123,4 +157,5 @@ chmod +x $TEST_XFORMED_CMD_SCRIPT cp $PEASOUP_HOME/tools/run_stratafied.tmpl.sh $TEST_DIR_XFORMED/$PROG chmod +x $TEST_DIR_XFORMED/$PROG +chmod +x $TEST_ORIG_CMD_SCRIPT