Advertisement
Guest User

Untitled

a guest
Jun 4th, 2023
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.76 KB | None | 0 0
  1. import angr
  2.  
  3. def main():
  4.     SERIAL_SIZE = 19
  5.     # Подгрузим наш crackme
  6.     project = angr.Project('crackme01_x64.exe')
  7.  
  8.     # Зададим некоторое начальное состояние, с которого будет производиться эмуляция кода
  9.     # В качестве начальной точки зададим адрес функции, проверяющий серийный номер
  10.     state = project.factory.blank_state(addr = 0x140001000)
  11.  
  12.     # Зададим состояние регистров, которыми будет оперировать эмулятор
  13.     # В RCX положим некоторый произвольный адрес, по которому хранится подбираемый серийный номер
  14.     # В RDX размер серийного номера
  15.     state.regs.rcx = serial_address = 0x100000
  16.     state.regs.rdx = SERIAL_SIZE
  17.  
  18.     # Для каждого символа серийного номера зададим диапазон допустимых значений
  19.     # Для 4, 9 и 14: это тире
  20.     # Для остальных: a-zA-Z0-9
  21.     for i in range(0, SERIAL_SIZE):
  22.  
  23.         if i != 4 and i != 9 and i != 14:
  24.             cond_numeric_f = state.memory.load(serial_address + i, 1) >= ord('0')
  25.             cond_numeric_t = state.memory.load(serial_address + i, 1) <= ord('9')
  26.  
  27.             cond_alpha_lc_f = state.memory.load(serial_address + i, 1) >= ord('a')
  28.             cond_alpha_lc_t = state.memory.load(serial_address + i, 1) <= ord('z')
  29.  
  30.             cond_alpha_uc_f = state.memory.load(serial_address + i, 1) >= ord('A')
  31.             cond_alpha_uc_t = state.memory.load(serial_address + i, 1) <= ord('Z')
  32.  
  33.             state.add_constraints(
  34.                 state.solver.Or(
  35.                     state.solver.And(cond_numeric_f, cond_numeric_t),
  36.                     state.solver.And(cond_alpha_lc_f, cond_alpha_lc_t),
  37.                     state.solver.And(cond_alpha_uc_f, cond_alpha_uc_t)
  38.                 )
  39.             )
  40.         else:
  41.             state.add_constraints(state.memory.load(serial_address + i, 1) == ord('-'))
  42.  
  43.     # Создадим объект PathGroup для последующей эмуляции
  44.     # http://angr.io/api-doc/angr.html#module-angr.path_group
  45.     simgr = project.factory.simgr(state)
  46.  
  47.     # Запустим поиск возможных решений, указав адрес в коде, куда мы хотим попасть
  48.     # А также адреса, которых следует избегать
  49.     result = simgr.explore (
  50.         find = 0x1400010ee,
  51.         avoid = [0x14000100c, 0x1400010fd]
  52.     )
  53.  
  54.     if result.found:
  55.         # Вернем первое найденное решение
  56.         solution = simgr.found[0]
  57.  
  58.         return solution.solver.eval(solution.memory.load(serial_address, SERIAL_SIZE), cast_to=bytes).decode("utf-8")
  59.     else:
  60.         return 'Not found :('
  61.  
  62. if __name__ == "__main__":
  63.     print ( main() )
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement