diff --git a/.classpath b/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..3619eebd8f32ce5db84985ce4f1bbba1a062cfe5 --- /dev/null +++ b/.classpath @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="src" path="fuzzer"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/.gitignore b/.gitignore index da4e5096bd577df638bf72903f197dcf88b4e5e2..28be01149450e46d14429d08b01b2d8bcc7ed80c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *~ \#* +/bin/ diff --git a/.project b/.project new file mode 100644 index 0000000000000000000000000000000000000000..0a1317d4d593bfcf8b41808291ee5b84bb378cb3 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>swen90006-a2-2018</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/fuzzer/Fuzzer.java b/fuzzer/Fuzzer.java index 85ffea567160a985f7b4301d5f92af4f8c4c58a1..eeec1375e2bc9a1a2d7c863b62f9a23bffeb500f 100644 --- a/fuzzer/Fuzzer.java +++ b/fuzzer/Fuzzer.java @@ -1,58 +1,26 @@ import java.io.IOException; import java.io.FileOutputStream; import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; /* a stub for your team's fuzzer */ public class Fuzzer { private static final String OUTPUT_FILE = "fuzz.s"; - + private static final List<String> validOpcodes = new ArrayList<String>(Arrays.asList("ADD","SUB","MUL","DIV","RET","LDR","STR","MOV","JMP","JZ")); + private static final int maxRegistry = 32; + private static final int maxMemory = 65536; public static void main(String[] args) throws IOException { FileOutputStream out = null; PrintWriter pw = null; try { out = new FileOutputStream(OUTPUT_FILE); pw = new PrintWriter(out); - - /* - - */ - /* 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("MOV R1 1"); - pw.println("MOV R2 10"); - - for(int x=0;x<300;x++){ - pw.println("ADD R1 R1 R2"); - }*/ - /*pw.println("MOV R1 65535"); - pw.println("LDR R0 R1 0");*/ - - pw.println("RET R-1"); - - - /*pw.print("RET R0"); - for(int x=0;x<2000;x++){ - pw.print("a"); - }*/ - - - /*pw.println("ADD R0 R1 R2"); - pw.println("ADD R3 R4 R5"); - pw.println("ADD R6 R7 R8"); - pw.println("ADD R9 R10 R11"); - pw.println("ADD R12 R13 R14"); - pw.println("ADD R15 R16 R17"); - pw.println("ADD R18 R19 R20"); - pw.println("ADD R21 R0 R3"); - pw.println("ADD R22 R6 R9"); - pw.println("ADD R23 R12 R15"); - pw.println("ADD R24 R18 R21"); - pw.println("ADD R25 R22 R23"); - pw.println("ADD R26 R24 R25"); - pw.println("RET R26");*/ + Random rg = new Random(); }catch (Exception e){ @@ -68,5 +36,135 @@ public class Fuzzer { } } + public String generateMemoryOverflow() { + return null; + } + public String generateMemoryUnderflow() { + return null; + } + public String generateRegOverflow() { + return null; + } + public String generateRegUnderflow() { + return null; + } + public String generateLineOverFlow() { + return null; + } + public String generateInstructionOverflow() { + return null; + } + public String generateDivideByZero(){ + return null; + } + public String generateDirtyRegistyRead() { + return null; + } + public String generateDirtyMemoryRead() { + return null; + } + + public String jmpOverflow() { + return null; + } + public String jmpUnderflow() { + return null; + } + public String jzOverflow() { + return null; + } + public String jzUnderflow() { + return null; + } + public String intOverflow() { + return null; + } + public String intUnderflow() { + return null; + } + public String generateInvalidString() { + return null; + } + public String generateInstructionComment() { + return null; + } + public String generateValidString(Random rg,int programLength,int lineNumber){ + int index = rg.nextInt(validOpcodes.size()); + String opcode = validOpcodes.get(index); + int numregs = 0; + Integer offset = null; + String line = new String(); + switch(opcode){ + case("ADD"): + numregs = 3; + break; + case("SUB"): + numregs = 3; + break; + case("MUL"): + numregs = 3; + break; + case("DIV"): + numregs = 3; + break; + case("RET"): + numregs = 1; + break; + case("LDR"): + numregs = 2; + offset = (rg.nextInt(2*maxMemory))-maxMemory; + break; + case("STR"): + //special case - form <REGISTER VALUE REGISTER> + offset = (rg.nextInt(2*maxMemory))-maxMemory; + line.concat(opcode); + line.concat(" R"+rg.nextInt(maxRegistry)); + line.concat(" "+offset); + line.concat(" R"+rg.nextInt(maxRegistry)); + return line; + case("MOV"): + numregs = 1; + offset = rg.nextInt(); + Boolean positive = rg.nextBoolean(); + if(!positive) { + offset = -offset; + } + break; + case("JMP"): + //special case - avoid looping infinitly + numregs = 0; + offset = (rg.nextInt(programLength)); + offset = offset - lineNumber; + if(offset<0) { + offset = offset-1; + line.concat("JMP 2%n"); + } else if(offset == 0) { + offset = offset+1; + } + + break; + case("JZ"): + //special case - avoid looping infinitly + numregs = 1; + offset = (rg.nextInt(programLength)); + offset = offset - lineNumber; + if(offset<0) { + offset = offset-1; + line.concat("JMP 2%n"); + } else if(offset == 0) { + offset = offset+1; + } + break; + } + line.concat(opcode); + int x; + for(x=0;x<numregs;x++){ + line.concat(" R"+rg.nextInt(maxRegistry)); + } + if(offset!=null){ + line.concat(" "+offset); + } + return line; + } } diff --git a/src/pocs/poc1.s b/src/pocs/poc1.s index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..78bbe65f5fd3b229dda97f7f65250107bebc5fd6 100644 --- a/src/pocs/poc1.s +++ b/src/pocs/poc1.s @@ -0,0 +1 @@ +RET R0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ No newline at end of file diff --git a/src/pocs/poc3.s b/src/pocs/poc3.s index 29f75bd4b674892ac28200902d10eabb9754721d..8469c095a4c35c5656116ce51ea92be053fe2aef 100644 --- a/src/pocs/poc3.s +++ b/src/pocs/poc3.s @@ -1,3 +1 @@ - pw.println("MOV R1 1"); - pw.println("LDR R0 R1 65535"); - pw.println("RET R0"); \ No newline at end of file +RET R-1 \ No newline at end of file