
Сегодня мы рассмотрим несколько способов внедрения шелл-кода в исполняемый файл под Windows (Portable Executable). Конечно это будет не совсем прям ручное внедрение, мы будем пользоваться редактор двоичных файлов Hiew ( простонародье Хью ). Так же нам потребуется сам шелл-код в формате bin, в данном примере этот код запускается Калькулятор в Windows. Ну и файл жертва, в нашем случае этот.
Шелл-код — это двоичный исполняемый код, который выполняет определенную задачу еще его называют Пейлоад (payloads; полезная нагрузка).
В преведущей статье мы разобрались как устроен исполняемый файл .EXE (PE). Если кратко, из заголовка и секций. Давайте разберем с вам несколько простых способов внедрить код:
- Внедрение в свободное место секции.
- Расширение секции.
- Добавление новой секции.
Внедрение в свободное место.
Запуская программу операционная система создает процес и выделяет ей виртуальную оперативную память куда загружается программа. Виртуальная в том смысле что это изолированный участок оперативной памяти имеющий свое адресное пространство. Память имеет постраничную организаций, то есть блоками определенного размера ( в Windows это вроде 4 килобайта), все не занятое пространство страницы заполняется Null байтами. Так же у этит страниц есть атрибуты ( чтение , запись , исполнение). Например константы удобно хранить в странице с атрибутом только на чтение, они точно не поменяются, так о на заботиться операционная система. Собственно эти атрибуты есть у секций в исполняемом фале, какая в какую страницу будет записана.
Что бы посмотреть атрибуты нажимаем F8 затем F6 выбираем секцию и жмем F2.

И опять же из за страничной организации памяти есть выравнивание, даже если данные занимают у нас 20 байт, все равно будет выделена страница памяти( Выравнивание памяти). Так же есть выравнивание файла, данные в секции занимают 20 байт. Но физически в файл компилятор добавит Null байты до параметра выравнивания.


Вот в это свободное место мы и добавим наш шелл-код. Для этого выделяем участок в нулями скажем с адреса 2A70.
Что бы выделить участок кода нажмите Shift + * , после выделения опять же Shift + * .
Затем нужно вернуть маркер на начало выделенного участка и скопипастить из файла код комбинацией Ctrl + F2.
Теперь нужно изменить точку запуска файла на наш внедренный участок. Заходим в заголовок (F8) нажимаем F3 и редактируем поле Entry Point, не забываем сохранить изменения кнопкой F9.
Готово. Не забудьте отключить антивирус, он очень не любит такие вещи и теперь будет ругаться на ваш файл. Давайте отправим на VirusTotal )))

Добавление новой секции.
Свободное место бывает не всегда. Часто программа плотно упакована и у нас просто нету места куда можно добавить код ( особенно если он достаточно большой). самое простой вариант это добавить новую секцию.
Первым делом добавляем в конец файла 4086 байт, если вы помните это файловое смещение секции в файле (0x1000)
Для добавления нажмите Shift+F3 .
Затем заходим в заголовок (F8), секции (F6) и добавляем новый заголовок (F4). Дальше нам нужно отредактировать его название и данные о размере, атрибутах, памяти.
Но размер файла изменился , теперь нам надо указать новые данные в заголовке.

Такой вариант не понравился больше VirusTotal.

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