【问题标题】:a way to run assembler code in protected environment (x86-64)一种在受保护的环境中运行汇编代码的方法(x86-64)
【发布时间】:2018-03-14 11:30:01
【问题描述】:

我正在尝试用 C++ 创建一个 Linux 软件,它需要在 x86 和 x86-64 处理器上的受保护环境中运行代码。

我的问题是找到一种在受保护环境中运行代码的方法,首先,仅在 x86-64 上(这是处理器工作方式的技术部分),我看到了本地描述符表,但我发现它不再有效在 x86-64 上。我也听说过 Intel VT 技术,但是文档看起来很复杂。

您知道如何在受保护的环境中在 linux 和 x86-64 的进程内运行代码吗?

我的目标是在 linux 进程中创建类似于操作系统的东西。

像 Windows 或 Linux 一样,我希望在受保护的环境中运行的程序不会访问我的部分软件,并在需要时进行系统调用。我相信我已经找到了这样做的方法,我在下面解释它。

【问题讨论】:

  • 首先,IA64是Intel Itanium的正式名称。您的意思很可能是 Intel 64,a.k.a AMD64 a.k.a x86_64。您很可能不想为 Itanium 写作,除非您的办公桌下有一个盒子。
  • 第二,你真的需要明确你想要达到的目标。任何现代操作系统都为您提供受保护的虚拟内存环境,所有应用程序(包括您现在用来阅读这句话的浏览器)都在其中运行。您可以立即使用它。如果您需要的是准系统保护模式(传统 32 位或长 64 位),那么您基本上需要为此编写一个迷你操作系统。所有这一切都只与虚拟化远程相关(在这个词的现代理解中)
  • 感谢您的回答,我确实想为 x86_64 编程。
  • 我错误地发送了答案的第一部分。我想做的是一个有点像java的软件,更简单,我希望在进程内运行的程序不要访问不允许的部分我的虚拟机的内存。我说清楚了吗?
  • 您想要的已经存在:user-mode-linux.sourceforge.net。不过,我不知道主机是如何从来宾系统上的root 受到“保护”的。

标签: linux x86-64 virtualization processor user-mode-linux


【解决方案1】:

我找到了一种方法来做我想做的事:

每次我的程序从主要部分切换到内部程序时,它都会使用 mprotect(Linux 上 Glibc 的一个功能)来更改对进程大部分内存的访问权限。

每次内部程序对我的程序进行系统调用时,它都会改回访问内存的权限。

您可能认为它仍然存在安全问题,因为里面的程序可以运行任何类型的代码并访问对 linux 的系统调用,因此可以访问不允许的东西。但我相信我可以使用一个技巧来禁止里面的代码启动任何类型的操作码。

【讨论】:

  • 如果你运行任意机器码,你如何阻止它直接进行mprotect系统调用,或者mmap(MAP_FIXED)突破沙箱,或者干脆execve("/bin/sh", {"sh", "-c", "whatever command", NULL}, NULL)?取消映射 glibc 将无济于事,因为 asm 可以包含 syscall 指令以直接进行系统调用。 blog.packagecloud.io/eng/2016/04/05/…
  • 您在这一点上是对的。我的技巧很难解释:首先我想将代码保存在我的可执行文件中,格式类似于 bitcode。
  • 如果你只是要反汇编机器代码来查看它是否包含syscall,这是行不通的,因为代码可以jmp 进入另一个指令的中间(看起来像当你看着它时,一个无辜的imm32)。对于您提出的任何检测方法,越来越多的狡猾的 asm 可以即时生成 syscallint 0x80,尤其是在可以进行自修改代码的情况下。 (例如,如果沙箱与任何带有 write + execute 的页面一起运行)。那样的话,检测就相当于解决the halting problem
  • 无论如何,这个答案的主要重要部分是“我有一个窍门”,你根本没有解释。所以这不是答案!
  • 感谢您的评论,彼得,我总是过早按下回车键会出错!我希望当比特代码转换为汇编代码时,它只会创建比特代码,没有访问 int 或其他 badopcodes,但就像你说的那样,这还不够,原因有两个:可能会编写代码段(只需将其更改为可执行和可读就足够了),但另一个问题是它可以跳转到 bad错误操作码(例如系统调用的操作码)所在的位置。
猜你喜欢
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多