angr-in-action/crackmes/xorsimple/solve.py

41 lines
1.5 KiB
Python

import time
import angr
if __name__ == "__main__":
# Загрузка бинарного файла
proj = angr.Project('a.exe', auto_load_libs=False)
ENTRY_POINT = 0x140001837 # Адрес функции после вызова scanf
TARGET_ADDR = 0x140001848 # Целевой адрес, нахождение на нем означает что програмам взломана
# Создание начального состояния
state = proj.factory.entry_state(
addr=ENTRY_POINT,
add_options={angr.options.ZERO_FILL_UNCONSTRAINED_REGISTERS,
angr.options.ZERO_FILL_UNCONSTRAINED_MEMORY}
)
# Инициализация стека
state.regs.rbp = 0x7ffffffffffffff
state.regs.rsp = 0x7ffffffffffffff
# Симуляция ввода пользователя
input_size = 5
input_data = state.solver.BVS('input_data', 8 * input_size)
state.memory.store(state.regs.rbp - 0x50, input_data)
# Установка ограничений
for byte in input_data.chop(8):
state.add_constraints(byte >= 0x20)
state.add_constraints(byte <= 0x7e)
simgr = proj.factory.simulation_manager(state)
start_time = time.time()
simgr.explore(find=TARGET_ADDR)
elapsed = time.time() - start_time
if simgr.found:
input_data = simgr.found[0].solver.eval(input_data, cast_to=bytes)
print(f"Success cracked! Input: {input_data} | Pwd cracking time = {elapsed}")
else:
print("Fail!")