diff --git a/fuzzer/Fuzzer.java b/fuzzer/Fuzzer.java index 1fc8dbebd1207a7fd030df1f221da6bc3a59eb5d..9ae09334c63f1fe2deecc2e5dd0463e730ca375b 100644 --- a/fuzzer/Fuzzer.java +++ b/fuzzer/Fuzzer.java @@ -1,25 +1,31 @@ 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); - - pw.println("RET R0"); - - }catch (Exception e){ + Random rg = new Random(); + + + }catch (Exception e){s e.printStackTrace(System.err); - System.exit(1); + System.exit(1); }finally{ if (pw != null){ pw.flush(); @@ -30,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/machine-vuln1.c b/src/machine-vuln1.c index 916c9f6ed43469855e6f477af7110dec840c9726..aada30dc82ae029b2401c1ecd9af677ab6e49d70 100644 --- a/src/machine-vuln1.c +++ b/src/machine-vuln1.c @@ -55,10 +55,12 @@ unsigned int count = 0; /* counts number of instructions executed so far */ static void machine_init(void){ - memory = malloc(sizeof(int32_t)*MEMORY_SIZE); + memory = malloc(sizeof(int32_t)*(MEMORY_SIZE)); regs = malloc(sizeof(int32_t)*NUM_REGS); - memset(memory,0,sizeof(int32_t)*MEMORY_SIZE); - memset(regs,0,sizeof(int32_t)*NUM_REGS); + + /* memset can be vulnerable - changes to this can result in dirty memory to be read*/ + memset(memory,0,sizeof(int32_t)*(MEMORY_SIZE)); + memset(regs,0,sizeof(int32_t)*NUM_REGS); count = 0; } @@ -437,7 +439,8 @@ static int read_program(const char *filename){ int instructionCount = 0; while (instructionCount < MAX_INSTRUCTIONS){ - char * res = fgets(program[instructionCount],MAX_LINE_LENGTH+2,f); + /*VULN*/ + char * res = fgets(program[instructionCount],(MAX_LINE_LENGTH+2)*2,f); if (res == NULL){ if (feof(f)){ /* end of file */ @@ -449,14 +452,14 @@ static int read_program(const char *filename){ return -1; } } - if (program[instructionCount][MAX_LINE_LENGTH] != '\0'){ + /*if (program[instructionCount][MAX_LINE_LENGTH] != '\0'){ if (!(program[instructionCount][MAX_LINE_LENGTH] == '\n' && program[instructionCount][MAX_LINE_LENGTH+1] == '\0')){ debug_printf("Line %d exceeds maximum length (%d)\n",instructionCount+1,MAX_LINE_LENGTH); debug_printf("(Expected at array index %d to find NUL but found '%c' (%d))\n",MAX_LINE_LENGTH,program[instructionCount][MAX_LINE_LENGTH],program[instructionCount][MAX_LINE_LENGTH]); fclose(f); return -1; } - }else{ + }else{*/ /* program[instructionCount][MAX_LINE_LENGTH] == '\0', so strlen is guaranteed to be <= MAX_LINE_LENGTH Check if it has a newline and add it if it needs it */ @@ -467,7 +470,7 @@ static int read_program(const char *filename){ program[instructionCount][len+1] = '\0'; } } - } + /*}*/ instructionCount++; } diff --git a/src/machine-vuln2.c b/src/machine-vuln2.c index 916c9f6ed43469855e6f477af7110dec840c9726..55dfe440bc1c743e8c437793c316db3f4a932dba 100644 --- a/src/machine-vuln2.c +++ b/src/machine-vuln2.c @@ -86,12 +86,12 @@ static void do_mult(unsigned int dest, unsigned int src1, unsigned int src2) /* returns 0 on success, nonzero on failure */ static int do_div(unsigned int dest, unsigned int src1, unsigned int src2) { - if (regs[src2] == 0){ - return -1; - }else{ + //if (regs[src2] == 0){ + //return -1; + //}else{ regs[dest] = regs[src1] / regs[src2]; return 0; - } + //} } /* returns 0 on success, nonzero on failure */ diff --git a/src/machine-vuln3.c b/src/machine-vuln3.c index 916c9f6ed43469855e6f477af7110dec840c9726..cdad31ece6b49af8a8ab3bc4f3f205d7cc53d4dc 100644 --- a/src/machine-vuln3.c +++ b/src/machine-vuln3.c @@ -38,7 +38,7 @@ const char INSTRUCTION_JUMP[] = "jmp"; const char INSTRUCTION_JZ[] = "jz"; #define NUM_REGS 32 -#define MAX_REG (NUM_REGS - 1) +#define MAX_REG (NUM_REGS-1) #define MEMORY_SIZE 65536 /* 4 x as much memory as a 64 */ #define MAX_ADDR (MEMORY_SIZE-1) @@ -126,7 +126,7 @@ static void do_move(unsigned int rd, int32_t val){ regs[rd] = val; } -#define valid_reg(reg) (reg >= 0 && reg <= MAX_REG) +#define valid_reg(reg) (reg <= MAX_REG) /* returns 0 on success, nonzero on failure. puts register number into 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/poc2.s b/src/pocs/poc2.s index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..99b5a2436a201b5049d9f7cb8297907780386925 100644 --- a/src/pocs/poc2.s +++ b/src/pocs/poc2.s @@ -0,0 +1,4 @@ +MOV R0 0 +MOV R1 1 +DIV R2 R1 R0 +RET R2 diff --git a/src/pocs/poc3.s b/src/pocs/poc3.s index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8469c095a4c35c5656116ce51ea92be053fe2aef 100644 --- a/src/pocs/poc3.s +++ b/src/pocs/poc3.s @@ -0,0 +1 @@ +RET R-1 \ No newline at end of file