• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Троянизируем .exe приложение

Amphisbaena

floppy-диск
Забанен
Регистрация
10.02.2024
Сообщения
4
Реакции
10
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет, недавно я решил изучить тему геймхакинга, так как всегда любил игры и программирование. Недавно наткнулся на интересную технику, которая часто используется не только в относительно мирном геймхакинге, но и в кряке лицензионного ПО и для троянизации исполняемых файлов.

Программы которые нам понадобятся:

PE-bear (опционально)
x32/64dbg

Использовать я буду 32-битную версию putty, так как именно с него я начал изучение ассемблера, однако если вы хотите троянизировать 64-битную программу, то вся разница будет лишь в том, что на стадии генерации шеллкода нужно будет указать 64 бита, и в том что в x86-64 нет команд pushad/pushfd, таким образом придется вручную сохранить каждый из регистров.

Суть техники в том, что мы должны найти или создать достаточно большую область, где мы сможем модифицировать код программы так, чтобы перед исполнением самого оригинального кода программа исполняла произвольный код, который мы заложим в нее, а затем уже делала то, что она должна была.

В данном гайде будет показан способ с созданием новой секции, куда будет залит шеллкод. Главное преимущество этого подхода в том, что иногда для шеллкода может не найтись достаточно нулевых байтов, особенно если мы будем использовать Donut, но об этом попозже. Минусы заключаются в том, что вес программы увеличится и антивирусы могут с подозрением отнестись к выделенной секции.

Поэтому если вы используете небольшой шеллкод, то в конце .text секции будет более чем достаточно свободного места.

Очевидно, что исходный код троянизируемого приложения нам никто не даст, то придется использовать дебаггер, для редактирования кода на языке ассемблера.

Первым делом открываем PE-bear и в левом верхнем углу выбираем file --> load PEs, затем ищем наш экзешник в проводнике

1709397969362.png


После того как открыли файл слева появится информация о секциях. Нажимаем пкм по Sections и жмем Add a new section.

1709398016524.png


Называем секцию и выделяем под нее место. 1000 байт более чем достаточно для метасплойтовского шелла, однако, в зависимости от пейлоуда вам может понадобится намного больше места.

1709398099983.png


Далее пкм по названию нашей проги и выбираем save executable as. Более PEbear нам не понадобится.

1709398156094.png


Теперь сгенерируем полезную нагрузку для которой мы выделили место

1709398181408.png


Записываем пейлоуд и начинаем слушать на порте который мы определили для шелла.

1709398225612.png


Далее переходим в x32dbg жмем файл –> открыть и ищем в проводнике нашу программу с новой секцией.

1709398246647.png


Перед нами открывается ассемблированный код программы. Выглядит страшно, но не стоит пугаться сейчас я все объясню. В самой первой колонке адреса инструкций в шестнадцатиричном формате, следующая за ней колонка это инструкции для процессора в шестнадцатиричной системе, следующая колонка это интерпретация этих инструкций на языке ассемблера.

1709398335675.png


Далее однократно нажимаем на кнопку выполнить (синяя стрелочка, подчеркнутая красным цветом). Нас переносит в точку входа в программу. Сразу же ставим здесь брейкпоинт для более удобной навигации по программе. Для этого нажимаем на точку рядом с адресом точки входа.

1709398463473.png


Переходим во вкладку карта памяти, где нас интересует название созданной нами секции.

Жмем пкм по ней --> перейти к дизассемблированному коду

1709398528733.png


В этой секции записываем адрес начала, чуть позже он нам понадобится.

1709398581883.png



Переходим во вкладку точки остановки и из нее возвращаемя к точке входа в программу. Теперь сохраняем инструкцию сразу же под точкой входа в программу.

1709398621210.png


После этого нажимаем пробел и вписываем инструкцию jmp с адресом пока что пустой секции для шеллкода. Жмем OK. Далее всплывет еще одно окошко, где предложат заменить следующую инструкцию, просто закройте его.

1709398840481.png


Дважды нажимаем шаг с обходом и оказываемся в новой секции

1709398876448.png


Далее необходимо сохранить состояние регистров и флагов командами pushad pushfd

1709398900424.png


После этого снова делаем 2 шага по коду программы и после исполнения команд pushad pushfd записываем значение регистра esp указывающего на текущую позицию в стеке.

1709398971408.png


Теперь выбираем следующую инструкцию и зажав лкм от души тянем вниз

1709399127984.png


Далее вставляем шеллкод в выделенное пространство

1709399156711.png


Забегая вперёд скажу, что по какой то причине метасплойтовский шеллкод не дает программе продолжить свое нормально выполнение. Так как сам я только начинаю изучать ассемблер, то диагностировать в чем причина подобного поведения я не смог. Есть подозрение, что это связано с аттрибутом EXITFUNC, который можно указать при генерации шеллкода. Тем не менее, проблема решается если убрать две команды dec esi и call ebp заменив их на nop. Должно это выглядит вот так.

1709399208392.png


На данном этапе бекдор уже готов за исключением того, что необходимо вернутся к коду оригинальной программы, перед этим выровняв регистры.

Ставим брейкпоинт последнем nop`е и жмем кнопку выполнить

1709399226706.png


Если сейчас вернуться в линукс то можно увидеть, что мы получили шелл

1709399244976.png


Далее возвращаемся в дебаггер и снимаем состояние esp регистра. После этого необходимо вычесть из значения esp перед исполнением шеллкода значение esp после.

1709399270926.png


Далее восстанавливаем значение esp до уровню, который был до исполнение шеллкода при помощи команды add

1709399306487.png


Далее возвращаем значения регистров командами popad и popfd

1709399323530.png


Теперь регистры находятся в таком же состоянии как и до того как мы начали исполнения шеллкода. Осталось только выполнить ту команду которую мы заменили на jmp и вернутся обычному исполнению кода.

Команда была push cave.477B70. Cave в данном случае это просто название секции, его писать не надо, так что просто push 477B70

Возвращаемся к точке входа и копируем адрес прямо под прыжком к шеллкоду.

1709399367678.png


Далее при помощи jmp переходим к этому адресу.

1709399394215.png


На этом всё, осталось только сохранить полученный файл. Для этого нажимаем на пластырь в верху экрана и жмем исправить файл

1709399479744.png


1709399459270.png


Теперь осталось проверить наш бекдор в полевых условиях.


1709399503280.png



1709399513856.png



Поздравляю всех, у кого получилось добиться желаемого результата. Если у вас все получилось, то вы должны были уже заметить, что дефендер триггерится на получившийся файл. Оно и не удивительно, учитывая, что мы используем стандартный метасплойтовский шеллкод, который к тому же никак не был закодирован для того, чтобы избежать обнаружения по сигнатуре. Да и даже если как следует закодировать полезную нагрузку, то избежать обнаружения от серьезных антивирусных систем не получится.

Есть 2 выхода из данной ситуации. Либо написать свой кастомный шеллкод (о чем я планирую выпустить статью в будущем), но это очень затратно по времени и быстро реализовать не получится, либо можно сконвертировать конкретный файл в шеллкод при помощи Donut или pe_to_shellcode.

Пробовал я только Donut, но он мне не очень понравился в виду результирующего веса шеллкода, ничуть не уступавшего весу программы из которой он был сделан.

github.com/TheWover/donut

Pe_to_shellcode протестировать просто не дошли руки поэтому просто оставлю здесь на случай, если кому-то эта тулза понравится больше чем Donut.

github.com/hasherezade/pe_to_shellcode

Если вы знакомы с похожими по функционалу тулзами, то можете поделиться ими в комментариях.

Обычно эта техника используется пиратам, репакерами, и прочими “благородными” кракерами, которые денно и нощно корпят над кодом лицензионных программ, ради того, чтобы мы с вами смогли поиграть в любимую игру или отредактировать фото или видео без необходимости платить жадным корпорациям.

Также иногда создаются фишинговые ресурсы, имитирующие сайты популярных бесплаьных программ типа обса или винрара, которые порой в поисковой строке высвечиваются и выше оригинальных. Особенно, на мой взгляд, выгодно проворачивать такое с криптокошельками.

Если вы посчитали эту статью полезно, то можете поддержать автора
BTC:bc1q5caeczraet2avfq0ww407m8t06k9rydpq76mrn


Автор: Amphisbaena
Специально для xss.pro
 

Вложения

  • 1709399429436.png
    1709399429436.png
    18.8 КБ · Просмотры: 11
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх