about summary refs log tree commit diff stats
path: root/example/expression/solve_condition_stp.py
diff options
context:
space:
mode:
Diffstat (limited to 'example/expression/solve_condition_stp.py')
-rw-r--r--example/expression/solve_condition_stp.py39
1 files changed, 21 insertions, 18 deletions
diff --git a/example/expression/solve_condition_stp.py b/example/expression/solve_condition_stp.py
index c79dd0b8..e0ab09da 100644
--- a/example/expression/solve_condition_stp.py
+++ b/example/expression/solve_condition_stp.py
@@ -1,8 +1,11 @@
+from __future__ import print_function
 import sys
 import subprocess
 from optparse import OptionParser
 from pdb import pm
 
+from future.utils import viewitems
+
 from miasm2.analysis.machine import Machine
 from miasm2.analysis.binary import Container
 from miasm2.expression.expression import ExprInt, ExprCond, ExprId, \
@@ -29,9 +32,9 @@ if not args:
 def emul_symb(ir_arch, ircfg, mdis, states_todo, states_done):
     while states_todo:
         addr, symbols, conds = states_todo.pop()
-        print '*' * 40, "addr", addr, '*' * 40
+        print('*' * 40, "addr", addr, '*' * 40)
         if (addr, symbols, conds) in states_done:
-            print 'Known state, skipping', addr
+            print('Known state, skipping', addr)
             continue
         states_done.add((addr, symbols, conds))
         symbexec = SymbolicExecutionEngine(ir_arch)
@@ -40,10 +43,10 @@ def emul_symb(ir_arch, ircfg, mdis, states_todo, states_done):
             del symbexec.symbols[ir_arch.pc]
         irblock = get_block(ir_arch, ircfg, mdis, addr)
 
-        print 'Run block:'
-        print irblock
+        print('Run block:')
+        print(irblock)
         addr = symbexec.eval_updt_irblock(irblock)
-        print 'Final state:'
+        print('Final state:')
         symbexec.dump(mems=False)
 
         assert addr is not None
@@ -55,16 +58,16 @@ def emul_symb(ir_arch, ircfg, mdis, states_todo, states_done):
             addr_b = expr_simp(symbexec.eval_expr(addr.replace_expr(cond_group_b), {}))
             if not (addr_a.is_int() or addr_a.is_loc() and
                     addr_b.is_int() or addr_b.is_loc()):
-                print str(addr_a), str(addr_b)
+                print(str(addr_a), str(addr_b))
                 raise ValueError("Unsupported condition")
             if isinstance(addr_a, ExprInt):
                 addr_a = int(addr_a.arg)
             if isinstance(addr_b, ExprInt):
                 addr_b = int(addr_b.arg)
-            states_todo.add((addr_a, symbexec.symbols.copy(), tuple(list(conds) + cond_group_a.items())))
-            states_todo.add((addr_b, symbexec.symbols.copy(), tuple(list(conds) + cond_group_b.items())))
+            states_todo.add((addr_a, symbexec.symbols.copy(), tuple(list(conds) + list(viewitems(cond_group_a)))))
+            states_todo.add((addr_b, symbexec.symbols.copy(), tuple(list(conds) + list(viewitems(cond_group_b)))))
         elif addr == ret_addr:
-            print 'Return address reached'
+            print('Return address reached')
             continue
         elif addr.is_int():
             addr = int(addr.arg)
@@ -81,7 +84,7 @@ if __name__ == '__main__':
 
     addr = int(options.address, 16)
 
-    cont = Container.from_stream(open(args[0]))
+    cont = Container.from_stream(open(args[0], 'rb'))
     mdis = machine.dis_engine(cont.bin_stream, loc_db=cont.loc_db)
     ir_arch = machine.ir(mdis.loc_db)
     ircfg = ir_arch.new_ircfg()
@@ -120,7 +123,7 @@ if __name__ == '__main__':
     for instr in block.lines:
         for i, arg in enumerate(instr.args):
             instr.args[i]= arg.replace_expr(fix_args)
-    print block
+    print(block)
 
     # add fake address and len to parsed instructions
     ir_arch.add_asmblock_to_ircfg(block, ircfg)
@@ -139,12 +142,12 @@ if __name__ == '__main__':
 
     all_info = []
 
-    print '*' * 40, 'conditions to match', '*' * 40
-    for addr, symbols, conds in sorted(states_done):
-        print '*' * 40, addr, '*' * 40
+    print('*' * 40, 'conditions to match', '*' * 40)
+    for addr, symbols, conds in sorted(states_done, key=str):
+        print('*' * 40, addr, '*' * 40)
         reqs = []
         for k, v in conds:
-            print k, v
+            print(k, v)
             reqs.append((k, v))
         all_info.append((addr, reqs))
 
@@ -179,14 +182,14 @@ if __name__ == '__main__':
                                              "-p", '--SMTLIB2',
                                              "out.dot"])
         except OSError:
-            print "Cannot find stp binary!"
+            print("Cannot find stp binary!")
             break
         for c in cases.split('\n'):
             if c.startswith('ASSERT'):
                 all_cases.add((addr, c))
 
-    print '*' * 40, 'ALL COND', '*' * 40
+    print('*' * 40, 'ALL COND', '*' * 40)
     all_cases = list(all_cases)
     all_cases.sort(key=lambda x: (x[0], x[1]))
     for addr, val in all_cases:
-        print 'Address:', addr, 'is reachable using argc', val
+        print('Address:', addr, 'is reachable using argc', val)