The slicer script make use of REVEN data tainting capabilities to display a list of instructions that manipulate tainted data.
It uses reven.Project.taint method to retrieve the list of execution Point which deal with tainted data and print them.
7 parser = argparse.ArgumentParser(description=
'Create a sliced trace based on some register taint propagation.')
8 parser.add_argument(
'--host', metavar=
'host', dest=
'host', help=
'the reven host', default=
"localhost")
9 parser.add_argument(
'--port', metavar=
'port', dest=
'port', type=int, help=
'the reven server port', default=13370)
10 parser.add_argument(
'-r', metavar=
'run', dest=
'run', help=
'the reven execution run name', default=
'Execution run')
11 parser.add_argument(
'-s', metavar=
'sequence', dest=
'sequence', type=int, help=
'the reven execution sequence', default=0)
12 parser.add_argument(
'-i', metavar=
'instruction', dest=
'instruction', type=int, help=
'the reven execution instruction', default=0)
13 parser.add_argument(
'-b', dest=
'backward', action=
'store_true', help=
'taint in backward direction')
15 parser.add_argument(metavar=
'registers', dest=
'registers', help=
'name of the registers to taint', nargs=
'+')
17 args = parser.parse_args()
21 if __name__ ==
'__main__':
27 p = reven.Project(args.host, args.port)
33 start_point = t.point(args.sequence, args.instruction)
38 stop_point = t.point(0)
41 stop_point = t.point(t.sequence_count-1)
42 last_instruction = len(stop_point.basic_block) -1
43 stop_point = t.point(t.sequence_count-1, last_instruction)
47 syms = [ reven.SymbolicRegister(r, 4)
for r
in args.registers ]
50 result = p.taint(start_point, stop_point, syms, 5000)
53 for r
in sorted(result.keys()):
54 print "%d_%d - %-32s %s" % (r.sequence_index, r.instruction_index, r.symbol, r.instruction)