C, C++ і DotNet decompile — основи реверсу. Рішення задач на реверсинг з г0от-мі. Частина 1

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

Організаційна інформація

Спеціально для тих, хто хоче дізнаватися щось нове і розвиватися у будь-якій із сфер інформаційної та комп’ютерної безпеки, я буду писати і розповідати про наступних категоріях:

  • PWN;
  • криптографія (Crypto);
  • мережеві технології (Network);
  • реверс (Reverse Engineering);
  • стеганографія (Stegano);
  • пошук та експлуатація WEB-вразливостей.

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

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

C, GCC32

Розглянемо найпростіший випадок. Це перше завдання на реверс.

image

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

image

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

image

Таким чином, із розташованих поруч рядків, є одна, схожа на пароль. Спробуємо її.

image

Завдання виконано. Здаємо пароль, отримуємо 5 очок.

image

ELFx86, Basic

Нас просять знайти пароль.

image

Завантажимо програму в відладчик IDA Pro (я користуюся версії 7.0) і натиснемо клавішу F5, щоб декомпілювати програму.

image

Таким чином введене ім’я порівнюється з рядком john, а пароль — з the ripper.

image

Таким чином ми вірно вирішили завдання і отримуємо свій пароль. Здаємо його і заробляємо ще 5 очок.

image

PEx86, 0 protection

Цього разу нам дають exe-шник.

image

Завантажуємо його в IDA Pro.

image

У програмі не збережена налагоджувальна інформація, тому ми не бачимо звичних нам назв функцій типу main. Давайте переглянемо рядки в програмі, для цього натиснемо +F12.

image

Бачимо повідомлення про введення правильного і неправильного паролів. Тепер ми можемо знайти блок з цієї рядком у коді і подивитися, яке умова йому передує. Кликнемо на рядок два рази.

image

Ми знаходимося в секції rdata. Давайте знайдемо всі посилання в коді на цю адресу. Для цього натиснемо X.

image

Таким чином в коді програми є всього одне звернення до нашої рядку. Натискаємо два рази і переходимо в код.

image

Ми знаходимося в основному коді програми. Декомпіліруем.

image

Тут відбувається перевірка якогось числа a2 і рядка a1. Давайте переведемо числове в символьне.

image

Для цього необхідно на числі натиснути R. І наш код змінився.

image

Рядок ми тепер знаємо, залишилося з’ясувати що за число a2. Подивимося всі посилання на дану функцію.

image

Вона викликається всього один раз.

image

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

image

Здаємо і отримуємо 5 очок.

image

ELF-C++, 0 protection

Нам пропонують вирішити програму на C++.

image

Відкриваємо в IDA Pro і переходимо до місця виклику повідомлення про правильний пароль. Давайте окрасим його в зелений колір.

image

Зробимо граф поменше.

image

Таким чином нам потрібно пройти дві умови. Розберемо їх. У першому умови кількість аргументів порівнюється з 1. Тобто в програму повинно бути більше одного аргументу (перший — це назва програми).

image

Розберемо друга умова.

image

Введена нами рядок порівнюється з рядком, що передається у якості параметра в функцію plouf. Декомпіліруем її.

image

Розбираємо код. Насправді a2 — є рядком. Таким чином, цикл виконується від i=0, до моменту поки що i-й елемент рядка а2 не буде дорівнює 0 (тобто поки не досягне кінця рядка).

V3 = a2[i] V5 = length(a3)
V6 = a3[i%v5]

Тобто рядок за адресою a1 буде дорівнює двом проксоренным рядками a2 і a3. Повернемося в головну функцію і знайдемо ці рядки.

image

Так нам потрібно визначити параметри var_C і var_10. Їх знайдемо трохи вище. Це рядки ипк_8048ВС4 і unk_8048DCC відповідно.

image

Знайдемо значення рядків.

image

Що ж, напишемо код, щоб їх проксорить.

image

Отримуємо пароль.

image

PE-DotNet, 0 protection

У цьому завданні нам пропонують реверсить .NET додаток.

image

Визначити його можна за допомогою утиліти file.

image

C# є декомпилируемым мовою, таким чином ми можемо отримати початковий проект. Зробити це можна з допомогою dnSpy.

image

Давайте відкриємо проект CrackMe і знайдемо функції та методи.

image

Метод Button1_Click перевіряє пароль натискання кнопки.

image

У вихідному коді знайдемо пароль. Проверем його.

image

Здаємо його.

image

На цьому поки все. Далі буде…

Джерело

Поділитися
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Реклама

119

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Схожі записи

Почніть набирати текст зверху та натисніть "Enter" для пошуку. Натисніть ESC для відміни.

Повернутись вверх