【问题标题】:Find the address of the sys_call_table without symbols on a modern kernel在现代内核上找到没有符号的 sys_call_table 的地址
【发布时间】:2019-12-28 07:16:34
【问题描述】:

我正在尝试开发一个 KLM(内核可加载模块),它在 linux(4.15.0-55-generic x86_64)下挂钩系统调用,但我的问题是我找不到 sys_call_table 的地址(而不是ia32_sys_call_table),我不想依赖 kallsyms_lookup_name 的符号技术

我已经尝试过对一系列地址进行迭代的技术,但由于我真的不知道从哪个地址开始迭代,我将自己视为非法访问,并且我的 KLM 崩溃了 ..

当使用 kallsyms_lookup_name 的技术时,我拒绝采用它,因为它真的不便携..


我尝试过这种技术,但在我的内核上她不起作用,我尝试过这个功能:

int search_sct(void) {

  sys_call_table = (void *)kallsyms_lookup_name("sys_call_table");

  if (sys_call_table == NULL) {
    printk(KERN_ERR "Couldn't look up sys_call_table\n");
    return -1;
  }

  return 0;
}

我在 /boot/System.map 上没有相同的地址,当我用这个函数打印地址时

【问题讨论】:

  • 什么是“符号技巧”? not portable - 这没有意义,它是内核。内核代码本身只能移植到内核。内核接口也可以在内部发生变化。 “可移植”部分涉及内核公开的内容,即。 POSIX。内核中的内容保留在内核中。我看不出kallsyms_lookup_name 有什么问题,你为什么不想使用那个功能?
  • 没有干净的机制来挂钩系统调用,所以无论如何你都必须找到一个骇人听闻的解决方案。一种可能性是,简单地获取目标系统调用的地址,如有必要(取决于平台)取消保护内存页面并将jmp 指令插入目标函数。您还可以保存已覆盖的字节,以在模块卸载时撤消此操作。
  • 有这种技术的 PoC 吗?
  • @movequ_clevereverse 我敢打赌,但它非常简单,因此不需要 PoC
  • 如果内核支持,您可以从用户空间使用 kpatch 修补实时内核。

标签: c linux-kernel hook


【解决方案1】:

没有干净的机制来挂钩系统调用,所以无论如何你必须找到一个hackish解决方案。一种可能性是,简单地获取目标系统调用的地址,如有必要(取决于平台)取消保护内存页面并将 jmp 指令插入目标函数。您还可以保存已覆盖的字节,以在模块卸载时撤消此操作。

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 2018-10-18
    • 2010-12-07
    • 2013-07-31
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多