看看这个非常基本的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设备上工作。
并看一下这个基本的c userland程序:
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(CR4寄存器中的位0)
非常感谢