Добро пожаловать в очередную статью, посвященную реверс-инжинирингу. Мы уже рассказывали об инструменте для реверс-инжиниринга — Ghidra. Сегодня я покажу простой пример реверс-инжиниринга программы на языке C с использованием Ghidra. Наша цель: найти пароль, анализируя бинарник, без исходного кода.
Еще по теме: Реверс прошивок роутера
Что такое реверс инжиниринг
Реверс-инжиниринг (Reverse engineering) — это процесс анализа программного или аппаратного обеспечения с целью понять, как оно работает, раскрыть его конструкцию и функционал.
При реверс инжиниринге кода на языках Си и Си++ необходимо разобрать код на составные части, проанализировать каждую из них, а затем собрать заново, чтобы понять, как работает программа. Для этого часто используются такие инструменты реверс-инжиниринга, как Ghidra, IDA Pro или OllyDbg.
Дизассемблирование кода заключается в том, чтобы взять скомпилированный код и разложить его на инструкции языка ассемблера. Это может быть непростым процессом, поскольку код может быть оптимизирован и замаскирован, чтобы сделать его более сложным для реверса.
Статья в образовательных целях и предназначена для обучения этичных хакеров. При написании статьи использовались личные устройства автора. Использование Ghidra для несанкционированного взлома программ является незаконным. Ни редакция spy-soft.net, ни автор не несут ответственности за ваши действия.
Один из распространенных приемов, используемых при реверсе Си и Си++, называется трассировкой функций. Она заключается в отслеживании выполнения программы с целью определения того, как она работает. Для этого необходимо установить точки останова в определенных местах кода и затем проследить за выполнением программы. Это может помочь обнаружить потенциальные уязвимости в защите или понять, как работает программа.
Другая техника, используемая при реверсе, называется патчинг кода. Она заключается в модификации кода программы с целью изменения ее поведения. Это может быть сделано для исправления ошибок, добавления новых возможностей или обхода защиты.
Что такое Ghidra
Ghidra — это инструмент для реверс-инжиниринга программного обеспечения, разработанное и предоставленное в свободный доступ Национальным управлением по информационной безопасности США (NSA). Это программное обеспечение предназначено для анализа исполняемого кода, понимания его структуры и функций, а также для поиска уязвимостей и создания новых инструментов.
Основные возможности Ghidra:
- Декомпилятор и дизассемблер.
- Мощные аналитические возможности.
- Графический пользовательский интерфейс.
- Многоплатформенность.
- Скриптинг и расширяемость.
Ghidra — это полезный инструмент для специалистов ИБ, разработчиков и всех, кто занимается анализом программного обеспечения.
Код защищенной программы на C
В качестве примера будем использовать следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include #include char VT_RED[] = "\033[31m"; char VT_GREEN[] = "\033[32m"; char VT_RESET[] = "\033[0m"; int checkKey(char *key) { return strcmp(key, "secretkey") == 0; } // Функция main int main() { // Буфер для ключа char key[100]; // Запрашиваем у пользователя ключ printf("%s[ERROR]%s продукт не активирован\n", VT_RED, VT_RESET); printf("Введите ключ активации: "); scanf("%s", key); // Проверяем, правильный ли ключ if (checkKey(key)) { // Если правильный, сообщаем об этом printf("%s[OK]%s Продукт успешно активирован\n", VT_GREEN, VT_RESET); printf("ASOC{l4_cl4v3_3st4_3n_3l_c0d1g0}\n"); } else { // В противном случае предупреждаем пользователя printf("%s[ERROR]%s Неверный ключ\n", VT_RED, VT_RESET); } return 0; } |
Давайте разберем код:
1 Подключение библиотек:
1 2 |
#include #include |
Эти строки подключают стандартные библиотеки языка C, которые понадобятся для работы с вводом-выводом ( stdio.h) и обработки строк ( string.h).
2 Определение цветов:
1 2 3 |
char VT_RED[] = "\033[31m"; char VT_GREEN[] = "\033[32m"; char VT_RESET[] = "\033[0m"; |
Здесь определены строки для управления цветом текста в консоли с использованием ANSI escape-последовательностей. Это позволит выводить текст красным ( VT_RED), зеленым ( VT_GREEN) или сбрасывать цвета ( VT_RESET).
3 Функция для проверки ключа:
1 2 3 |
int checkKey(char *key) { return strcmp(key, "secretkey") == 0; } |
Это функция, которая принимает строку key и сравнивает ее с предопределенным ключом secretkey. Если строки совпадают, функция возвращает 1 (true), в противном случае (false).
4 Функция main:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
int main() { char key[100]; // Буфер для хранения ключа printf("%s[ERROR]%s продукт не активирован\n", VT_RED, VT_RESET); printf("Введите ключ активации: "); scanf("%s", key); if (checkKey(key)) { printf("%s[OK]%s Продукт успешно активирован\n", VT_GREEN, VT_RESET); printf("ASOC{l4_cl4v3_3st4_3n_3l_c0d1g0}\n"); } else { printf("%s[ERROR]%s Неверный ключ\n", VT_RED, VT_RESET); } return 0; } |
- main() — это главная функция, которая начинает выполнение программы.
- Создается массив key размером 100 символов для хранения ключа активации.
- Выводится сообщение «продукт не активирован» с красным цветом.
- Пользователь вводит ключ активации.
- Вызывается функция checkKey(key) для проверки ключа.
- В зависимости от результата проверки выводится сообщение о успешной активации продукта с зеленым цветом и некий текст, либо сообщение о неверном ключе с красным цветом.
- Функция возвращает 0, что обозначает успешное завершение программы.
Пример реверс инжиниринга с использованием Ghidra
После установки Ghidra на Windows или Kali Linux откройте бинарник. После чего появится вот такой экран:
Теперь давайте воспользуемся очень простой техникой реверса программы, перейдем к функциям:
И найдем функцию main, главная функция в C (всегда является точкой входа программы).
Проверим содержимое:
В разделе декомпиляции вы можете увидеть фрагмент кода:
Это простой код, который считывает пользовательский ввод с запросом пароля, когда программа получает пользовательский ввод, то сохраняет его в переменной iVarl, здесь же отправляет ключ в функцию CheckKey.
Перейдем в раздел functions и найдем функцию CheckKey:
Она здесь.
Теперь в разделе декомпилятора мы видим следующее:
Программа взломана, пароль — secretkey.
Заключение
В целом, реверс-инжиниринг — это важная техника для понимания принципов работы программного и аппаратного обеспечения. Используя такие инструменты, как Ghidra, и такие методы, как трассировка функций и патчинг кода, можно обнаружить потенциальные уязвимости в защите.
ПОЛЕЗНЫЕ ССЫЛКИ: