我可以在没有可执行文件的情况下执行全新的进程吗?

我可以在没有可执行文件的情况下执行全新的进程吗?

假设我的非 root 32 位应用程序在 64 位系统上运行,其所有文件系统都以只读方式安装。该应用程序在内存中创建 64 位 ELF 的图像。但由于只读文件系统,它无法将此图像转储到文件中以执行操作execve。是否仍然有受支持的方式从此映像启动进程?

注意:这里的主要问题是从32位模式切换到64位,不做任何操作可能不可靠的黑客攻击。如果这个问题得到解决,那么整个问题就变得微不足道了——只需制作一个自定义加载器即可。

答案1

是的,通过memfd_createfexecve:

int fd = memfd_create("foo", MFD_CLOEXEC);
// write your image to fd however you want
fexecve(fd, argv, envp);

答案2

您正在寻找类似“userland exec”的内容。实施这里。基本上,这涉及将一些没有外部引用的位置无关代码加载到内存中,并将其标记为可执行。此位置无关代码会删除先前运行的可执行文件并重新加载。听起来你可能必须至少修改一下我写的用户态执行程序。

答案3

user732 的评论和链接已过时。但要点是正确的;你需要一个“userland exec”实现,其中有几个。在您无法在任何地方编写但可以执行 Python 脚本的情况下,可以在以下位置找到有用的一个:https://github.com/anvilsecure/ulexecve/。我写了这篇文章,您可能需要通过概述博客文章向世界介绍它来了解更多背景信息:https://www.anvilsecure.com/blog/userland-execution-of-binaries-directly-from-python.html

更改上面的代码应该相当简单ulexecve,以便它从 32 位模式切换到 64 位模式,反之亦然。这是一个有趣的用例,我没有考虑也没有实现。但@Ruslan 提出的方法应该有效。

Rapid7 的 Mettle 也有一个名为的实用程序noexec,它基本上做同样的事情:https://github.com/rapid7/mettle。这是一个用 C 编写的较低级别的实用程序,因此您最终会得到另一个 ELF 二进制文件,然后它允许您执行用户态执行。

相关内容