13 Angr Static Binary¶
The instructions state that this is the same challenge as 00_angr_find, the only difference is that the binary is compiled as a static binary. So, all we need to do is copy the code from the previous challenge and then insert hooks for all the static functions with SimProcedures
.
Nothing really to talk about, so here is the final code.
import sys
import pwn
import angr
def main():
path_to_binary = "./13_angr_static_binary"
project = angr.Project(path_to_binary)
initial_state = project.factory.entry_state(
add_options={
angr.options.SYMBOL_FILL_UNCONSTRAINED_MEMORY,
angr.options.SYMBOL_FILL_UNCONSTRAINED_REGISTERS,
},
)
project.hook(0x804ED40, angr.SIM_PROCEDURES["libc"]["printf"]())
project.hook(0x804ED80, angr.SIM_PROCEDURES["libc"]["scanf"]())
project.hook(0x804F350, angr.SIM_PROCEDURES["libc"]["puts"]())
project.hook(0x8048D10, angr.SIM_PROCEDURES["glibc"]["__libc_start_main"]())
simulation = project.factory.simgr(initial_state)
print_good_address = 0x80489E1
simulation.explore(find=print_good_address)
if simulation.found:
solution_state = simulation.found[0]
solution = solution_state.posix.dumps(sys.stdin.fileno()).decode()
run_binary(solution, path_to_binary)
else:
raise Exception("Could not find the solution")
def run_binary(solution, path_to_binary):
if type(solution) == str:
solution = bytes(solution, "utf-8")
print(f"[+] Solution found: {solution.decode()}")
print(" [|] Running binary")
pwn.context.log_level = "error"
elf = pwn.ELF(path_to_binary, checksec=False)
pty = pwn.process.PTY
io = elf.process(stdin=pty, stdout=pty, level="warn")
io.recvuntil(b":")
io.sendline(solution)
output = io.recvline().decode().splitlines()[0].strip()
print(f" [+] Output: {output}")
if __name__ == "__main__":
main()