top of page
  • Writer's pictureRoman Sologub

Reverse Engineering із Ghidra

1. Вступ

Нещодавно Агенство Національної Безпеки (АНБ США) випустило в світ утиліту для цілей реверс інжинірингу під назвою Ghidra. Інформація про цей інструмент була вже відома завдяки публікації «Vault 7» від WikiLeaks за березень 2017 року, в якій було обговорено низку хакерських інструментів, які використовує ЦРУ, і неодноразово згадувалася Ghidra як інструмент для reverse engineering, створений АНБ. Однак до недавнього часу вихідний код не був доступний. Ghidra працює на Windows, MacOS і Linux і має всі компоненти, які очікують дослідники безпеки. Вона є аналогом усім нам знайомим IDA, Radare2, Binary Ninja. Інструмент гнучко настроюється і також призначений для полегшення одночасної роботи кількох людей над одним реверсним проектом. У даній статті будемо розглядати особливості Ghidra при аналізі простого crackme.


2. Базові знання


Установка

Перш за все, для успішного запуску Ghidra, потрібно встановити додаткове програмне забезпечення для його роботи. Ghidra вимагає JDK 11, тому скачайте установник звідси (https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html) і запустіть його. Як тільки це буде зроблено, візьміть останню версію Ghidra з офіційного сайту (https://www.ghidra-sre.org). Коли завантаження завершиться, розархівуйте файл і двічі клацніть «runGhidra.bat», щоб запустити Ghidra. При першому запуску вас має вітати угода користувача, і після невеликого завантаження ви побачите спливаюче вікно проекту. Якщо у вас виникли проблеми з установкою або інструкціями вище, ознайомтеся з керівництвом тут (https://www.ghidra-sre.org/InstallationGuide.html#Install).


Створення проекту

Вікно проекту дозволяє завантажувати бінарні файли і організовувати їх. Бінарний файл crackme0x00.exe, з яким ми будемо працювати, можна скачати тут (https://github.com/Maijin/Workshop2015/tree/master/IOLI-crackme/bin-win32). Створіть новий проект і імпортуйте скачаний файл crackme0x00.exe. Це можна зробити перетягнувши бінарний файл у вікно проекту або в опціях вікна проекту вибрати File -> Import File. Коли це буде зроблено, ви побачите завантажений файл crackme0x00.exe.



Далі, двічі клацніть по crackme0x00.exe у вікні проекту, і відкриється браузер коду. З'явиться вікно повідомлення з питанням, чи хочете ви проаналізуваnи бінарний файл, виберіть «Yes», і ви побачите різні види аналізу, які ви можете виконати. Значення за замовчуванням підходять для цього проекту, виберіть «Analyze» і дочекайтеся закінчення роботи Ghidra. Коли все це буде зроблено, ви побачите браузер коду і головні вікна.


Основні вікна

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

За допомогою вікна «Program Trees» ви можете натиснути правою кнопкою миші папку «crackme0x00.exe», щоб організувати розділи коду розборки по-різному. Ви можете зробити це, вибравши «Modularize By» і вибравши «Sub-routine», «Complexity depth» або «Dominance». Ви також можете створювати нові папки і перетягувати розділи відповідно до своїх особистих організаційних переваг.


Наступне вікно під «Program Trees» - це вікно «Symbol Tree», яке дозволяє переглядати імпорт, експорт, функції, мітки, класи і простори імен бінарного файлу. Спробуйте розширити розділ «Імпорт», щоб побачити різні бібліотеки DLL і функції. Якщо ви хочете побачити, де конкретні функції відображаються в бінарному файлі, ви можете натиснути правою кнопкою миші функцію і натиснути «Show References to», а потім двічі клацнути записи результатів, щоб побачити повний розділ.


«Data Type Manager» дозволяє вам бачити всі певні типи, включаючи вбудовані типи, специфічні для двоічного й інші, які були включені в Ghidra (наприклад, ті, які ми бачимо в Windows, які називаються «windows_vs12_32»). Спробуйте розгорнути значки книг і натиснути правою кнопкою миші тип даних, а потім натиснути «Find Uses of», щоб побачити, де тип даних використовується в бінарному файлі.

Тепер ми потрапляємо в одне з головних вікон - «Listing». Тут ви можете побачити розібраний код. Ghidra пропонує вам безліч способів налаштування вікна списку, для цього ви можете клацнути значок «Edit the listing fields» в правому верхньому кутку і клацнути вкладку «Інструкція / Дані». Кожен елемент інтерфейсу списку може бути через змінений, переміщений, відключений або видалений. Ви також можете додати нові елементи, клацнувши правою кнопкою миші і використовуючи контекстне меню. Спробуйте змінити розмір поля «Адреса», щоб зменшити його, і видалити поле «Байти».

Контекстне меню в списку розбирання можна побачити, клацнувши правою кнопкою мишки десь в коді збірки. Ви можете виконувати такі дії, як виправлення інструкцій, установка закладки, коментування і редагування ярликів. Спробуйте натиснути правою кнопкою миші одну з інструкцій і додати коментар. Ви можете двічі клацнути по одній з функцій, на які посилається «CALL», щоб перейти до коду функції і отримати краще уявлення про те, що він може робити. Переміщайтеся вперед і назад, клацаючи значки зі стрілками у верхньому лівому кутку значком збереження або використовуючи поєднання клавіш «Alt-Left Arrow Key» і «Alt-Right Arrow Key».


Ті, хто знайомий з IDA Pro, звикли працювати в основному в графічному режимі. Аналогічним вікном в Ghidra є вікно «Function Graph», в який можна потрапити, натиснувши «Window» і «Function Graph». Графік функцій також можна налаштувати за допомогою кнопки «Edit the listing fields». Графіки в Ghidra за замовчуванням не відображають поля коментарів, спробуйте добавити їх за допомогою редактора полів.

Нарешті, ми бачимо вікно декомпіляції справа, що показує згенерований Ghidra високорівневий код, який представляє код асемблера в вікні «Listing». Спробуйте виділити один з операторів if в декомпіляторі, і ви помітите, що він виділяє відповідну збірку. Це одна з особливостей, які дійсно зручні в Ghidra, оскільки вона дозволяє вам скласти уявне відображення того, які групи інструкцій асемблера відповідають яким високорівневим інструкціям.

Ви можете натиснути правою кнопкою миші по змінним і перейменувати їх або додати коментарі в декомпілятори, і вони також будуть відображені у вікні «Listing». Ghidra автоматично синхронізує всі ці вікна. Якщо ви хочете налаштувати будь-який з параметрів відображення декомпілятора, ви можете зробити це, клацнувши правою кнопкою миші у вікні і вибравши «Properties». Подивіться, чи можете ви перейменувати локальні змінні в щось більш наочне, і зверніть увагу, що ваші зміни з'являються і у вікні «Listing».


3. Застосування отриманих знань при вивченні CrackMe


Якщо ви дійшли так далеко, ви повинні розуміти основні інтерфейси Ghidra і бути готовими до вирішення першого CrackMe. Почніть з запуску файлу «crackme0x0.exe», щоб побачити, як працює програма. Ви помітите, що він запитує пароль, оцінює дані, які вводить користувач, і повертає повідомлення «Invalid Password!», якщо введення було невірним.

Давайте зробимо початкове сортування цього двійкового файлу, переглянувши рядки програми у вікні «Window» -> «Defined Strings». Ви побачите частина тексту, відображуваного в командному рядку, давайте розглянемо частину збірки, яка посилається на «Password». Двічі клацніть запис «Password» у вікні «Defined Strings», і ви потрапите в розділ, де текст зберігається в програмі.

Клацніть лівою кнопкою миші за адресою і виберіть «References» -> «Show References to Address», ви можете натиснути на запис, щоб перейти в розділ коду з посиланням «Password». Або двічі натисніть на адресу, яка знаходиться справа вгорі від рядка з приміткою XREF [1] . Спробуйте визначити, який розділ збірки відповідає за порівняння введення користувача з правильним паролем. Перейменуйте змінні і функції в щось більш описове.



Ви помітите, що після посилання на «Password», є виклик scanf для отримання введення користувача і після цього виклик strcmp. Ми бачимо, що користувацьке введення зберігається в EAX і поміщається в локальну змінну local_40. Рядок «250382» також зберігається в локальній змінній local_3c, а потім обидві передаються в strcmp. Результат цього порівняння порівнюється зі значенням нуль, і якщо воно дорівнює нулю, то друкується текст «Password OK :)». В іншому випадку він виконує перехід і друкує текст «Invalid Password!».


Let’s run “crackme0x00.exe” again, assign it the password “250382”. The following must be displayed:

4. Висновки

Ми не тільки познайомилися з утилітою Ghidra, але і зробили перші кроки в напрямку reverse engineering і cracking. Ресурси Ghidra на цьому не закінчуються, як і можливості його використання. Незважаючи на те, що закладених АНБ бекдорів в утиліті не виявлено, дослідники попереджають про наявність уразливості виконання віддаленого коду.

2 views0 comments
bottom of page