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

Rus*_*lan 5 linux process exec

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

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

Jos*_*ica 28

是的,通过memfd_createfexecve

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

  • 伟大的。我已经检查过,这确实有效(参见[此示例代码](https://dumpz.org/bRatbeMHKn7S)(孩子只是旋转增加“rax”))。但有几点评论:`memfd_create` 首次出现在 Linux 3.17 中。包含`<sys/mman.h>`,定义了`_GNU_SOURCE`(手册页关于包含的内容似乎是错误的,并且没有提到定义的需要)。 (5认同)
  • @Ruslan 很好的发现。我刚刚发送了一个补丁,将 _GNU_SOURCE 要求添加到手册页中。(标头名称已在 git 中固定;只是网站尚未更新。) (3认同)