linux-kernel - 4.8 内核中的 sys_call_table 读保护吗?

标签 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

有谁知道发生了什么?也许有些
是否引入了保护机制?

最佳答案

好像有地址空间布局随机化 (kASLR) 在系统调用表上
默认放置在 4.8 内核中。当将 sys_call_table 符号声明为已导出并直接从模块链接到它时,sys_call_table 的地址在每次启动时都会发生变化。
/boot/System.map-xxx 中的地址是没用的。

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

nokaslr

到内核​​命令行。

关于linux-kernel - 4.8 内核中的 sys_call_table 读保护吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40080817/

相关文章:

c - RDTSCP 与 RDTSC + CPUID

c - 在 Linux 内核 4.6 或更高版本上挂接 sys_execve

c - 为什么 sk_buff 在 h union 中有一个 ip 头指针(ipiphdr),在 nh union 中有一个常规 ip 头指针(iphdr)?

linux - 从文件系统中查找路由器固件的 linux 内核版本

linux - 系统调用和库调用有什么区别?

linux - 编译linux内核

c - Linux 系统调用何时触发段错误与返回 EFAULT?

linux - CentOS 7.2 上的脏牛补丁 - kernel-debuginfo

c - 为什么 exevp 之前的 printf 没有运行?

c - 如何对音频 CD 驱动器使用 ioctl() 函数