Challenge Details
Running The Binary
Solution
import sys
import angr
import claripy
import logging
import time
def visualize(*args, **kwargs):
stashes = args[0].stashes
for simstate in stashes["active"]:
state_a = format(simstate.solver.eval(a), 'd')
state_b = format(simstate.solver.eval(b), 'd')
state_c = format(simstate.solver.eval(c), 'd')
state_d = format(simstate.solver.eval(d), 'd')
state_e = format(simstate.solver.eval(e), 'd')
state_f = format(simstate.solver.eval(f), 'd')
state_sol = f"[!] solving: {state_a}, {state_b}, {state_c}, {state_d}, {state_e}, {state_f}"
print(state_sol)
proj = angr.Project('./summarize', load_options={'auto_load_libs': False})
start_addr = 0x40137B
initial_state = proj.factory.blank_state(addr=start_addr, add_options=angr.options.unicorn | {
angr.options.ZERO_FILL_UNCONSTRAINED_MEMORY, angr.options.ZERO_FILL_UNCONSTRAINED_REGISTERS})
class AddHook(angr.SimProcedure):
def run(self, p1, p2):
print('addition', p1 + p2)
return p1 + p2
class SubtractHook(angr.SimProcedure):
def run(self, p1, p2):
print('subtract', p1 + p2)
return p1 - p2
class MultiplyHook(angr.SimProcedure):
def run(self, p1, p2):
print('multiply', p1 + p2)
return p1 * p2
class AndHook(angr.SimProcedure):
def run(self, p1, p2):
print('and', p1 + p2)
return p1 & p2
class XorHook(angr.SimProcedure):
def run(self, p1, p2):
print('xor', p1 + p2)
return p1 ^ p2
proj.hook_symbol(0x40163d, AddHook())
proj.hook_symbol(0x4016d8, SubtractHook())
proj.hook_symbol(0x4016fe, MultiplyHook())
proj.hook_symbol(0x40174a, XorHook())
proj.hook_symbol(0x4017a9, AndHook())
# logging.getLogger('angr').setLevel('DEBUG')
regs = initial_state.regs
regs.rbp = regs.rsp
size = 4 * 8
a = claripy.BVS('a', size)
b = claripy.BVS('b', size)
c = claripy.BVS('c', size)
d = claripy.BVS('d', size)
e = claripy.BVS('e', size)
f = claripy.BVS('f', size)
simgr = proj.factory.simgr(initial_state)
regs.edi = a
regs.esi = b
regs.edx = c
regs.ecx = d
regs.r8d = e
regs.r9d = f
initial_state.add_constraints(a > 0x5F5E100, a < 0x3B9AC9FF)
initial_state.add_constraints(b > 0x5F5E100, b < 0x3B9AC9FF)
initial_state.add_constraints(c > 0x5F5E100, c < 0x3B9AC9FF)
initial_state.add_constraints(d > 0x5F5E100, d < 0x3B9AC9FF)
initial_state.add_constraints(e > 0x5F5E100, e < 0x3B9AC9FF)
initial_state.add_constraints(f > 0x5F5E100, f < 0x3B9AC9FF)
print("[*] exploring binary")
start = time.time()
simgr.explore(find=0x401628, avoid=[0x4013D2, 0x401412, 0x40162F], step_func=visualize)
if simgr.found:
solution_state = simgr.found[0]
solved_a = format(solution_state.solver.eval(a), 'd')
solved_b = format(solution_state.solver.eval(b), 'd')
solved_c = format(solution_state.solver.eval(c), 'd')
solved_d = format(solution_state.solver.eval(d), 'd')
solved_e = format(solution_state.solver.eval(e), 'd')
solved_f = format(solution_state.solver.eval(f), 'd')
solution = f"[*] solution: {solved_a}, {solved_b}, {solved_c}, {solved_d}, {solved_e}, {solved_f}"
print(solution)
end = time.time()
print(f"[*] time elapsed: {end - start}")
else:
print("[*] no solution")
print(simgr)
print(simgr.errored)
Running this solution, will give us the following values:
When, putting it into the binary, we get: