Использование 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
.