Challenge Details https://uiuctf-2024-rctf-challenge-uploads.storage.googleapis.com/uploads/66e8392f3eaaf0ee279369f4bbdb61ca7ede335f802339359e67daaa171b4340/summarize Running The Binary Solution https://hst.sh/ijodafimak.py 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: