Как исследовать exe-файлы с Cutter. Практика обратной разработки
Table of contents
В этой небольшой статье мы рассмотрим простейший пример исследования exe-файла методом обратной разработки с помощью Cutter. Мы научимся искать в exe-файлах нужные данные и соответствующие им участки кода, а также попробуем выполнить инъекцию своих инструкций в exe-файл (патчинг).
Исследование exe-файла
Cutter позволяет дизассемблировать содержимое exe-файла и предоставляет удобные инструменты для работы с ним. Разберем основные моменты на конкретном примере.
Пусть у нас есть программа cutter_example.exe, которая при запуске требует пароль доступа. Вводим пароль "123" и получаем ответ "Wrong password. Closing". Попробуем найти правильный пароль внутри exe-файла.
После неудачной попытки ввода пароля у нас появились зацепки: строки "Enter admin password:" и "Wrong password. Closing". Дизассемблируем exe-файл и найдем их в его коде.
Запускаем Cutter и подаем ему на вход наш cutter_example.exe.
В следующем окне выставляются настройки анализа. Можно ничего не менять и нажать ОК. Начнется анализ.
Через некоторое время Cutter покажет окно с дизассемблированным кодом.
Теперь можем искать строки. Переходим на вкладку Strings (1) и вводим в поле фильтра строку "password" (2). Результат (3) как раз содержит интересующие нас строки.
Выделяем первую строку и ищем ее использование в коде через окно просмотра перекрёстных ссылок. Окно вызывается либо через контекстное меню выбранной строки, либо по нажатию клавиши "X". В окне мы увидим, что строка используется только в одном месте кода в инструкции lea
(получение адреса строки). То, что нужно. Двойным кликом по ссылке (1) переходим к этому месту в основном окне.
Здесь у нас самое интересное - работа с кодом. Мы видим, что это функция main
. После строки "Enter admin password:" (1) есть вызов оператора std::cin
(2), отвечающего за ввод пароля. Спускаемся еще ниже до первой инструкции сравнения cmp
(3). По этой инструкции, если сравниваемые значения не равны, то выполняется условный прыжок jne
к выводу строки "Wrong password. Closing" (4). А если равны, то идем прямиком к выводу сообщения "Hello admin!" (4). В инструкции сравнения (3) участвует регистр r9
. Немного выше находим значение, которое ему присваивается - это строка [str.123456]
(5). Вероятно “123456” как раз и есть тот самый пароль.
Запускаем cutter_example.exe и пробуем ввести пароль "123456". Как и ожидалось, все получилось!
Патчинг exe-файла
Теперь изменим, то есть пропатчим, cutter_example.exe так, чтобы доступ предоставлялся при вводе любого пароля. Самый простой путь - это заменить условные инструкции на пустые nop
-ы, которые при выполнении будут просто пропущены.
Выбираем инструкцию с первым условным прыжком jne
, которая ведет нас к выводу строки "Wrong password. Closing", и через контекстное меню заменяем ее на nop
.
При изменении может выскочить окно с подтверждением перехода в режим записи. Подтверждаем.
После подтверждения инструкция jne
была успешно заменена на два nop
-а (1). Их два, потому что инструкция jne
занимает два байта, а nop
- один. То есть для выравнивания требуется заполнить все пространство изменяемой инструкции.
Немного ниже есть еще один условный прыжок jne
(2). Его тоже уберем на всякий случай, чтобы нам ничего не мешало на пути к "Hello admin!".
Получаем такую картину.
Теперь закрываем окно Cutter и снова пробуем запустить cutter_example.exe. Вводим заведомо неправильный пароль "1234" и вуаля, доступ получен!
Выводы
Вот таким нехитрым способом могут быть исследованы и пропатчены исполняемые файлы. Рассмотренный пример очень простой, но он наглядно демонстрирует возможности систем обратной разработки, в частности Cutter. Думаю, для начинающих разработчиков информация была полезной. Используйте эти знания при разработке собственных программ для обеспечения их минимальной устойчивости.
Читайте больше в моем Телеграм канале: Так себе программист
Subscribe to my newsletter
Read articles from Alexander Trotsenko directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Alexander Trotsenko
Alexander Trotsenko
Software Developer