【问题标题】:Can we bypass entering kernel mode to execute system call code in assembly language?我们可以绕过进入内核模式以汇编语言执行系统调用代码吗?
【发布时间】:2021-03-03 16:13:53
【问题描述】:

我想知道我们可以将系统调用代码和驱动程序代码复制到我们的汇编程序中并使用这些代码来操作硬件吗?说清除硬盘?

我们可以从内核模式复制代码并使用它来做任何我们想做的事情吗?如:我们是否可以将任何在内核中运行的代码复制到用户模式,并与内核完全相同?

有什么东西可以阻止我们这样做吗?

【问题讨论】:

  • 期待任何评论。有很多关于内核的问题。
  • 由于内存保护,这是不可能的。 CPU 允许内核直接访问硬件,而您的程序则不允许。它必须要求内核为它做这件事。
  • 是的 - 当你的用户进程线程/s得到执行时,程序集/二进制/机器/无论如何,已经太晚了 - 操作系统已经设置了内存管理硬件来阻止你的进程行为很糟糕。特权指令将不会被执行,并且尝试这样做只会对操作系统内存管理器内核软件产生硬件中断。
  • 一般要注意的一点:组装并不是一件神奇的事情。它不会让你做任何你在 C 中做不到的事情。

标签: assembly linux-kernel operating-system


【解决方案1】:

我们可以将任何在内核中运行的代码复制到用户模式

不,你不能。内核模式代码与用户模式代码有两个主要区别,使其无法在用户空间中运行:

  1. 它使用特权指令(和特权特殊寄存器)与用户空间中不可用的硬件进行通信。如果在用户空间执行,此类指令将导致硬件异常并将控制重定向到内核异常处理程序,该处理程序将杀死您的程序以执行禁止的指令。

    这也回答了你的问题:

    有什么东西可以阻止我们这样做吗?

    是的,处理器本身会阻止你这样做,并且由于内核已经为此类事件安装了适当的异常处理程序,它会相应地采取行动。

  2. 即使能够执行这些指令,您仍然需要访问和操作存储在内核空间中的数据,例如目录条目、页表、任务结构等。由于@,这些数据对于任何用户空间程序都是完全不可见的987654321@隔离。

【讨论】:

  • 在大多数情况下,阻止硬件访问的是上面的#2。现在大多数设备都是通过内存映射寄存器控制的,所以如果这些寄存器在进程的地址空间中,那么你可以告诉它做事。这是完全可能的,通过在/dev/mem 上使用mmap(),不需要特权指令。当然,如果一个进程想要在不使用内核的情况下更改其地址空间,那么整个特权指令就会发挥作用。
猜你喜欢
  • 2023-03-07
  • 2013-03-28
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2014-03-02
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多