Читаем Защита от хакеров корпоративных сетей полностью

Для преобразования прототипа программного кода полезной нагрузки на языке C в код ассемблера воспользуемся дизассемблером или отладчиком. Прежде всего следует решить, как вызвать экспортируемую из динамически подключаемой библиотеки user32.dll функцию MessageBox. Нельзя надеяться на то, что библиотека user32.dll будет импортирована в уязвимую программу, поэтому следует предусмотреть ее загрузку с помощью функции LoadLibraryA. Функция LoadLibraryA используется на платформах Win32 для загрузки динамически подключаемых библиотек DLL в память процесса. Данная функция экспортируется из библиотеки kernel32.dll, которая уже связана с атакуемой программой. Об этом говорит отчет работы утилиты dumpbin. Итак, в прототипе программного кода полезной нагрузки на языке C сначала следует загрузить динамически подключаемую библиотеку user32.dll, а затем вызвать функцию MessageBox. После внесения необходимых дополнений прототип выглядит так:

LoadLibraryA(“User32”); MessageBox(NULL, “hi”, NULL, MB_OK);

Функция LoadLibraryA по умолчанию подразумевает расширение имени динамически подключаемой библиотеки «.dll», поэтому имя библиотеки user32.dll указано без расширения. Это позволит уменьшить размер программного кода полезной нагрузки на 4 байта.

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

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

LoadLibraryA(“User32”);

MessageBox(NULL, “hi”, NULL, MB_OK);

ExitProcess(1);

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже