
Переполнение буфера ICMP во FreeBSD, PoC переполнения буфера FreeBSD
Шеллкод, используемый по умолчанию, — FreeBSD/x86-64 - execve - 28 bytes from Gitsnik. Замените его на свой собственный для начала.
Утилита ping, используемая для запроса ICMP ECHO_RESPONSE от хоста или шлюза, вызывается с указанием IPv4-цели (либо IPv4-host, либо IPv4-mcast-group) через обязательную дейтаграмму ECHO_REQUEST протокола ICMP. Дейтаграмма ECHO_REQUEST состоит из IP- и ICMP-заголовков, за которыми следуют структура "struct timeval" и переменное количество "pad"-байтов для заполнения пакета.
Согласно бюллетеню безопасности проекта FreeBSD, утилита ping получает из сети необработанные IP-пакеты для обработки ответов в функции pr_pack(). При обработке ответов ping восстанавливает IP-заголовок, ICMP-заголовок и, если он присутствует, "цитируемый пакет", представляющий пакет, вызвавший ошибку ICMP. Цитируемый пакет также включает IP-заголовок и ICMP-заголовок.
Функция pr_pack() копирует полученные IP- и ICMP-заголовки в стековые буферы для дальнейшей обработки. Однако она не учитывает возможность наличия заголовков IP-опций после IP-заголовка как в ответе, так и в цитируемом пакете. При наличии IP-опций pr_pack() переполняет буфер назначения на величину до 40 байт.
Утилита ping работает в пространстве пользователя, и при вызове команды ping выполняется бинарный файл, расположенный по пути /sbin/ping. Исходный код утилиты публично доступен в исходниках FreeBSD. Уязвимая функция pr_pack() выводит информацию об ответе ICMP-пакета в stdout в строковом формате, например: "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."

ICMP-пакет, как в запросе, так и в ответе, содержит IP-заголовки с необязательным полем Options, как показано на диаграмме выше. При вредоносной атаке эти IP-опции включены и заполнены ненулевыми байтами.
Если ICMP-пакет повреждён или намеренно изменён на пути к узлу назначения, а в исходном эхо-запросе включены IP-опции, функции pr_pack() не удаётся выделить на стеке достаточно места для размещения IP-опций, что приводит к переполнению стека.
При таких ошибках ответ от узла назначения также может включать "цитируемый пакет" в разделе данных, идентифицирующий конкретный пакет, вызвавший ошибку ICMP. Функция pr_pack() переполняет стек, когда цитируемый пакет содержит ICMP-заголовки.