Skip to content

Commit

Permalink
create post: Как исследовать exe-файлы с Cutter. Практика обратной ра…
Browse files Browse the repository at this point in the history
…зработки
  • Loading branch information
trots committed Oct 28, 2024
1 parent b01b2f9 commit 9883237
Showing 1 changed file with 90 additions and 0 deletions.
90 changes: 90 additions & 0 deletions cm2slezmz000m09jm61op4tgh.md
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)

0 comments on commit 9883237

Please sign in to comment.