В настоящее время я учусь делать базовый c реверс-инжиниринг бинарных файлов с использованием Cutter. Программа, с которой я пытаюсь проверить, верен ли пароль, введенный в качестве аргумента, если нет, возвращает сообщение об ошибке. У меня серьезный пробел в сборке, и я не могу определить пароль на этом. Я работал над этим несколько раз и дошел до того, что застрял ..
Вот декомпилированный код, проверка пароля, произошедшего во время итераций while / if, так что то, что раньше, просто дать немного контекста.
undefined4 main(int param_1,int param_2){
undefined4 uVar1;
size_t sVar2;
undefined4 local_21;
undefined4 local_1d;
undefined local_19;
char *local_18;
int local_14;
undefined4 *local_10;
local_10 = ¶m_1;
local_14 = 0;
if (param_1 == 2) {
local_21 = 0x776f7264;
local_1d = 0x70617373;
local_19 = 0;
local_18 = *(char **)(param_2 + 4);
sVar2 = strlen(local_18);
if (sVar2 < 8) {
uVar1 = 0xffffffff;
}
else {
while (local_14 < 8) {
if ((int)local_18[local_14] + 1 != (int)*(char
*)((int)&local_21 + local_14)) {
puts("Wrong password.");
return 0xffffffff;
}
local_14 = local_14 + 1;
}
puts("Access granted.");
uVar1 = 0;
}
}
else {
puts("One and only one argument PLS.");
uVar1 = 0xffffffff;
}
return uVar1;
}
ОБНОВЛЕНИЕ 1, Что я знаю из своих предположений и помощи других:
Программа не возвращает сообщение об ошибке если пароль меньше 8 символов. (Если это> = 8, это говорит о том, что пароль неверный). Я думаю, что пароль должен быть 8 символов.
Пароль, вероятно, шестнадцатеричный. Почему я так думаю? переменная, используемая при проверке пароля (local_21 = 776f7264 = word), содержит ровно 8 символов, и мы проверяем ее 8 раз.
Существует некоторый сдвиг, поскольку мы тестируем (local_18 [local_14] + 1) с local_18 аргументом, который я ввел, и local_14 итератором, который увеличивается в конце времени. Из того, что мне сказали, это сместит пароль, который я ввожу, и он должен быть таким же, как (int) * (char *) ((int) & local_21 + local_14)), но я не могу понять, что это .
Так что, если мои слова верны, мне нужно найти шестнадцатеричный код из 8 символов, из которого я буду сдвигать символы (например, заменять b на a), чтобы соответствовать тому, что я пытаюсь перевести "(int) * (char *) ((int) & local_21 + local_14))"
Я пытаюсь выяснить, прав ли я ...
ОБНОВЛЕНИЕ 2, Вот экран дерева сборки и , а раздел увеличен в .
Я также прокомментировал это ниже, но, как вы можете видеть есть раздел, в котором я просто не могу понять, что происходит:
VARS :
local_21 = 0x776f7264 ; (String) word used in password comparaison
local_1d = 0x70617373 ;(String) pass but unused
local_14 = 0 ;iterator
local_18 = argv[1] (it's the string given as an argument, let's
assume i've entered "examples")
- mov edx, dword [local_14] --> load the value of local_14 into edx
local_14 = 0
- mov eax, dword[local_18] --> load the function argument into the
register
local_18 = examples
- add eax, edx --> add the value 0 to our password (does it means we
add 0 to the address of our input or directly to
the input ?)
- movzx eax, byte[eax] --> get the first character in eax (is he
taking the hexa character 7 ?
- movsx eax, al --> ?
- lea ecx, [eax + 1] --> load the address of [eax+1] into eax (don't
know what is in eax+1..)
- lea edx, [local_21] --> load the address of local_21 in edx
it is 0x776f7264 so what does it stock ? Do
I considerer this as a value or as an
address?
- mov eax, dword[local_14] --> load the value of local_14 (0) into
eax, so 0x0 ?
- add eax, edx -> we add local_14 (0) to eax, so do we have 0x776f7264
- movzx eax, byte[eax] --> exact same thing as before.
- movsx eax, al --> same as before
- cmp ecx, eax --> we compare ecx et eax (eax=?, ecx = [eax+1] = ?)
- add dword [local_14], 1 --> we add 1 to (local_14), it became 1 (our
iterator)
- cmp dword [local-14], 7 --> we compare our iterator with with 7, if
it is lower we continue
- we start again from the start
Мне трудно понять, является ли 0x776f7264 на самом деле адресом или просто значением в eax. Итак, когда я добавляю 1, что на самом деле происходит (2,3 и c ..)? У меня было это непосредственно к гекса или я думаю добавить его к персонажу? Например, 77 = w, поэтому я добавляю 1 к w, и это дает мне x
Мне очень жаль, если я плохо объяснил свою проблему и постараюсь ответить на любые вопросы, касающиеся моего сообщения.
Большое спасибо и хорошего дня!