Главная страница
Навигация по странице:

  • Рис. 1. Вікно HIEW при запуску без параметрів. Рис. 2 Текстовий файл, відкритий в HIEW

  • Рис. 3 Шістнадцятковий режим відображення інформації

  • Практичне використання IDA. Рис. 7. Основне вікно IDA

  • Рис. 8. Вікно запиту про метод аналізу файлу.

  • Рис. 9. Завершений аналіз виконуваного файлу

  • Рис. 10. Відкрите вікно таблиці імпорту

  • Рис. 11. Інформація про імпортованої функції GetSystemTimeAsFileTime

  • Рис. 12. Місце виклику функції GetSystemTimeAsFileTime

  • Робота з відладчиком Visual Studio і OllyDbg

  • Рис. 13.Лістінг програми. Рис. 14. Вид програми після дизасемблювання

  • Рис. 14. Загальний вигляд OllyDbg

  • Методичні вказівки до виконання лабораторних робіт Київ 2014 Зміст Лабораторна робота 1 Розробка програми розмежування повноважень користувачів на основі парольної автентифікації 3


    Скачать 1.3 Mb.
    НазваниеМетодичні вказівки до виконання лабораторних робіт Київ 2014 Зміст Лабораторна робота 1 Розробка програми розмежування повноважень користувачів на основі парольної автентифікації 3
    АнкорLaby_po_ZI.doc
    Дата11.08.2018
    Размер1.3 Mb.
    Формат файлаdoc
    Имя файлаLaby_po_ZI.doc
    ТипМетодичні вказівки
    #22806
    страница4 из 7
    1   2   3   4   5   6   7

    Лабораторна робота 4 Аналіз механізмів захисту додатку та їх блокування


    Мета роботи

    Навчитися використовувати засоби статичного і динамічного аналізу програм. Отримати навички модифікації бінарного коду додатка.

    Вміст завдання

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

    • Виділити в досліджуваній програмі ділянку коду, що виконує функцію прийняття рішення про коректність введеного пароля. Визначити файл або файли, в яких зберігається зашифрований пароль.

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

    • Виділити в програмі ділянку коду, відповідальний за формування коректного пароля, відповідного введеному імені користувача. Досліджувати даний код і формально записати алгоритм формування коректного пароля. Використовуючи код програми, відповідальний за формування правильного пароля, створити генератор паролів.

    • Здійснити злом встановленої захисту, використовуючи деякий користувальницький ідентифікатор (ім'я користувача) і відповідний йому коректний пароль, сформований по знайденому в п.3 алгоритму.

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

    • Здійснити блокування встановленої захисту - або підміною функції прийняття рішення про перевищення встановленої межі, або шляхом зміни ключів реєстру.


    Для вирішення даних задач рекомендується використовувати наступні засоби динамічного і статичного дослідження ПО:

    1. Interactive DisAssembler Pro v 4.51 і вище.

    2. Hiew 6.81 і вище.

    3. Вбудований відладчик IDE MS Visual Studio 2003/2005, OllyDbg або ж SoftIce
    Теоретичні відомості

    У проссе виконання лабораторної роботи необхідно використовувати програми, опис яких наведено нижче.

    HIEW 6.81

    Для нормальної роботи з даною програмою необхідно знати деякі керуючі комбінації і режими роботи програми.

    При старті програми без параметрів перед користувачем відкривається вікно вибору потрібного файлу (рис. 1) Для визначеності виберемо файл Hiew.hlp з рідного каталогу програми (рис. 2).

    Як можна бачити, за замовчуванням даний редактор працює в режимі звичайного перегляду тексту. Тепер натиснемо клавішу ENTER (аналогічно можна натиснути клавішу F4 і вибрати необхідний режим перегляду інформації), таким чином здійснивши перехід від звичайного перегляду в режимі тексту в шістнадцяткове відображення інформації (рис. 3). Тепер вікно редактора розбито на 3 колонки. Крайня ліва являє собою зсув байтів відносно початку файлу, центральна область - шістнадцяткове представлення інформації, крайня права - текстове відображення інформації.

    Для того щоб перейти в режим редагування тексту, необхідно натиснути клавішу F3. Після цього можна міняти всі байти, що знаходяться в центральній області вікна редактора, на необхідні користувачу. Щоб зберегти зміни, потрібно натиснути клавішу F9.

    При роботі з редактором потрібно пам'ятати, що він відкриває файли з можливістю читання іншими програмами, але не на запис. Це означає, що якщо ви в даний момент редагуєте за допомогою HIEW якийсь файл, то інша програма, що намагається внести зміни в цей же файл, не зможе звернутися до цього файлу. До цього відноситься також спроба запуску програми, якщо ви його в даний момент редагуєте.

    Тепер розглянемо практичний приклад - відкриємо файл додатка Windows Notepad. Перед цим рекомендується зробити його резервну копію.
    Рис. 1. Вікно HIEW при запуску без параметрів.

    Рис. 2 Текстовий файл, відкритий в HIEW

    Натіснемо клавішу F9 и перейдемо в режим Вибори файлів. Після того, Як файл БУВ Вибране, перейдемо в режим дизассемблера (клавіша F4, або два рази ENTER).

    Рис. 3 Шістнадцятковий режим відображення інформації

    А тепер внесемо в програму незворотні зміни, після яких вона не зможе запуститися. Для цього натиснемо F8 і подивимося, де знаходиться точка входу в програму (рис. 4).



    Рис. 4. Інформація про заголовку файлу Блокнот

    Як бачимо, точка входу знаходиться за адресою 739d. Перейдемо в неї. Для цього вийдемо з режиму перегляду заголовка, натиснувши клавішу ESC, а потім F5. Наберемо «.739 D». НЕ ЗАБУДЬТЕ ПРО КРАПКУ ПЕРЕД шестнадцатірічним числом!!! Тепер на екрані повинно бути щось схоже на те, що зображено на рис. 5.



    Рис. 5. Точка входу додатку Блокнот

    Тепер «познущатися» над Блокнотом, замінивши виклик однієї процедури на порожні операції. Для цього натиснемо F3, і потім послідовно замінимо байти зі значенням 6A70 на 9090 (0х90 = nop - відсутність будь-якої операції). Після цього натискаємо F9 для того, щоб зберегти зміни і натискаючи ESC для виходу з HIEW.

    Відзначимо, що найчастіше nop'амі доводиться «забивати» не один байт, а цілий шматок програми; для цього зручніше відзначити блок байт (клавіша «*»), а потім виконати команду FillBlk (ALT-F2).



    Рис. 6 Змінена точки входу Блокнота

      Запустимо отриману версію Блокнота. Як бачимо, вона не запускається. Таким чином, ми навчилися знищувати корисний код програми шляхом заміни потрібних байтів на nop. Пам'ятайте, що в даній лабораторній роботі левову частку захисту можна зняти таким методом, головне знати, що і де замінювати. Звідси випливає висновок: ПРИ НЕОБХІДНОСТІ ЗНЕШКОДИТИ ДІЛЯНКА КОДА ШЛЯХОМ ВИДАЛЕННЯ його функціональних ІЗ ПРОГРАМИ, НЕОБХІДНО ЗАМІНИТИ потрібна операція еквівалентну кількість БАЙТ 0х90.

    Для пошуку в редакторі потрібної рядка досить натиснути клавішу F7 і ввести те, що вам потрібно знайти або в ASCII, або в шістнадцятиричних кодах. Якщо входжень потрібного рядка більш ніж одне, то для пошуку залишилися входжень необхідно використовувати комбінацію клавіш CTRL + F7.

    За більш детальним описом команд звертатися до функції допомогою даної програми F1. Інформація файлів допомоги контекстно-залежна.

    Примітка. Можна також викоритовувати редактор XVI32.

    IDA Pro v4.51

    Для виконання даної лабораторної роботи нам знадобиться можливість IDA показувати нам таблицю експорту та імпорту функцій програми. Власне, будь-яка програма під Windows не є річчю в собі, а хоч якось повинна взаємодіяти з навколишнім середовищем, в нашому випадку - операційною системою. Тому як мінімум одну функцію будь-яка програма повинна експортувати: точку входу. Можна сказати, що в нашому випадку вона може послужити відправною точкою в дослідженні програми. Крім цього, більшість програм імпортують функції WinAPI, і їхні імена подані в таблиці імпорту. У нашому випадку нам знадобляться функції, відповідальні за виведення інформації на екран і взяття інформації з елементів вікна. Щоб полегшити пошук студента, нижче наводяться функції, задіяні в даній лабораторній роботі:
    MessageBoxA ();

    GetDlgItemTextA ();
    З цього випливає, що в роботі необхідно буде шукати місця виклику даних функцій. На цьому теоретичному відступ закінчується.

    Практичне використання IDA.



    Рис. 7. Основне вікно IDA

    При запуску IDA можна спостерігати вікно, представлене на рис. 7. Щоб відчути, як працює система, виберемо нашу програму для аналізу, і отримаємо результат, зображений на рис. 8.



    Рис. 8. Вікно запиту про метод аналізу файлу.

    Натискаємо на ОК і отримуємо наступне (рис. 9).


    Рис. 9. Завершений аналіз виконуваного файлу

    Дане вікно з’являється після остаточного аналізу програми. Після цього вибираємо вкладку Imports, щоб подивитися список функцій, що використовуються програмою (рис. 10).


    Рис. 10. Відкрите вікно таблиці імпорту

    Клацнувши подвійним клацанням на функції GetSystemTimeAsFileTime, ми побачимо картину, зображену на рис. 11.


    Рис. 11. Інформація про імпортованої функції GetSystemTimeAsFileTime
    Як можна бачити з рис. 11, після здійсненої операції перед нами постало опис імпортованої функції з її параметрами і місцем виклику в програмі (; DATA XREF:. Text: 00401D75). Тепер, якщо нам необхідно дізнатися, де в програмі викликається дана функція, то досить зробити подвійне клацання по напису. Text: 00401D75 і IDA автоматично переведе Вас в потрібне місце виклику (рис. 12). Таким чином, можна переглядати будь-яку ланцюжок викликів функцій.



    Рис. 12. Місце виклику функції GetSystemTimeAsFileTime

    Варто відзначити дуже потужну функціональність IDA в плані навігації по тексту. Щоб повернутися в колишнє місце (тобто момент до переходу по посиланню), достатньо всього лише натиснути клавішу ESC. Крім цього, дуже зручним є графічне відображення переходів в програмі стрілками в правій стороні вікна дизассемблера.

    Власне, цієї інформації цілком достатньо для виконання лабораторної роботи.

    Робота з відладчиком Visual Studio і OllyDbg

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

    Серед сучасних отладчиков найбільш популярними є SoftIce з комплекту Compuware Driver Studio і OllyDbg. SoftIce працює в режимі ядра і тому дозволяє досліджувати драйвери та компоненти Windows, що працюють в ring0; проте в більшості випадків його потужність є надлишковою і доцільніше використовувати більш "дружній» OllyDbg. До того ж, OllyDbg є freeware і доступний для безкоштовного скачування в ІнтерНіі.

    Крім того, ми також розглянемо вбудований відладчик Microsoft Visual Studio.
    Відладчик Visual Studio

    На основі даного відладчика дається уявлення про код програми, який необхідно буде шукати. Отже, приступимо.

    У що перетворюється код програми, написаної на Сі, після компіляції?

    Візьмемо простий приклад:

    Створимо простий додаток засоби MS Visual Studio типу Win32 з графічним інтерфейсом.

    Переведемо режим проекту в стадію Release (для тих, хто до 4 курсу ще не навчився цього, необхідно вибрати властивості проекту Properties-> Configuration Manager-> Configuration і перевести з режиму Debug в режим Release).

    Тепер все має бути готове до застосування.

    Для початку подивимося, у що перетворюється звичайний виклик точки входу програми. Для цього поставимо крапку останова на функцію _tWinMain (натиснемо F9) в рядку з назвою функції.

    Запустимо додаток.

    Виконання програми повинно припинитися в поставленої нами точці. Тепер перейдемо від відображення у вигляді Сі до асемблеру шляхом переходу до вкладці Disassembly (рис. 13 і 14).


    Рис. 13.Лістінг програми.



    Рис. 14. Вид програми після дизасемблювання

    Спробуємо підійти з практичної точки зору і подивимося, на що перетворюються деякі стандартні конструкції мови Сі.

    Розглянемо комплекс інструкцій:
    ULONG A, B;

    A = GetTickCount();

    B = 10;

    if (A > B)

    {

    A--;

    }

    for (A = 0; A < 100; A++)

    {

    B++;

    }

    switch(A)

    {

    case 10:

    B+=100;

    break;

    case 20:

    A+=200;

    break;

    }

    Примітка: якщо Ви захочете переглянути це на реальному прикладі, то або перейдіть в режим DEBUG, або відключіть оптимізацію компілятора, так як в отриманому вами виконуваному файлі дана конструкція, швидше за все, не зустріНіься, тому що компілятор вважатиме її не використовуваної і такий, що не варто включення в виконуваний файл.

    Отже:

    ULONG A, B;

    A = GetTickCount();

    00411B9E 8B F4 mov esi,esp

    00411BA0 FF 15 1C C2 42 00 call dword ptr [__imp__GetTickCount@0 (42C21Ch)]

    00411BA6 3B F4 cmp esi,esp

    00411BA8 E8 72 F8 FF FF call @ILT+1050(__RTC_CheckEsp) (41141Fh)

    00411BAD 89 45 F8 mov dword ptr [A],eax

    B = 10;

    00411BB0 C7 45 EC 0A 00 00 00 mov dword ptr [B],0Ah

    if (A > B)

    00411BB7 8B 45 F8 mov eax,dword ptr [A]

    00411BBA 3B 45 EC cmp eax,dword ptr [B]

    00411BBD 76 09 jbe WinMain+48h (411BC8h)

    {

    A--;

    00411BBF 8B 45 F8 mov eax,dword ptr [A]

    00411BC2 83 E8 01 sub eax,1

    00411BC5 89 45 F8 mov dword ptr [A],eax

    }

    for (A = 0; A < 100; A++)

    00411BC8 C7 45 F8 00 00 00 00 mov dword ptr [A],0

    00411BCF EB 09 jmp WinMain+5Ah (411BDAh)

    00411BD1 8B 45 F8 mov eax,dword ptr [A]

    00411BD4 83 C0 01 add eax,1

    00411BD7 89 45 F8 mov dword ptr [A],eax

    00411BDA 83 7D F8 64 cmp dword ptr [A],64h

    00411BDE 73 0B jae WinMain+6Bh (411BEBh)

    {

    B++;

    00411BE0 8B 45 EC mov eax,dword ptr [B]

    00411BE3 83 C0 01 add eax,1

    00411BE6 89 45 EC mov dword ptr [B],eax

    }

    00411BE9 EB E6 jmp WinMain+51h (411BD1h)

    switch(A)

    00411BEB 8B 45 F8 mov eax,dword ptr [A]

    00411BEE 89 85 F4 FE FF FF mov dword ptr [ebp-10Ch],eax

    00411BF4 83 BD F4 FE FF FF 0A cmp dword ptr [ebp-10Ch],0Ah

    00411BFB 74 0B je WinMain+88h (411C08h)

    00411BFD 83 BD F4 FE FF FF 14 cmp dword ptr [ebp-10Ch],14h

    00411C04 74 0D je WinMain+93h (411C13h)

    00411C06 EB 16 jmp WinMain+9Eh (411C1Eh)

    {

    case 10:

    B+=100;

    00411C08 8B 45 EC mov eax,dword ptr [B]

    00411C0B 83 C0 64 add eax,64h

    00411C0E 89 45 EC mov dword ptr [B],eax

    break;

    00411C11 EB 0B jmp WinMain+9Eh (411C1Eh)

    case 20:

    A+=200;

    00411C13 8B 45 F8 mov eax,dword ptr [A]

    00411C16 05 C8 00 00 00 add eax,0C8h

    00411C1B 89 45 F8 mov dword ptr [A],eax

    break;

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

    Розглянемо роботу з цим відладчиком на прикладі версії 1.1 без додаткових плагінів.

    Для цього запустимо програму і відкриємо в ній notepad.exe:


    Рис. 14. Загальний вигляд OllyDbg
    Зліва перед нами міститься вікно, в яке виводиться асемблерний код програми, праворуч - панель з станом регістрів (по правому клацанню можна вибирати, які додаткові регістри показувати - MMX, 3dNow! І так далі), внизу - дамп стека і оперативної пам'яті.

    У вікні з асемблерних лістингом зазначено зсув, hex-код, безпосередньо асемблерні команди, йому відповідна, і розширений коментар. В якості коментаря часто виводиться така корисна інформація, як наприклад, ім'я викликуваної API-функції.

    Двічі кликнувши по команді, можна редагувати її та замінювати своєї.

    Зверніть увагу на меню, яке з'являється при правому кліку мишею.

    Меню Breakpoint дозволяє управляти точками останова: Toggle (F2) ставить брейкпоинтов на вибраній команді, Conditional Breakpoint - останов при виконанні деякого умови, Run To Selection - виконати програму і зупинитися на обраній команді.

    Меню Search for містить такі незамінні опції, як All Referenced Text Strings і All Intermodular Calls. Відкривши пункт Search for All Referenced Text Strings, можна побачити всі строкові дані, використовувані в програмі, і швидко перейти в те місце, де вони згадуються. Наведемо практичний приклад: програма перевіряє серійний номер і в разі невдачі повідомляє «Your serial number is incorrect». Робимо пошук цього рядка і здійснюємо перехід до того місця, де викликається відповідний MessageBox; напевно десь недалеко йде перевірка валідності серійного номера, яку можна або пропатчити (наприклад, забити тими ж nop'aмі) або спробувати розібратися в алгоритмі і написати кейген. У меню пункт Search for All Intemodular Calls можна знайти список всіх API-функцій, використовуваних у програмі, і поставити на потрібних з них точку зупину. У попередньому прикладі можна було б поставити breakpoint на MessageBoxA і ввести неправильний серійний номер - програма б зупинилася якраз на тому місці, де нам потрібно.

    Крім цих пунктів, є ще безліч інших не менш корисних. Пропонуємо студенту ознайомитися з ними самостійно.
    Ну і, звичайно, важливим є меню Debug: сподіваємося, що стандартні команди на кшталт Trace Into або Step Over ні в кого проблем не викличуть.
    Прочитавши до цього місця, студент повинен вважається досить підготовленим для виконання даної лабораторної роботи.
    Вміст завдання

      1. Необхідно проаналізовати алгоритм роботи програми і створити блок-схему алгоритму з деталізацій до окремих повідомлень в коді програми.

      2. Написати програму генерації паролів для програми що аналізується.

      3. Навчитися вносити зміни в код програми для відключення окремих функцій захисту.

    Рекомендована литература

    1. Крис Касперски. Техника и философия хакерских атак. Записки мыщ’а. 2-е издание, переработанное и дополненное.

    2. То же самое, только первое издание.

    3. В.И. Юров. Assembler. Учебник для ВУЗов. (любое из изданий).

    4. Крис Касперски. Образ мышления – дизассемблер IDA.

    5. Р.А. Айрапетян. Отладчик SoftIce. Подробный справочник.


    1   2   3   4   5   6   7


    написать администратору сайта