Зворотній інжиніринг із використанням Radare2 (частина 2)

2 квітня 2023 1 хвилина Автор: Endpool

Реверс інжиніринг з Radare2

Ця стаття є продовженням першої статті “Зворотний інжиніринг з використанням Radare2 (Reverse Engineering)”, де дано базове введення в інструмент. Настійно рекомендується почати звідти, якщо ви ще цього не зробили, оскільки перша частина охоплює самі основи.Зворотна розробка (зворотне проектування, інжиніринг, реверс-інжиніринг; англ. reverse engineering) — дослідження деякого готового пристрою або програми, а також документації на нього з метою зрозуміти принцип його роботи; наприклад, щоб виявити недокументовані можливості (у тому числі програмні закладки), зробити зміну або відтворити пристрій, програму або інший об’єкт з аналогічними функціями, але без прямого копіювання. Застосовується зазвичай у тому випадку, якщо творець оригінального об’єкта не надав інформації про структуру та спосіб створення (виробництва) об’єкта. Правовласники таких об’єктів можуть заявити, що проведення зворотної розробки порушує їхнє право згідно із законом про авторське право та патентне законодавство.

Зворотний інжиніринг у програмному забезпеченні – це можливість розібрати (дизасемблювати) програму, щоб побачити, як вона функціонує. Реінжиніринг дозволяє розбирати на частини програму або програмне забезпечення та перестворювати його без доступу до вихідного коду. Це також може використовуватися для виправлення помилок у старих іграх або для пошуку експлойтів у деяких програмах. Загалом, не побоюсь цього слова, фреймворк тихими кроками наздоганяє нашу улюблену (і досить важко одержувану) IDA. А поки що розглянемо його особливості, які розроблені на даний момент.

Ви можете завантажити цю програму з GitHub (здійснюваний файл crackme)

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

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

Є кілька способів вирішити цю проблему. Ми можемо спробувати брут-форсити пароль, відправляючи в програму безліч різних комбінацій із літер, доки ми випадково не обчислимо пароль. Довжина стандартного пароля становить приблизно 8 символів. Розумно припустити, що пароль складено з великих і дрібних букв і, можливо, навіть цифр. Відповідно до цього калькулятора, тоді підбір такого пароля займе приблизно 15 років, щоб дізнатися його методом брут-форсу. У мене немає стільки часу на очікування, тому я збираюся використовувати Radare2 для злому пароля. Так само, як і в попередньому уроці, ми почнемо з використання rabin2, щоб отримати деяку інформацію про цю програму. Давайте запустимо її з опцією -I, щоб побачити, з чим ми маємо справу.

Висновок:

Так само, як і в попередній раз, ми бачимо, що маємо справу з файлом x64 Linux, який був написаний на C. Ця інформація цікава, але не особливо нам допомагає дізнатися, що ж там за пароль. Можливо рядки з файлу, що виконається, дадуть нам ключ. Ми можемо переглянути їх за допомогою rabin2. Зазвичай ми використовуємо прапор -z, але показує багато висновку. Ми можемо використовувати прапор -zqq для показу лише рядків.

Отриманий висновок:

Тут ми можемо бачити багато цікавих речей! Ми бачимо повідомлення, яке говорить “You failed” («ви зазнали невдачі»), яке ми отримали, коли ввели невірний пароль. Ми також можемо бачити “Congratulations” («Вітання»), які, як можна припустити, ми отримаємо, коли введемо правильний пароль. Ми також бачимо рядок “radare2”. Ми можемо припустити, що це може бути пароль. Може бути й не так, але від спроби гірше не буде.

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

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

Нам також слід пошукати функцію main, оскільки з неї починається програма.

Тепер, коли ми на функції main, ми переключимося на графічний режим radare2. Це допоможе нам побачити як програма тече та побачити, де виконуються перевірки цих паролів. Для переходу до графічного режиму використовуйте команду “VV”.

Ви повинні побачити ascii графік radare2. Ви можете пересуватися за графіком, використовуючи клавіші HJKL як у Vim або курсорні клавіші. Якщо ви подивитеся на перший блок у графіку, ви можете побачити перевірку нашого першого пароля. Ви можете побачити в останніх кількох рядках, що приймається рядок “radare2” і порівнюється з введенням користувача за допомогою функції strcmp. Потім робиться перевірка, щоб з’ясувати, рядки однакові чи ні. Якщо вони не однакові, тоді ми йдемо по зеленій лінії t (яка означає, що умова є істинною) вниз до цього блоку коду:

Ми можемо бачити у верхньому блоці, що програма порівнює деяку величину з нулем. Якщо вона дорівнює нулю, то виводиться вираз “Flag is: r2{%s %s %s}”. Це має бути наш прапор після завершення завдання. На жаль, замість статичного рядка використовується формат виведення рядка, тому просто дивлячись на цей запис ми не знаємо, яким буде прапор. Якщо ця змінна у першому блоці дорівнює нулю, він друкує повідомлення “You failed”. Таким чином, з цього можна зробити висновок, що деяка змінна, яка визначає, чи буде отриманий прапор, буде змінена, як тільки ми запровадимо всі правильні паролі. Давайте перейдемо до вершини та подивимося, що станеться, якщо ми отримаємо правильний перший пароль.

Отже, цей блок друкує рядок із привітаннями “Congratulations”, потім друкує запит на введення другого пароля “What’s the second password?”, потім він бере наш рядок введення використовуючи scanf і пропускає його через функцію atoi. Функція atoi використовується для конвертації рядка в число, тому другий пароль має бути числом! Ми можемо бачити, що у блоці висновок atoi порівнюється зі значенням 0xf. Тепер якщо ви не знаєте з ходу десяткове значення цього шістнадцяткового числа, то у radare2 для вас є інший чудовий інструмент! Відкрийте новий термінал і використовуйте команду rax2 для конвертації значення 0xf у десяткове число.

Отже, другий пароль це 15! Спробуємо його і подивимося, чи працює він.

Здається, нам ще потрібно вводити і третій пароль. Давайте просунемося до наступного блоку коду в radare2 і подивимося, що нам потрібно робити. Це схоже на попередню перевірку пароля, яку ми робили. Ви можемо бачити, що запитується третій пароль, введення користувача пропускається через atoi і порівнюється зі значенням 0x539. Якщо ми пропустимо його через rax2, ми знайдемо, що це десятковий еквівалент 1337. Отже, ми вставляємо його як останній пароль і отримуємо:

Чудово! Це дало нам наш прапор! Якби це був справжній Capture the Flag, тоді нам потрібно було б ввести це значення для отримання окулярів. Ми змогли отримати паролі без необхідності запускати програму багато разів і нам навіть зовсім не довелося вгадувати паролі. Зворотний інжиніринг програми, алгоритм його роботи, дали нам всю необхідну інформацію. Реверс-інжиніринг – дуже зручний інструмент, який можна використовувати в будь-яких умовах, оскільки ви можете застосувати його, щоб дізнатися про все, що робить програму. Я сподіваюся, що введення в radare2 було корисним для тих, хто хоче почати на цій ниві.

 

Інші статті по темі
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.