2021 [11] Reverse engineering

Имеется фрагмент программы на языке С:
#include <stdio.h>
#include <string.h>
int main ()
  { 
    int code = 0;
    char password[10];
    printf ("Введите пароль:");
    gets (password);
    /*
    ...
    утерянный фрагмент кода
    ...
    */
    if (code == 0)
    {
      /*
      ...
      вычисление значения code
      ...
    */
    }

    if (code == 21827)
       printf ("Пароль верный!");
    else
       printf("Пароль неверный!");
  }

Был получен фрагмент скомпилированного исполняемого файла в шестнадцатеричном формате, в котором удалось обнаружить следующий программный код:

Адрес памяти

Байты в памяти

Их содержание

001C1231

C2 E2 E5 E4 E8 F2 E5 20 EF E0 D0 EE EB FC 3A 00

Строка «Введите пароль:»

001C1241

CF E0 D0 EE EB FC 20 E2 E5 F0 ED FB E9 21 00

Строка «Пароль верный!»

001C1250

CF E0 D0 EE EB FC 20 ED E5 E2 E5 F0 ED FB E9 21 00

Строка «Пароль неверный!»

001C1261

00 00 00 00 00 00 00 00 00 00

Массив password (10 байт)

001C126B

00 00 00 00

Переменная code (целое число, 4 байта)

001C126F

68 61 12 1C 00

Машинная команда, передающая параметр password (его адрес) в подпрограмму gets (переход по адресу начала тела подпрограммы)

001C1274

FF 75 15 1C 00

Вызов подпрограммы gets

001C1279

83 C4 04

Вспомогательная команда, выполняемая после возвращения из подпрограммы, имеющей один параметр

001C127С

8B 45 6B 12 1C 00

Копирование значения переменной code в регистр процессора

001C1282

39 45 00

Сравнение значения регистра с константой 0

001C1285

76 11 13 1C 00

Если результат сравнения false, то переход на выполнение команды по адресу 00 1C 13 11

001C128A

...

Вычисление переменной code

...

...

 

001C1311

8B 45 6B 12 1C 00

Копирование значения переменной code в регистр процессора

001C1317

3B 45 43 55

Сравнение значения регистра с константой 21827

001C131A

77 2C 13 1C 00

Если результат сравнения true, то переход по адресу 00 1C 13 2C

001C131F

68 50 12 1C 00

Машинная команда, передающая адрес строки «Пароль неверный!» в подпрограмму printf как параметр

001C1324

FF 90 16 1C 00

Вызов подпрограммы printf

001C1329

83 C4 04

Вспомогательная команда, выполняемая после возвращения из подпрограммы, имеющей один параметр

001C132B

C3

Команда завершения работы программы

001C132C

68 41 12 1C 00

Машинная команда, передающая адрес строки «Пароль верный!» в подпрограмму printf как параметр

001C1331

FF 90 16 1C 00

Вызов подпрограммы printf

001C1336

83 C4 04

Вспомогательная команда, выполняемая после возвращения из подпрограммы, имеющей один параметр

001C1339

C3

Команда завершения работы программы

...

...

 

001C1575

 

Тело функции gets

...

...

 

001C168F

C1

Возврат к команде, следующей после точки вызова

001C1690

 

Тело функции printf

...

...

 

001C185F

C1

Возврат к команде, следующей после точки вызова


Определите, что нужно подать на вход программы, чтобы в результате выполнения вывелась строка «Пароль верный!». Ответ обоснуйте.
Применяемая реализация подпрограммы gets принимает на вход любые данные без ограничений. Специальные символы (нулевой байт, символ конца строки и т.п.) во входном потоке не прерывают ввод строки.

Показать подсказку

Показать решение

Показать ответ




<< Назад в раздел (Все задания)

Ваше сообщение получено!