-rwxr-xr-x 2059 djbsort-20180729/verif/unroll
#!/usr/bin/env python2
import sys
import angr
symbol = sys.argv[1]
n = int(sys.argv[2])
executable = sys.argv[3]
proj = angr.Project(executable)
state = proj.factory.full_init_state()
state.options -= {angr.options.SIMPLIFY_REGISTER_WRITES}
state.options -= {angr.options.SIMPLIFY_MEMORY_WRITES}
xaddr = proj.loader.find_symbol(symbol).rebased_addr
for i in range(n):
state.mem[xaddr + 4 * i].int = state.solver.BVS('in%d' % i,32)
simgr = proj.factory.simgr(state)
simgr.run()
exits = simgr.deadended
assert len(exits) == 1
walked = dict()
walknext = 0
def rename(op):
if op == '__add__': return 'add'
if op == '__sub__': return 'sub'
if op == '__mul__': return 'mul'
if op == '__or__': return 'or'
if op == '__xor__': return 'xor'
if op == '__and__': return 'and'
if op == '__invert__': return 'invert'
if op == '__eq__': return 'equal'
if op == '__rshift__': return 'signedrshift'
if op == 'SLE': return 'signedle'
if op == 'SLT': return 'signedlt'
return op
def informat(x):
if x.startswith('in'):
y = x[2:].split('_')
x = 'in_%s_%s' % (y[0],y[2])
return x
def walk(t):
global walknext
if t in walked: return walked[t]
if t.op == '__xor__' and len(t.args) == 1:
return walk(t.args[0])
if t.op == 'BVV':
walknext += 1
print 'v%d = constant(%d,%d)' % (walknext,t.size(),t.args[0])
elif t.op == 'BVS':
walknext += 1
print 'v%d = %s' % (walknext,informat(t.args[0]))
elif t.op == 'Extract':
assert len(t.args) == 3
input = 'v%d' % walk(t.args[2])
walknext += 1
print 'v%d = Extract(%s,%d,%d)' % (walknext,input,t.args[0],t.args[1])
else:
inputs = ['v%d' % walk(a) for a in t.args]
walknext += 1
if t.op == 'SGE':
t.op = 'SLE'
inputs = reversed(inputs)
if t.op == 'SGT':
t.op = 'SLT'
inputs = reversed(inputs)
print 'v%d = %s(%s)' % (walknext,rename(t.op),','.join(inputs))
walked[t] = walknext
return walknext
for i in range(n):
x = exits[0].mem[xaddr + 4 * i].int.resolved
print 'out%d = v%s' % (i,walk(x))