Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
12.05.2015
Размер:
135.68 Кб
Скачать

ДИЗАСЕМБЛЮВАННЯ ВИКОНУЮЧИХ ФАЙЛІВ.

Мета роботи - вивчити основні принципи дизасемблювання консольних додатків, а також ознайомитися з відладчиком Turbo Debugger і HEX-редактором Hex View.

1. Теоретичні відомості

Основним завданням, яке призводить до дизасемблювання додатків є необхідність змінити структуру і поведінку готового виконуваного файлу. Самим яскравим прикладом дизасемблювання є нейтралізація захисту програм, вбудованою розробниками. Розглянемо рішення цієї задачі на практичному прикладі.

Нехай дана консольна програма, яка при запуску виконує запит на введення пароля з клавіатури. Пароль зберігається у програмі у вигляді строкової змінної зі значенням «password». При правильному введенні на екран виводиться повідомлення «OK», а інакше - «Password incorrect». Існує кілька способів нейтралізації такого захисту. Перший спосіб заснований на необхідності тільки знайти правильний пароль і отримати позитивну авторизацію ввівши знайдений пароль. Другий спосіб - необхідність зробити так, щоб при введенні будь-якого пароля програма вважала його правильним і видавала позитивну авторизацію.

Перший спосіб

Ідея: Необхідно шляхом покрокового налагодження виконуваного файлу знайти місце (адресу) в пам'яті, де знаходиться змінна з паролем, перейти по знайденій адресі і виявити пароль. Для цього потрібно спочатку знайти місце у програмі, де знаходиться введення пароля і місце, де виводиться результат авторизації. Далі послідовним трасуванням виявити передбачувані уразливі точки в програмі між знайденими ділянками, де відбувається будь-яке порівняння з подальшим умовним переходом (часто je або jne). У різних програмах порівняння може бути виконано по-різному: це або операція CMP, або виклик процедури порівняння, або виконання інших операцій, які здатні виставляти прапорці процесора. Після цього відбувається аналіз знайдених точок в залежності від виду порівняння для знаходження адреси змінної з паролем. Якщо виявлена ​​операція CMP, то відбувається порівняння значень пароля (символів, якщо пароль заданий у вигляді рядка та чисел, якщо заданий числовий пароль) з введеними значеннями з клавіатури. В даному випадку необхідно послідовно запам'ятовувати порівнювані значення і в кінці порівняння скласти з них правильний пароль. Якщо в вразливій точці виявлено виклик процедури порівняння, то перед її викликом можна знайти пересилання аргументів процедури в стек (або, що дуже рідко, в регістри). Аргументами процедури порівняння очевидно і є порівнювані дані, але на відміну від операції CMP дані аргументи найчастіше передаються не у вигляді значень, а у вигляді адрес на порівнювані змінні. Тому для знаходження пароля необхідно виявити, які адреси передаються в стек, і послідовно переходячи по кожній з адрес знайти в одному з них пароль. Якщо в вразливій точці відбуваються які-небудь інші дії з виставленням прапорців, то в такій нестандартній ситуації необхідно виявляти пароль, виходячи зі змісту цих дій.

Оскільки порівняння з використанням процедур виконується найбільш часто, то в даній лабораторній роботі наведено приклад програми, написаної на мові С + +, яка порівнює пароль з введеним рядком процедурою int strcmp (char * s, char * d), яка в якості аргументів приймає адреси порівнюваних рядків і повертає значення 0 якщо рядки рівні, число менше нуля, якщо рядок s <d і число більше нуля, якщо рядок s> d. Для виведення на консоль використовується функція << об'єкта класу ostream, що представляє стандартний потік виводу, а для введення - функція >> об'єкта класу istream, що представляє стандартний потік вводу.

Лістинг тестової програми для знаходження пароля labDasm.cpp:

# Include <iostream.h>

# Include <string.h>

# Include <conio.h>

void main ()

{

char * a, * pass = "password"; / / Оголошення рядків a і pass

clrscr (); / / Очищення екрану

cout << "Enter the password:" << endl; / / Висновок рядка в стандартний потік виводу

cin >> a; / / Введення рядки з стандартного потоку вводу

if (! strcmp (a, pass)) / / Порівняння рядків a і pass

cout << "OK"; / / Висновок рядка в стандартний потік виводу

else

cout << "Password incorrect"; / / Висновок рядка в стандартний потік виводу

cin.get ();

cin.get (); / / Очікує натискання клавіші Enter

}

Кроки алгоритму знаходження пароля:

1. Відкрити у відладчику Turbo debugger (TD.exe) виконуваний файл labDasm.exe;

2. Виконати послідовне трасування програми (на вимогу введення пароля ввести будь-який рядок, наприклад «12345») до знаходження точки виклику процедури порівняння strcmp (рис. 1);

Рис. 1

3. Перед знайденою точкою виклику знаходиться пересилання адрес порівнюваних рядків в стек, а після - операція умовного переходу jne. Дані дві адреси зберігаються в пам'яті, як видно з рис.1, по зсуві bp-04 і bp-02 сегменту даних. Знайти ці адреси перейшовши в пам'яті на ds: 0xFFF2 і ds: 0xFFF4 відповідно (рис.2);

Рис. 2

В даному випадку:

СМЕЩ1 = 00AAh

СМЕЩ2 = 5845h

4. Перейти по кожному із знайдених адрес (рис. 3):

Рис. 3

Як видно з рис.3, по зміщенні 5845h знаходиться введений з клавіатури раніше рядок «12345» з кодом кінця рядка 0, а по зсуві 00AAh перебуває пароль «password».

Другий спосіб

Ідея: Необхідно знайти можливі критичні точки програми, як було показано в першому способі. Із знайдених точок визначити справжню критичну точку (в даному прикладі знайдена тільки одна можлива критична точка, вона і є істинною). Далі необхідно виявити наступну за знайденою точкою операцію умовного переходу, даний перехід визначає, куди потрібно перейти в залежності від правильності введення пароля. Наприклад, якщо пароль введено правильно, то виводиться повідомлення про успішну авторизацію, а інакше - повідомлення про неправильність введення. Тому, щоб при неправильно введеному рядку з клавіатури програма видала повідомлення про правильність введення, необхідно замінити в виконуваному файлі умова переходу на протилежне (наприклад jne на je, або jz на jnz і т.д.).

Алгоритм зміни виконуваного файлу для його позитивної реакції на неправильно введений пароль:

1. Відкрити в відладчик Turbo debugger (TD.exe) виконуваний файл labDasm.exe;

2. Виконати послідовну трасування програми до знаходження операції умовного переходу після виклику процедури порівняння strcmp (рис. 4). Знайдена операція умовного переходу jne має машинний код 7505h;

3. Відкрити в редакторі Hex View (hiew.exe) виконуваний файл labDasm.exe;

4. Переключитись в режим перегляду коду (F4 для перемикання режиму перегляду -> Decode);

5. Знайти операцію з машинним кодом 7505h (F7 для пошуку -> Hex для введення шістнадцяткових символів);

6. Змінити операцію з jne на je (F3 для входу в режим редагування потім F2 для зміни поточної команди) (Рис. 5);

7. Зберегти зміни (F9).

Рис. 4

Рис. 5

Тепер, коли виконуваний файл змінено, при введенні неправильного пароля, програма буде сприймати його як правильний (Рис. 6).

Рис. 6

2. Завдання

1. За номером варіанту вибрати виконуваний файл:

Nвар = 100 * Nгр + Nпо списку

ІМ’Явиконуючого файлу = "Nвар.exe"

2. Знайти правильний пароль авторизації, показати місце його зберігання в дампі пам'яті.

3. Змінити виконуваний файл так, щоб неправильно введений пароль сприймався як правильний.

Для здачі лабораторної роботи необхідно підготувати відкрите вікно дампа пам'яті з вмістом пароля, а також запущену змінену програму, яка сприймає неправильно введений пароль як правильний.

Соседние файлы в папке SP_ukr