我使用简单的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
有谁知道发生了什么?也许一些 保护机制已经出台了?
答案 0 :(得分:2)
系统调用表上似乎有 地址空间布局随机化(kASLR) 默认情况下放在4.8内核中。将sys_call_table符号声明为已导出并直接从模块链接时,sys_call_table的地址将随每次引导而变化。 来自/boot/System.map-xxx的地址是无用的。
要在ubuntu 16.10内核4.8中禁用kaslr,可以添加
nokaslr
到内核命令行。