title | seoTitle | seoDescription | datePublished | cuid | slug | cover | tags |
---|---|---|---|---|---|---|---|
Как исследовать exe-файлы с Cutter. Практика обратной разработки |
Как исследовать exe-файлы с Cutter. Практика обратной разработки |
Простейший пример исследования и патчинга исполняемого файла с помощью Cutter |
Mon Oct 28 2024 05:43:19 GMT+0000 (Coordinated Universal Time) |
cm2slezmz000m09jm61op4tgh |
kak-issledovat-exe-fajly-s-cutter-praktika-obratnoj-razrabotki |
cpp, assembly, reverse-engineering, cutter, obratnaya-razrabotka, informacionnaya-bezopasnost |
В этой небольшой статье мы рассмотрим простейший пример исследования exe-файла методом обратной разработки с помощью Cutter. Мы научимся искать в exe-файлах нужные данные и соответствующие им участки кода, а также попробуем выполнить инъекцию своих инструкций в exe-файл (патчинг).
Cutter позволяет дизассемблировать содержимое exe-файла и предоставляет удобные инструменты для работы с ним. Разберем основные моменты на конкретном примере.
Пусть у нас есть программа cutter_example.exe, которая при запуске требует пароль доступа. Вводим пароль "123" и получаем ответ "Wrong password. Closing". Попробуем найти правильный пароль внутри exe-файла.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956501920/04840c34-6311-49a5-b9ab-bf61f812fc0f.png align="left")
После неудачной попытки ввода пароля у нас появились зацепки: строки "Enter admin password:" и "Wrong password. Closing". Дизассемблируем exe-файл и найдем их в его коде.
Запускаем Cutter и подаем ему на вход наш cutter_example.exe.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956569920/33472ccb-19a4-4c9d-92f2-439f24e30757.png align="center")
В следующем окне выставляются настройки анализа. Можно ничего не менять и нажать ОК. Начнется анализ.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956614076/963444c5-066d-4177-b960-300d627247eb.png align="left")
Через некоторое время Cutter покажет окно с дизассемблированным кодом.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956632832/1e2f0aec-7c3e-4e0f-8042-7fd3138e987f.png align="left")
Теперь можем искать строки. Переходим на вкладку Strings (1) и вводим в поле фильтра строку "password" (2). Результат (3) как раз содержит интересующие нас строки.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956656649/afd75af4-c96d-48bb-835c-b7a017873338.png align="left")
Выделяем первую строку и ищем ее использование в коде через окно просмотра перекрёстных ссылок. Окно вызывается либо через контекстное меню выбранной строки, либо по нажатию клавиши "X". В окне мы увидим, что строка используется только в одном месте кода в инструкции lea
(получение адреса строки). То, что нужно. Двойным кликом по ссылке (1) переходим к этому месту в основном окне.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956689694/e28f9495-b7f0-4632-95e2-1bebe9726992.png align="left")
Здесь у нас самое интересное - работа с кодом. Мы видим, что это функция main
. После строки "Enter admin password:" (1) есть вызов оператора std::cin
(2), отвечающего за ввод пароля. Спускаемся еще ниже до первой инструкции сравнения cmp
(3). По этой инструкции, если сравниваемые значения не равны, то выполняется условный прыжок jne
к выводу строки "Wrong password. Closing" (4). А если равны, то идем прямиком к выводу сообщения "Hello admin!" (4). В инструкции сравнения (3) участвует регистр r9
. Немного выше находим значение, которое ему присваивается - это строка [str.123456]
(5). Вероятно “123456” как раз и есть тот самый пароль.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956705988/41d73a27-7a6c-4a4c-8fca-947de0177818.png align="left")
Запускаем cutter_example.exe и пробуем ввести пароль "123456". Как и ожидалось, все получилось!
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956723235/94d5d7c8-89fd-4ed5-8dbe-021667cdcefc.png align="left")
Теперь изменим, то есть пропатчим, cutter_example.exe так, чтобы доступ предоставлялся при вводе любого пароля. Самый простой путь - это заменить условные инструкции на пустые nop
-ы, которые при выполнении будут просто пропущены.
Выбираем инструкцию с первым условным прыжком jne
, которая ведет нас к выводу строки "Wrong password. Closing", и через контекстное меню заменяем ее на nop
.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956790844/b26a806d-4c10-4efa-aa05-b6ae0828e08d.png align="left")
При изменении может выскочить окно с подтверждением перехода в режим записи. Подтверждаем.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956805673/d57776c8-f5ab-4006-b993-51e3548173dc.png align="left")
После подтверждения инструкция jne
была успешно заменена на два nop
-а (1). Их два, потому что инструкция jne
занимает два байта, а nop
- один. То есть для выравнивания требуется заполнить все пространство изменяемой инструкции.
Немного ниже есть еще один условный прыжок jne
(2). Его тоже уберем на всякий случай, чтобы нам ничего не мешало на пути к "Hello admin!".
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956832688/feb7ac92-1a77-433d-98ff-92c50abe435c.png align="left")
Получаем такую картину.
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956854964/b90ac2b8-dea2-4531-8d51-534b77e1ffa0.png align="left")
Теперь закрываем окно Cutter и снова пробуем запустить cutter_example.exe. Вводим заведомо неправильный пароль "1234" и вуаля, доступ получен!
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1729956881478/94ed8647-1817-46ba-a0c2-1da9a1bfc080.png align="left")
Вот таким нехитрым способом могут быть исследованы и пропатчены исполняемые файлы. Рассмотренный пример очень простой, но он наглядно демонстрирует возможности систем обратной разработки, в частности Cutter. Думаю, для начинающих разработчиков информация была полезной. Используйте эти знания при разработке собственных программ для обеспечения их минимальной устойчивости.
Читайте больше в моем Телеграм канале: Так себе программист