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

Обычно модули скрывают от пользователя детали реализации полезной нагрузки. Ситуация немного меняется, когда дело доходит до необходимости воспользоваться эксплоитом, для которого не существует модулей Metasploit, но есть, например, PoC на Python или любом другом языке.

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

Одна из опций при генерации шелл-кода с msfvenom — это выбор энкодера. Шелл-кодинг — не самая простая для понимания тема, поэтому даже такая вспомогательная часть этого процесса, как энкодинг полезной нагрузки, порождает огромное количество мифов и заблуждений.

 

Buffer Overflow

Поскольку тема шелл-кодинга неотделима от эксплуатации бинарных уязвимостей, давай рассмотрим небольшой фрагмент кода, содержащего в себе типичный Stack-based Buffer Overflow.

#include <stdio.h>
#include <string.h>

int main (int argc, char** argv) {
    char buffer[100];
    strcpy(buffer, argv[1]);

    return 0;
}

Уязвимость этого кода происходит из функции strcpy(char *destination, const char *source). Вот так выглядит описание этой функции в официальной документации:

Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point). To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.

В двух словах: если длина строки (то есть разница между адресом первого байта строки и адресом первого нулевого байта, именуемого NULL-терминатором), на которую указывает argv[1], больше размера буфера buffer, то произойдет тот самый Stack-based Buffer Overflow.


Если рандомизация адреса стека отключена, атакующий может предсказать то место, куда будут записаны данные. Таким образом, манипуляциями с argv[1] можно записать полезную нагрузку в стек, а также подменить адрес возврата так, чтобы передать ей управление.


Если защита от исполнения данных также отключена, то шелл-код будет исполнен.

Хорошим примером полезной нагрузки будет шелл-код, запускающий командную оболочку sh, который можно сгенерировать с помощью msfvenom.


Здесь и начинается все интересное.

 

Зачем нужны энкодеры?

Если передать нашей программе строку вида argv[1] = shellcode + "BBBB" + shellcode_address, то переполнение не произойдет. Это связано с тем, что шестнадцатый байт шелл-кода равен \x00, так что копирование этого буфера в стек прекращается после 15 байт.

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


Оставить мнение

Check Also

Ghidra vs crackme. Обкатываем конкурента IDA Pro на примере решения хитрой крэкми с VM

Чтобы испытать новое средство для реверса, созданное в стенах АНБ США, я решил поломать за…