Использование angr для решения из ввода stdin

Я начал изучать Angr, поэтому я поставил перед собой простую задачу, но не смог ее решить

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main() {
    char input[200];
    ZeroMemory(&input, 200);
    fgets(&input, 100, stdin);

    if (!strcmp(input,"S3cr3T\n")) {
        printf("GOOD FLAG!!");
    }
    else {
        printf("BAD FLAG!");
    }
}

двоичный: https://file.io/De5mdL

solver.py

import angr
import claripy
import sys

oflag         = "S3cr3T\n"
password_good = 0x41180B
password_bad  = 0x41181A
push_flag     = 0x4117EE

p = angr.Project('Project1.exe',auto_load_libs=False)

state = p.factory.entry_state(addr=push_flag)

arg1 = claripy.BVS("arg1", 8*len(oflag))
for i in range(len(oflag)-1):
    state.add_constraints(arg1.get_byte(i) >= ' ')
    state.add_constraints(arg1.get_byte(i) <= '~')
state.add_constraints(arg1.get_byte(len(oflag)) >= 10)

state.memory.store(state.regs.ebp-0xd0,arg1)

sm = p.factory.simulation_manager(state)
sm.explore(find=password_good,avoid=password_bad)

print result.solver.eval(arg1,cast_to=bytes)

если кто-то может его решить, имейте в виду, что мне нужно решить его, используя символические векторы, а не используя поиск пути angr

1 ответ

Ваш двоичный файл больше не доступен, и я не смог его скомпилировать для Windows...

Но после настройки исходного кода (замените ZeroMemory с самодельной функцией), компилируя ее для моей платформы и обновляя адреса solver.py вы дали с подходящими (для двоичного файла, который я получил), это сработало.

Однако последняя строка вашего solver.py вызовет ошибку (resultнигде не заявлено). Вот как успешно извлечь исследованную ценность из менеджера симуляции:

result = sm.found[0].solver.eval(arg1,cast_to=bytes)
print(result)

Если это не решит проблему, вот еще пара вещей:

  • Если ваш двоичный файл скомпилирован для 64 бит, state.regs.ebp должно быть state.regs.rbp;
  • Проверьте в исходном двоичном файле адреса для password_good, password_bad, а также push_flag являются хорошим;
  • Убедитесь, что ваша точка входа (push_flag) не "слишком далеко вперед": в частности, вы хотите, чтобы менеджер моделирования перешел к инструкциям, управляющим [EBP - 0xd0] перед call к strcmp.
Другие вопросы по тегам