Методичні вказівки до виконання лабораторних робіт Київ 2014 Зміст Лабораторна робота 1 Розробка програми розмежування повноважень користувачів на основі парольної автентифікації 3
![]()
|
Лабораторна робота 4 Аналіз механізмів захисту додатку та їх блокуванняМета роботи Навчитися використовувати засоби статичного і динамічного аналізу програм. Отримати навички модифікації бінарного коду додатка. Вміст завдання Досліджувати надану програму, що володіє захистом від свого несанкціонованого використання і зламати захист різними способами. У процесі виконання лабораторної роботи необхідно:
Для вирішення даних задач рекомендується використовувати наступні засоби динамічного і статичного дослідження ПО: 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 ні в кого проблем не викличуть. Прочитавши до цього місця, студент повинен вважається досить підготовленим для виконання даної лабораторної роботи. Вміст завдання
Рекомендована литература
|