sys_call_table是否在4.8内核中被保护?

时间:2016-10-17 07:36:14

标签: linux-kernel system-calls

我使用简单的sys_call_table重写来 记录系统中的所有execve调用。

当使用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_call_table地址:

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

代码来自:https://github.com/eiselekd/shinterposer/tree/master/mod

有谁知道发生了什么?也许一些 保护机制已经出台了?

1 个答案:

答案 0 :(得分:2)

系统调用表上似乎有 地址空间布局随机化(kASLR) 默认情况下放在4.8内核中。将sys_call_table符号声明为已导出并直接从模块链接时,sys_call_table的地址将随每次引导而变化。 来自/boot/System.map-xxx的地址是无用的。

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

nokaslr

到内核命令行。