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

Смещение. Термин смещение (offset) в основном относится к переполнению буфера на локальной машине. Поскольку на многопользовательских машинах традиционно установлена операционная система Unix, то замечено, что при рассмотрении переполнения буфера термин «смещение» в системе Unix используется гораздо чаще, чем в какой-либо другой. Злонамеренный пользователь машины UNIX всегда располагает какими-то учетными записями пользователя и, как правило, обычно стремится приобрести права суперпользователя root. У пользователя Unix всегда имеется возможность откомпилировать любую программу, в том числе и программу переполнения буфера. На локальной машине программа переполнения буфера иногда вычисляет базовый адрес собственного стека, предполагая, что он совпадает с базовым адресом атакованной программы. В результате у злоумышленника появляется удобная для него возможность указать в команде явного перехода (direct jump) смещение относительно вычисленного базового адреса. Если все сделано правильно, то величина «базовый адрес+смещение» (base+offset) в коде злоумышленника будет указывать на код жертвы.

Последовательность команд NOP. В командах перехода следует точно указать адрес перехода. Для этого нужно решить практически неразрешимую задачу определения адреса программного кода полезной нагрузки в памяти. Сложность состоит в том, что программный код полезной нагрузки каждый раз загружается в разные места памяти. Для системы UNIX повторная компиляция одного и того же пакета программ в различных средах, различными компиляторами с отличающимися установками оптимизации является общепринятой практикой. Что работает у одной копии программного обеспечения, может не работать у другой. Для того чтобы преодолеть подобные затруднения, рекомендуется использовать последовательность команд NOP (No Operation). Идея проста. NOP – это команда, которая ничего не делает, но занимает место в памяти. Кстати, первоначально команда NOP была создана для отладки. Поскольку команда NOP занимает один байт памяти, то она нечувствительна к проблемам упорядочивания байтов и их выравнивания.

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

Программный код полезной нагрузки

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

Кодирование. С трудом верится в целесообразность чрезмерного усложнения своей работы. Большинство известных программ переполнения буфера состоят из блоков нечитаемого машинного кода. Вряд ли это кому-то понравится. Есть гораздо лучший способ кодирования полезной нагрузки: напишите код полезной нагрузки на языке C, C++ или встроенном ассемблере, а затем скопируйте откомпилированный код в программный код полезной нагрузки. Многие компиляторы запросто объединяют код на ассемблере и C в единую программу. Подобный способ написания созданных на разных языках программ называется способом комплексирования программ (fusion technique).

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

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