64位Linux内核4.15获取sys call表:暴力破解模块报错求助
问题:64位Linux 4.15内核暴力破解syscall table时在0xffffffff81000018地址报错
我正在尝试通过暴力破解的方式在64位Linux 4.15内核中定位系统调用表(sys_call_table),但加载内核模块时,始终在地址ffffffff81000018处触发错误。
以下是我使用的部分代码:
#include<linux/kernel.h> #include<linux/module.h> #include<linux/dirent.h> #include<linux/syscalls.h> #include<linux/sysfs.h> #include<linux/list.h> #include<linux/proc_fs.h> #include<linux/string.h> #include<linux/uaccess.h> #include<linux/fs.h> #include<...>
分析与解决建议
嘿,这个问题在4.15版本的内核里挺常见的,我来给你拆解下:
首先,ffffffff81000018这个地址属于内核的低地址段,而4.15内核已经启用了**KPTI(内核页表隔离)**和syscall table的隐藏机制,暴力扫描内存很容易踩进受保护的只读/不可访问页,直接触发page fault报错。
给你几个更靠谱的方向:
- 别再暴力扫描了:现代内核早就把syscall table藏得很深,甚至会动态调整地址,暴力扫描不仅容易报错,还极不稳定,几乎不可能在生产环境的内核里成功。
- 用内核符号表(如果允许):如果你的内核编译时开启了
CONFIG_KALLSYMS,直接用kallsyms_lookup_name("sys_call_table")就能拿到地址,不过这个函数在有些内核版本里是隐藏的,你需要手动声明:extern void *kallsyms_lookup_name(const char *name); - 从/proc/kallsyms读取:如果内核没完全隐藏符号,你可以在模块里读取
/proc/kallsyms文件,搜索sys_call_table对应的行来获取地址。不过要注意,内核模块里操作文件需要用内核态的文件API,不能直接用用户态的fopen之类的函数。 - 检查页权限:就算你找到了地址,默认syscall table是只读的,要修改它的话得先调用
set_memory_rw把对应的页改成可写,不然写入操作也会触发错误。
另外,如果你坚持要试试暴力扫描,记得在读取每个地址前先检查页的可访问性,比如通过pgprot_val获取页表项的权限,跳过不可读的页,这样能减少报错的概率,但还是不推荐这种方式。
内容的提问来源于stack exchange,提问作者jordy90
相关产品推荐
相关产品推荐

