Linux - статьи



              

Модификация таблицы системных вызовов


Текущие адреса системных вызовов находятся в таблице системных вызовов, в памяти, выделенной для ядра ОС. Адреса расположены в том же порядке, что и их функции и представлены в файле /usr/include/asm/unistd.h. Системные вызовы идентифицируются номером точки входа (ID), как мы видели в таблице выше.

Давайте начнем с примера. Когда вызывается системный вызов sys_write, его ID, равный 4, помещается в регистр eax и генерируется программное прерывание (int 0x80). Есть специальный обработчик прерывания, помещающий этот адрес в таблицу дескрипторов прерываний и отвечающий за обработку прерывания (снова int 0x80). Затем вызывается обработчик системных вызовов system_call. Этот обработчик, зная адрес таблицы системных вызовов и ID системного вызова (который находится в регистре eax), может определить реальный адрес запрошенного системного вызова. В реальности вызов обработчика системных вызовов более сложен, но я опустил некоторые детали, чтобы упростить эту статью.

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

Конечно, есть и другие проблемы. Мы должны убедиться, что текущие адреса системных вызовов не изменены, что мы в момент проверки уже не компрометированы. Как мы можем это проверить? Адреса системных вызовов всегда постоянны и не изменяются после перезагрузки операционной системы. Эти адреса определяются во время компиляции ядра, поэтому, зная оригинальные адреса, мы можем сравнить их с текущими адресами из таблицы системных вызовов. Эта информация об оригинальных адресах во время компиляции записывается в два файла. Первый из них, это файл System.map. Этот файл содержит таблицу символов и их соответствующие адреса. Второй файл это образ ядра, загружающийся в память ядра во время инициализации системы. Несжатая версия образа ядра находится в файле vmlinux-2.4.x и обычно находится в директории /boot или в директории, в которой происходит сборка ядра.




Содержание  Назад  Вперед