The slicer script make use of REVEN data tainting capabilities to display a list of instructions that manipulate tainted data.
6 def query_connection():
8 host = raw_input(
'Enter the reven host [localhost]: ')
13 port = int(raw_input(
'Enter the reven port [13370]: '))
18 rvn = reven.reven_connection(host, port)
20 print(
"[!] Reven not found on port %d" % port)
23 print(
"[+] Connected to reven on %s:%d" % (host, port))
28 def query_taint_range(rvn):
29 runs = rvn.run_get_all()
32 sys.stderr.write(
"[!] No run detected.\n")
39 start_sequence = int(raw_input(
"Enter the initial sequence [0]: "))
44 start_instruction = int(raw_input(
"Enter the initial instruction [0]: "))
49 stop_sequence = int(raw_input(
"Enter the ending sequence [1]: "))
55 start_point = reven.execution_point(run, start_sequence, start_instruction)
56 stop_point = reven.execution_point(run, stop_sequence, stop_instruction)
58 return start_point, stop_point
60 def query_initial_taint(rvn, point):
62 reg = raw_input(
"Enter the initialy tainted register [eax]: ")
67 register_tainted = [reg]
71 first_memory_tainted = reven.logical_address(0,0)
72 last_memory_tainted = reven.logical_address(0,0)
74 initial_taint = reven.vector_of_symbolic()
77 for sym
in register_tainted:
78 smem = reven.symbolic()
80 smem.type = reven.symbolic_type.register_all_purpose
81 initial_taint.append(smem)
85 segment = first_memory_tainted.segment
86 for offset
in range(first_memory_tainted.offset, last_memory_tainted.offset):
87 smem = reven.symbolic()
89 smem.name =
"0x%x:0x%x" % (segment, offset)
90 smem.type = reven.symbolic_type.memory_physical
91 smem.physical_address = rvn.memory_get_physical_address(point, reven.logical_address(segment, offset))
94 initial_taint.append(smem)
98 def propagate(rvn, start_point, stop_point, initial_taint):
101 print "[*] Tainting ..."
103 tainted_points = rvn.run_search_tainted_instructions(start_point, stop_point, runtime, initial_taint,
False)
105 print(
"[*] Tracking ")
106 for i
in initial_taint:
107 print(
"%s, " % (i.name),
'',
None)
108 print(
"from #%d:%d to #%d:%d" % (start_point.sequence_identifier,
109 start_point.instruction_index,
110 stop_point.sequence_identifier,
112 print(
"-----------------------------------------------\n")
114 return tainted_points
116 def print_sliced_trace(rvn, tainted_points):
118 for entry
in tainted_points:
122 if not len(v.new)
and not len(v.old):
127 sequences = rvn.run_get_instructions_range(reven.execution_range(k.run_name, k.sequence_identifier, 1, 0))
129 ins = seq.instructions[k.instruction_index]
133 if ins.prefixes: mnemonic =
"%s " % ins.prefixes
134 mnemonic += ins.mnemonic
135 if ins.operand_one: mnemonic +=
" " + ins.operand_one
136 if ins.operand_two: mnemonic +=
", " + ins.operand_two
137 if ins.operand_three: mnemonic +=
", " + ins.operand_three
139 symbol =
"%s+%x" % (seq.sequence.symbol.name, seq.sequence.symbol.offset)
140 print(
"%-32s: #%d_%d: %s" % (symbol, k.sequence_identifier, k.instruction_index, mnemonic))
142 if __name__ ==
'__main__':
145 rvn = query_connection()
148 start_point, stop_point = query_taint_range(rvn)
151 initial_taint = query_initial_taint(rvn, start_point)
154 result = propagate(rvn, start_point, stop_point, initial_taint)
157 print_sliced_trace(rvn, result)