-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
create post: Как исследовать exe-файлы с Cutter. Практика обратной ра…
…зработки
- Loading branch information
Showing
1 changed file
with
90 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
--- | ||
title: "Как исследовать exe-файлы с Cutter. Практика обратной разработки" | ||
seoTitle: "Как исследовать exe-файлы с Cutter. Практика обратной разработки" | ||
seoDescription: "Простейший пример исследования и патчинга исполняемого файла с помощью Cutter" | ||
datePublished: Mon Oct 28 2024 05:43:19 GMT+0000 (Coordinated Universal Time) | ||
cuid: cm2slezmz000m09jm61op4tgh | ||
slug: kak-issledovat-exe-fajly-s-cutter-praktika-obratnoj-razrabotki | ||
cover: https://cdn.hashnode.com/res/hashnode/image/upload/v1729955922693/7c979845-80bd-4537-846e-d14120876e41.png | ||
tags: cpp, assembly, reverse-engineering, cutter, obratnaya-razrabotka, informacionnaya-bezopasnost | ||
|
||
--- | ||
|
||
В этой небольшой статье мы рассмотрим простейший пример исследования exe-файла методом [обратной разработки](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0) с помощью [Cutter](https://cutter.re/). Мы научимся искать в exe-файлах нужные данные и соответствующие им участки кода, а также попробуем выполнить инъекцию своих инструкций в exe-файл (патчинг). | ||
|
||
<div data-node-type="callout"> | ||
<div data-node-type="callout-emoji">💡</div> | ||
<div data-node-type="callout-text"><strong>Дисклеймер</strong>. Данная статья написана в <strong>образовательных целях</strong>. Она поможет начинающим разработчикам понять как скомпилированная программа может быть исследована. Подходит для практических занятий в области информационной безопасности.</div> | ||
</div> | ||
|
||
# Исследование exe-файла | ||
|
||
Cutter позволяет [дизассемблировать](https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B7%D0%B0%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80) содержимое 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") | ||
|
||
# Патчинг exe-файла | ||
|
||
Теперь изменим, то есть пропатчим, 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. Думаю, для начинающих разработчиков информация была полезной. Используйте эти знания при разработке собственных программ для обеспечения их минимальной устойчивости. | ||
|
||
--- | ||
|
||
*Читайте больше в моем Телеграм* *канале*: [***Так себе программист***](https://t.me/mediocre_developer) |