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

Аналогично обычной программе, программный код полезной нагрузки может при необходимости загрузить динамическую библиотеку и использовать ее функции, как это было показано в примере программы переполнения буфера для Windows NT.

В Windows NT есть пара функций, которыми всегда может воспользоваться программа: LoadLibrary() и GetProcAddressQ. Они позволяют загрузить любую динамически подключаемую библиотеку DLL и вызвать функцию. В системе UNIX для этих целей служат функции dlopenQ и dlsymQ.

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

Функции загрузки библиотеки LoadLibraryQ или dlopenQ загружают совместно используемую часть кода в доступную программе память. Совсем не обязательно, что загружаемый код будет выполняться, но после загрузки он доступен для использования. В основном загружаемый код впоследствии выполняется.

Функции GetProcAddressQ и dlsymQ определяют в таблице функций динамически подключаемой библиотеки адрес экспортируемой функции. Для поиска в таблице функций используются символические имена и, возможно, необязательные порядковые целые числа -индексы. Входным параметром этих функций является имя искомой функции или ее индекс, а выходным - адрес искомой функции.

Как правило, перечисленные функции загружают в память всякую динамически подключаемую библиотеку DLL. После загрузки библиотеки можно получить адрес любой из ее функций по имени. Поэтому пока доступна динамически подключаемая библиотека, программисту предоставляется очень гибкий и удобный инструмент написания программ.

Известны два основных способа поиска функции при использовании динамических библиотек. Можно или жестко запрограммировать адреса функций, или найти их в таблице импортируемых символов (таблице перехода) атакованного процесса во время его выполнения.

Программа с жестко запрограммированными адресами функций работает быстро и безошибочно, но, как правило, непереносима с одной платформы на другую. Для Windows NT это означает ограничение работоспособности программы переполнения буфера рамками единственного служебного пакета service pack и составом операционной системы OS combo. В зависимости от используемой платформы и библиотек в UNIX она может вообще не заработать.

Второй способ основан на определении адреса функции по таблице импортируемых символов атакованного процесса во время его выполнения. В этом случае программа работает лучше и переносима на другие платформы, но больше по размеру. В условиях недостатка памяти это серьезный минус, который может привести к непригодности способа. Для поиска адреса функции в управляющем коде должны быть предусмотрены возможности поиска. Лучше найти уже загруженную в память функцию определения адреса функции и использовать ее. Конечно, этот способ предполагает, что функция загружена в память. Часто так и бывает, но вообще это дело случая. Для успешного применения способа необходимо ясно представлять используемый в операционной системе механизм редактирования связей. Для Windows NT он реализован в виде переносимого выполнимого формата РЕ (portable executable format). Для большинства систем UNIX это выполнимый формат редактирования связей ELF (executable and linking format).

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

Перезапись указателя функции в стеке | Защита от хакеров корпоративных сетей | Вложенный программный код полезной нагрузки


Защита от хакеров корпоративных сетей



Новости за месяц

  • Июнь
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс