Linux kernel 4.8内核中的sys\u call\u table read受保护吗?

Linux kernel 4.8内核中的sys\u call\u table read受保护吗?,linux-kernel,system-calls,Linux Kernel,System Calls,我使用简单的sys\u call\u表重写 记录系统中的所有Exeve调用 当迁移到带有4.8内核的Ubuntu 16.10时 机械突然停止工作。在16.04与 一个4.6内核,它正在工作 1: write_cr0 (read_cr0 () & (~ 0x10000)); 2: original_execve = (void *)syscall_table[__NR_execve]; 3: syscall_table[__NR_execve] = (unsign

我使用简单的sys\u call\u表重写 记录系统中的所有Exeve调用

当迁移到带有4.8内核的Ubuntu 16.10时 机械突然停止工作。在16.04与 一个4.6内核,它正在工作

    1: write_cr0 (read_cr0 () & (~ 0x10000));

    2: original_execve = (void *)syscall_table[__NR_execve];
    3: syscall_table[__NR_execve] = (unsigned long)&new_execve;

    4: write_cr0 (read_cr0 () | 0x10000);
读取旧条目(即第2行)时,页面错误已经发生。 要检索我使用的sys\u call\u表地址,请执行以下操作:

sudo cat /boot/System.map-`uname -r` | grep -e '\ssys_call_table' | awk '{ print $1}' )" 
代码来自:

有人知道发生了什么吗?也许是一些 引入了保护机制?

在syscall表上似乎存在地址空间布局随机化(kASLR) 默认情况下,将其放置在4.8内核中。当声明sys_call_table符号已导出并直接从模块链接到它时,sys_call_table的地址在每次启动时都会发生变化。 /boot/System.map-xxx中的地址无效

要在ubuntu 16.10内核4.8中禁用kaslr,可以添加

nokaslr

到内核命令行。

到目前为止找到了一个解决方案:我重新编译了4.8内核,导出了symbol sys_call_表,并删除了const说明符。这样我就可以直接从模块中引用sys_call_表。仍然不是舒尔,但仍然是它为何在4.6版本中崩溃的原因。只读部分的链接是否已更改?您可以在演示文稿中找到Linux已实施的所有缓解措施(至少达到4.2版)的良好摘要。谢谢。一个问题:如果存在kaslr,是否有办法实际获取syscall表地址?我想那会被认为是一种剥削,但无论如何。。。