def test_flp_01(self): """Simple use case test.""" faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "FLP", "1", "1" ]) self.assertEqual(b'\x01\x00\x03\x04\x05\x06\x07\x08', self.file_out.read())
def test_jmp_12(self, err): """Not a supported jump instruction at the given address (ARM).""" self.file_in.write(b'\x00\x01\x02\x03\x04\x05\x06\x07') self.file_in.flush() with self.assertRaises(SystemExit): faults_inject.main(["-i", self.file_in.name, "-o", self.file_out.name, "-a", "arm", "JMP", "0x0", "0x0"]) self.assertEqual('Unknow opcode at JMP address : 0x3\n', err.getvalue())
def test_jmp_07(self, err): """Target address outside of possible range.""" self.file_in.write(b'\x31\xc0\x31\xdb\x31\xc9\xeb\xfa\x31\xd2') self.file_in.flush() with self.assertRaises(SystemExit): faults_inject.main(["-i", self.file_in.name, "-o", self.file_out.name, "-a", "x86", "JMP", "0x6", "0x1000"]) self.assertEqual('Warning: Target outside the file\nTarget value out of range : 4088\n', err.getvalue())
def test_z1w_01(self, err): """Missing word size parameter.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "Z1W", "3" ]) self.assertEqual('Word size required when using Z1W\n', err.getvalue())
def test_jmp_08(self, err): """Not a number target address.""" self.file_in.write(b'\x31\xc0\x31\xdb\x31\xc9\xeb\xfa\x31\xd2') self.file_in.flush() with self.assertRaises(SystemExit): faults_inject.main(["-i", self.file_in.name, "-o", self.file_out.name, "-a", "x86", "JMP", "0x6", "abc"]) self.assertEqual('Invalid target for JMP : abc\n', err.getvalue())
def test_jcc_02(self): """Simple use case test (JNE rel16).""" self.file_in.write( b'\x31\xc0\x31\xdb\x31\xc9\x66\x0f\x85\xf9\xff\x31\xd2') self.file_in.flush() # 0: 31 c0 xor eax,eax # 2: 31 db xor ebx,ebx # 4: 31 c9 xor ecx,ecx # 6: 66 0f 85 f9 ff jne 0x4 # b: 31 d2 xor edx,edx faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-a", "x86", "JCC", "0x6", "0x0" ]) self.assertEqual( b'\x31\xc0\x31\xdb\x31\xc9\x66\x0f\x85\xf5\xff\x31\xd2', self.file_out.read()) # 0: 31 c0 xor eax,eax # 2: 31 db xor ebx,ebx # 4: 31 c9 xor ecx,ecx # 6: 66 0f 85 f5 ff jne 0x0 # b: 31 d2 xor edx,edx faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-a", "x86", "JCC", "0x7", "0x0" ]) self.file_out.seek(0) self.assertEqual( b'\x31\xc0\x31\xdb\x31\xc9\x66\x0f\x85\xf5\xff\x31\xd2', self.file_out.read())
def test_jmp_06(self, err): """Not a number jump address.""" self.file_in.write(b'\x00\x01\x02\x03\x04\x05\x06\x07') self.file_in.flush() with self.assertRaises(SystemExit): faults_inject.main(["-i", self.file_in.name, "-o", self.file_out.name, "-a", "x86", "JMP", "abc", "0x0"]) self.assertEqual('Wrong address format : abc\n', err.getvalue())
def test_jmp_11(self): """Simple use case test (ARM B instruction).""" self.file_in.write(b'\x07\x00\x00\xea') self.file_in.flush() # 0: ea 00 00 07 b 0x24 faults_inject.main(["-i", self.file_in.name, "-o", self.file_out.name, "-a", "arm", "JMP", "0x0", "0x2"]) self.assertEqual(b'\xfe\xff\xff\xea', self.file_out.read())
def test_jmp_10(self, err): """Not a supported jump instruction at the given address (after 0x66).""" self.file_in.write(b'\x66\xc0\x31\xdb\x31\xc9\xeb\xfa\x31\xd2') self.file_in.flush() with self.assertRaises(SystemExit): faults_inject.main(["-i", self.file_in.name, "-o", self.file_out.name, "-a", "x86", "JMP", "0x0", "0x0"]) self.assertEqual('Unknow opcode at JMP address : 0xc0\n', err.getvalue())
def test_z1b_04(self, err): """Not a number address.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "Z1B", "abc" ]) self.assertEqual('Wrong address format : abc\n', err.getvalue())
def test_nop_11(self, err): """Invalid range.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-a", "arm", "NOP", "10-3" ]) self.assertEqual('Address range empty : 10-3\n', err.getvalue())
def test_z1w_02(self): """Simple use case test.""" faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-w", "2", "Z1W", "3" ]) self.assertEqual(b'\x01\x02\x03\x00\x00\x06\x07\x08', self.file_out.read())
def test_z1w_11(self, err): """Invalid range.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-w", "2", "Z1W", "10--3" ]) self.assertEqual('Wrong address format : 10--3\n', err.getvalue())
def test_nop_01(self, err): """Missing arch.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "NOP", "3" ]) self.assertEqual('Architecture required when using NOP\n', err.getvalue())
def test_nop_08(self): """Simple use case test on a range.""" faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-a", "x86", "NOP", "1-3" ]) self.assertEqual(b'\x01\x90\x90\x90\x05\x06\x07\x08', self.file_out.read())
def test_nop_04(self, err): """Unsupported arch.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-a", "abc", "NOP", "3" ]) self.assertTrue("(choose from 'x86', 'arm')" in err.getvalue())
def test_nop_03(self): """Simple use case test.""" faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-a", "arm", "NOP", "3" ]) self.assertEqual(b'\x01\x02\x03\x00\xbf\x06\x07\x08', self.file_out.read())
def test_z1w_08(self): """Simple use case with a range.""" faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-w", "2", "Z1W", "1-6" ]) self.assertEqual(b'\x01\x00\x00\x00\x00\x00\x00\x08', self.file_out.read())
def test_z1b_02(self, err): """Negative address.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "Z1B", "-1" ]) self.assertEqual('Address outside file content : byte -0x1\n', err.getvalue())
def test_nop_12(self, err): """Invalid range.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-a", "arm", "NOP", "10-s" ]) self.assertEqual('Wrong address format : 10-s\n', err.getvalue())
def test_z1w_03(self, err): """Negative word size.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-w", "-1", "Z1W", "3" ]) self.assertEqual('Word size must be positive\n', err.getvalue())
def test_jmp_04(self): """Simple use case test (JMP rel32 first in the file).""" self.file_in.write(b'\xe9\x00\x00\x00\x00\x31\xd2') self.file_in.flush() # 0: e9 00 00 00 00 jmp 0x5 # 5: 31 d2 xor edx,edx faults_inject.main(["-i", self.file_in.name, "-o", self.file_out.name, "-a", "x86", "JMP", "0x0", "0x0"]) self.assertEqual(b'\xe9\xfb\xff\xff\xff\x31\xd2', self.file_out.read())
def test_other_01(self): """Reading two faults from a file.""" self.file_in.write(b'\x01\x02\x03\x04\x05\x06\x07\x08') self.file_in.flush() self.file_cmd.write(b'NOP 0x3\nNOP 0x5') self.file_cmd.flush() faults_inject.main(["-i", self.file_in.name, "-o", self.file_out.name, "-a", "x86", "-f", self.file_cmd.name]) self.assertEqual(b'\x01\x02\x03\x90\x05\x90\x07\x08', self.file_out.read())
def test_flp_07(self, err): """Not a number bit offset.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "FLP", "1", "abc" ]) self.assertEqual('Wrong significance format : abc\n', err.getvalue())
def test_nop_06(self, err): """Address outside the file.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-a", "arm", "NOP", "7" ]) self.assertEqual('Address outside file content : byte 0x8\n', err.getvalue())
def test_jcc_05(self, err): """Jump address outside the file.""" self.file_in.write(b'\x00\x01\x02\x03\x04\x05\x06\x07') self.file_in.flush() with self.assertRaises(Exception): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-a", "x86", "JCC", "0x1000", "0x0" ])
def test_z1w_04(self, err): """Giant word size that would require to write outside the file.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-w", "1000", "Z1W", "3" ]) self.assertEqual('Address outside file content : byte 0x8\n', err.getvalue())
def test_z1w_06(self, err): """Address outside the file.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "-w", "2", "Z1W", "1000" ]) self.assertEqual('Address outside file content : byte 0x3e8\n', err.getvalue())
def test_flp_03(self, err): """Out of the file byte offset.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "FLP", "1000", "1" ]) self.assertEqual('Address outside file content : byte 0x3e8\n', err.getvalue())
def test_flp_06(self, err): """Greater than 7 bit offset.""" with self.assertRaises(SystemExit): faults_inject.main([ "-i", self.file_in.name, "-o", self.file_out.name, "FLP", "1", "8" ]) self.assertEqual('Significance must be between 0 and 7 : 8\n', err.getvalue())