diff --git a/fuzzer/Fuzzer.java b/fuzzer/Fuzzer.java index 9394bf8fd81a260984d87d9fe1aa3f3ef35fd4de..4eb8cab66cbffb428329b23d1e5d692be4778e0d 100644 --- a/fuzzer/Fuzzer.java +++ b/fuzzer/Fuzzer.java @@ -1,17 +1,25 @@ import java.io.IOException; import java.io.FileOutputStream; import java.io.PrintWriter; - +import java.util.ArrayList; +import java.util.Random; /* a stub for your team's fuzzer */ public class Fuzzer { private static final String OUTPUT_FILE = "fuzz.txt"; + private static final String CHAR_LOWER = "abcdefghijklmnopqrstuvwxyz"; + private static final String CHAR_UPPER = CHAR_LOWER.toUpperCase(); + private static final String NUMBER = "0123456789"; + + private static final String DATA_FOR_RANDOM_STRING = CHAR_LOWER + CHAR_UPPER + NUMBER; public static void main(String[] args) throws IOException { System.out.println(Instruction.getBNF()); FileOutputStream out = null; PrintWriter pw = null; + ArrayList<String> inputs = new ArrayList<String>(); + try { out = new FileOutputStream(OUTPUT_FILE); pw = new PrintWriter(out); @@ -19,7 +27,22 @@ public class Fuzzer { /* We just print one instruction. Hint: you might want to make use of the instruction grammar which is effectively encoded in Instruction.java */ - pw.println("list"); + + /**Using generation-based fuzzing and Instruction.java, + * create random, valid inputs*/ + //Indicates the number of inputs we wish to generate + int numInputs = 10; + + for(int i=0; i<numInputs; i++) { + String input = generateValidInputs(); + //only add the input if it hasn't already been generated + if(inputAlreadyGenerated(input, inputs)) { + i--; + }else { + inputs.add(input); + pw.println(input); + } + } }catch (Exception e){ e.printStackTrace(System.err); @@ -34,5 +57,66 @@ public class Fuzzer { } } + + /**Generates random, valid inputs based on Instruction.java*/ + public static String generateValidInputs() { + int maxStringLength = 100; + + //add the instruction string + Instruction inst = getRandomInstruction(); + String input = inst.getOpcode(); + + //add the operands + for (OperandType op : inst.getOperands()){ + if(op.equals(OperandType.STRING)) { + input += " "+generateRandomString(maxStringLength); + } + } + //debug + //System.out.println(input); + + return input; + } + + /**Selects a random instruction*/ + public static Instruction getRandomInstruction() { + Instruction[] INSTS = Instruction.values(); + int index = new Random().nextInt(INSTS.length); + return INSTS[index]; + } + + /**Generates a random string. + * Sourced from: https://www.mkyong.com/java/java-how-to-generate-a-random-string/ + * and modified*/ + public static String generateRandomString(int maxlength) { + if (maxlength < 1) throw new IllegalArgumentException(); + + int length = new Random().nextInt(maxlength)+1; + + StringBuilder sb = new StringBuilder(length); + for (int i = 0; i < length; i++) { + + // 0-62 (exclusive), random returns 0-61 + int rndCharAt = new Random().nextInt(DATA_FOR_RANDOM_STRING.length()); + char rndChar = DATA_FOR_RANDOM_STRING.charAt(rndCharAt); + + sb.append(rndChar); + + } + + return sb.toString(); + + } + + /**Checks whether the input has already been generated*/ + public static boolean inputAlreadyGenerated(String newInput, ArrayList<String> inputs) { + for(String input:inputs) { + if(input.equals(newInput)) { + return true; + } + } + + return false; + } }