【发布时间】:2016-10-17 07:36:14
【问题描述】:
我使用简单的 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
有谁知道发生了什么?也许有些 是否引入了保护机制?
【问题讨论】:
-
到目前为止找到了一个解决方案:我重新编译了 4.8 内核并导出了符号 sys_call_table 并删除了 const 说明符。这样我就可以直接从模块中引用 sys_call_table 。仍然不确定为什么它与适用于 4.6 的版本崩溃。只读部分的链接是否更改?
-
您可以在this 演示文稿中找到对 Linux 已实施的所有缓解措施(无论如何最高 4.2)的一个很好的总结。
-
谢谢。一个问题:如果 kaslr 存在,有没有办法真正取回系统调用表地址?我想这会被认为是一种利用,但无论如何......