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

Скрытый потенциал 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», позволяя поместить все личные конфигурационные файлы в выделенный каталог.

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