我使用简单的 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/