Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import angr
- def main():
- SERIAL_SIZE = 19
- # Подгрузим наш crackme
- project = angr.Project('crackme01_x64.exe')
- # Зададим некоторое начальное состояние, с которого будет производиться эмуляция кода
- # В качестве начальной точки зададим адрес функции, проверяющий серийный номер
- state = project.factory.blank_state(addr = 0x140001000)
- # Зададим состояние регистров, которыми будет оперировать эмулятор
- # В RCX положим некоторый произвольный адрес, по которому хранится подбираемый серийный номер
- # В RDX размер серийного номера
- state.regs.rcx = serial_address = 0x100000
- state.regs.rdx = SERIAL_SIZE
- # Для каждого символа серийного номера зададим диапазон допустимых значений
- # Для 4, 9 и 14: это тире
- # Для остальных: a-zA-Z0-9
- for i in range(0, SERIAL_SIZE):
- if i != 4 and i != 9 and i != 14:
- cond_numeric_f = state.memory.load(serial_address + i, 1) >= ord('0')
- cond_numeric_t = state.memory.load(serial_address + i, 1) <= ord('9')
- cond_alpha_lc_f = state.memory.load(serial_address + i, 1) >= ord('a')
- cond_alpha_lc_t = state.memory.load(serial_address + i, 1) <= ord('z')
- cond_alpha_uc_f = state.memory.load(serial_address + i, 1) >= ord('A')
- cond_alpha_uc_t = state.memory.load(serial_address + i, 1) <= ord('Z')
- state.add_constraints(
- state.solver.Or(
- state.solver.And(cond_numeric_f, cond_numeric_t),
- state.solver.And(cond_alpha_lc_f, cond_alpha_lc_t),
- state.solver.And(cond_alpha_uc_f, cond_alpha_uc_t)
- )
- )
- else:
- state.add_constraints(state.memory.load(serial_address + i, 1) == ord('-'))
- # Создадим объект PathGroup для последующей эмуляции
- # http://angr.io/api-doc/angr.html#module-angr.path_group
- simgr = project.factory.simgr(state)
- # Запустим поиск возможных решений, указав адрес в коде, куда мы хотим попасть
- # А также адреса, которых следует избегать
- result = simgr.explore (
- find = 0x1400010ee,
- avoid = [0x14000100c, 0x1400010fd]
- )
- if result.found:
- # Вернем первое найденное решение
- solution = simgr.found[0]
- return solution.solver.eval(solution.memory.load(serial_address, SERIAL_SIZE), cast_to=bytes).decode("utf-8")
- else:
- return 'Not found :('
- if __name__ == "__main__":
- print ( main() )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement