Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #87, МАРТ 2006 г.

Системный шпионаж в *nix часть 1

Крис Касперски ака мыщъх

Хакер, номер #087, стр. 087-134-3


"Глобальность" перехвата воздействует на все процессы, и кривая "обертка" рушит ось так, что только дампы летят. Давай не будем трогать системные библиотеки, а вместо этого изменим переменную LD_LIBRARY_PATH в окружении "подопытного" процесса. Она специально предусмотрена на тот случай, если отдельно взятому приложению требуется предоставить свой набор библиотек (статический и динамический загрузчики сначала ищут библиотеку в путях, указанных LD_LIBRARY_PATH, и только если там ее не оказывается, переходят к файлу /etc/ld.so.conf, а затем к путям /lib и /usr/lib), но, если "подопытный" процесс попытается загрузить библиотеку по абсолютному пути, он сможет вырваться из-под нашего контроля!

Перспективнее всего осуществлять перехват путем прямой модификации памяти подопытного без обращения к ptrace. Как это можно сделать? Первым в голову приходит файл /proc/<pid>/mem, однако в большинстве систем он недоступен даже root'у, и приходится спускаться на уровень ядра, что сильно напрягает. Хакерские источники упоминают о двух других интересных файлах: /dev/mem (образ физической памяти компьютера до трансляции виртуальных адресов) и /dev/kmem (образ виртуальной памяти ядра). Файл /dev/kmem с прикладного уровня обычно недоступен, и никаких библиотек прикладного уровня здесь нет, поэтому нам он совершенно неинтересен, а вот /dev/mem мы рассмотрим поподробнее.

[/dev/mem]

Чтение документации ("man mem") показывает, что файл /dev/mem имеется практически на всех *nix-подобных системах, а если его вдруг нет, то он может быть создан в любой момент следующими командами:

# mknod -m 660 /dev/mem c 1 1

# chown root:kmem /dev/mem

Здесь 660 – права доступа, /dev/mem – имя файла (любое, например /home/kpnc/nezumi), "c" – тип устройства (символьное устройство), "1 1" – устройство (физическая память). Файл /dev/mem свободно доступен с прикладного уровня, но только для root, что не есть хорошо.

Структура файла предельно проста — линейные смещения соответствуют физическим адресам. Допустим, нам известно, что на FFFFh:FFF0h во всех BIOS'ах хранится команда перехода на загрузочный код, а за ним, как правило, лежит дата создания прошивки. Переводим "сладкую парочку" - сегмент:смещение - в линейный вид (linear == seg*10h + offset), получаем FFFF0h. Это и будет смещение в файле.

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

Назад на стр. 087-134-2  Содержание  Вперед на стр. 087-134-4