Посмотрите на этот очень простой модуль linux:
static ssize_t checksec_write(struct file *f, const char __user *buf,size_t len, loff_t *off)
{
unsigned long addr_fonction_userspace;
memcpy(&addr_fonction_userspace,buf,sizeof(unsigned long));
void (*functionPtr)(void);
functionPtr = addr_fonction_userspace;
(*functionPtr)();
return len;
}
Этот модуль работает с этим / dev / checksec char устройством.
и посмотрите на эту базовую программу на языке пользователя:
void fonction_userland();
void fonction_userland()
{
asm ("nop");
}
void main()
{
FILE *f=fopen("/dev/checksec","w");
unsigned long addr_fonction_userland = &fonction_userland;
fwrite(&addr_fonction_userland,sizeof(unsigned long),1,f);
}
Когда я запускаю программу, я получаю эту ошибку в dmesg:
kernel tried to execute NX-protected page - exploit attempt?
Я понимаю, что это попытка эксплойта, потому что это то, чему я пытаюсь научиться. Но я не понимаю, почему страница защищена NX. Функция не находится на неисполняемой странице, это пользовательская функция.
SMEP и SMAP не включены (биты 0 в регистре CR4)
Большое спасибо