Скрытый потенциал UNIX Евгений Зобнин ака j1m Хакер, номер #094, стр. 094-110-3 Практика использования хакерского функционала операционной системы в мирных целях не ограничивается одним лишь набором стандартных программ. С приходом в UNIX формата исполняемых файлов ELF появилась возможность подмены экспортируемых функций любой загружаемой библиотеки. Механизм называется preload. Он базируется на свойстве динамического линковщика ELF-файлов, который выполняет такую процедуру, как symbol lookup (поиск в объектном файле экспортируемых символов, в том числе функций), на этапе загрузки библиотеки в память (во времена господства отжившего свое формата a.out эта процедура выполнялась на этапе компоновки объектного файла). Прием считается вполне легальным и полностью документирован в man-странице ld.so(8). Кроме того, его достаточно просто реализовать: Пример перехвата функции open(2) /* компиляция: gcc -shared -fPIC -o lib.so lib.c -ldl -lc * запуск: $ LD_PRELOAD=./lib.so program */ #define _GNU_SOURCE #include <dlfcn.h> #include <sys/types.h> #include <stdio.h> /* Указатель на оригинальную функцию */ static int (*orig_open) (const char*, int, mode_t); /* Фиктивная функция */ int open(const char *pathname, int flags, mode_t mode) { int ret_val; /* Получим адрес оригинальной функции */ orig_open = dlsym(RTLD_NEXT, "open"); /* Теперь можно делать все, что угодно, * в целях демонстрации просто напечатаем сообщение */ fprintf(stderr, "%s\n", "Open called!"); /* Вызываем оригинальную функцию и возвращаемся */ ret_val = orig_open(pathname, flags, mode); return ret_val; } Легкость, с которой в UNIX можно обманывать программы, подсовывая им фиктивные точки входа в библиотеку, привела к большому распространению этого приема в легальном программном обеспечении. Особенно он популярен в программах, трассирующих процесс установки других программ. Всем известная и очень популярная утилита checkinstall (checkinstall.izto.org) перехватывает стандартные библиотечные функции creat(), open(), fopen() и некоторые другие для формирования списка вновь созданных файлов и последующего создания дистрибутивного пакета (RPM, deb или pkg). Библиотека libglfps (www.dakotacom.net/~donut/programs/libglfps.html) перехватывает функцию обновления экрана библиотеки OpenGL для помещения на экран счетчика числа кадров в секунду. Библиотека libetc (ordiluc.net/fs/libetc/) обрабатывает почти все функции стандартной библиотеки (libc), связанные с доступом к файлам, для модификации путей вида «/home/user/.file» в «/home/user/.config/file», позволяя поместить все личные конфигурационные файлы в выделенный каталог. |