Простое обратное упражнение с использованием Cutter - PullRequest
1 голос
/ 07 апреля 2020

В настоящее время я учусь делать базовый 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 = &param_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

Мне очень жаль, если я плохо объяснил свою проблему и постараюсь ответить на любые вопросы, касающиеся моего сообщения.

Большое спасибо и хорошего дня!

...