gpt4 book ai didi

linux - 将十六进制地址直接分配给 LKM 代码中的指针但得到不同的结果

转载 作者:太空宇宙 更新时间:2023-11-04 10:05:33 25 4
gpt4 key购买 nike

我写了下面的代码:

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/syscalls.h>
#include <linux/version.h>

void **sys_call_table;

int __init kaslr_init(void)
{
#if KERNEL_VERSION(2, 6, 32) == LINUX_VERSION_CODE // on CentOS 6
sys_call_table = (void *) 0xffffffff816004c0;
#elif KERNEL_VERSION(4, 19, 0) == LINUX_VERSION_CODE // on Arch Linux
sys_call_table = (void *) 0xffffffff81c001c0;
#elif KERNEL_VERSION(3, 10, 0) == LINUX_VERSION_CODE // on CentOS 7
sys_call_table = (void *) 0xffffffff97c03300;
#endif

pr_err("%p\n", sys_call_table);

#if KERNEL_VERSION(4, 19, 0) != LINUX_VERSION_CODE
if (sys_call_table[__NR_close] == sys_close)
pr_err("Bingo!\n");
#endif
return 0;
}

void __exit kaslr_exit(void)
{
pr_err("Bye\n");
}

module_init(kaslr_init);
module_exit(kaslr_exit);
MODULE_LICENSE("GPL");

并得到结果:

// on CentOS 6
ffffffff816004c0
Bingo!

// on CentOS 7
[ 1375.358780] ffffffff97c03300
[ 1375.361958] Bingo!

// on Arch Linux
[ 1185.136873] 00000000bd3b9e65

从结果中,我得到了 Arch 上的用户空间地址。

首先我认为这可能是 kaslr 的原因,所以我通过在 /etc/default/grub 中添加 nokaslr 参数来禁用它并且重新启动。但它仍然存在。

有没有内核安全机制导致这样的结果?

标题

最佳答案

在 Arch Linux(较新的内核)上,默认启用内核指针加扰。使用 %px 格式。

参见 Pointer Typesprintk 格式中获取详细信息(pr_err 只是 printk 的包装器)

关于linux - 将十六进制地址直接分配给 LKM 代码中的指针但得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52850053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com