有没有办法从管道执行本机二进制文件?


13
echo 'main(){}' | gcc -xc - -o /dev/stdout | ???

有没有办法在类似Unix的系统上运行输出二进制文件?

编辑:我需要它在无法写入任何文件的沙盒环境中运行g ++的输出(我保证,没有恶意)。


我相信基本的安全机制必须防止这种情况。但是,如果您要即时运行C代码,请使用csh
rozcietrzewiacz 2011年

Answers:


10

我不认为这是可能的。在EXEC(2)系统调用总是需要的文件名或绝对路径(文件名是总是一个char*)。 posix_spawn对文件名也有类似的要求。

您最能做的是将输出通过管道传递到命名管道,然后尝试从管道执行。尽管外壳程序可能会拒绝执行任何未--x--x--x设置位的文件,但这可能会起作用。使用创建管道,mkfifo(1)然后查看是否可以使用它。

另一种方法是编写一些东西来读取标准输入,将文件写入到临时区域,在其上设置--x位,派生并执行然后删除该文件。索引节点和内容将一直保留到程序完成执行,但无法通过文件系统访问。当进程终止时,将释放索引节点,并将存储返回到空闲列表。

编辑:正如Mat指出的那样,第一种方法将行不通,因为加载程序将尝试在可执行文件中进行请求分页,这将在文件上生成随机查找流量,而这在管道上是不可能的。这就留下了第二种方法。


2
如果管道技巧成功了,我会感到非常惊讶-您无法在管道上进行随机查找,也无法映射它们-我很确定这会惹恼运行时加载程序/链接器:)您的第二个建议似乎不错但是,没有临时文件就无法提出任何建议。
垫子

@垫子-我认为你是对的。可执行文件中的按需分页将导致随机访问流量,该流量将无法在管道上运行。具有讽刺意味的是,它实际上可能已经在SVR2.0(最后一个没有使用按需分页的版本)上工作了-只是为了表明我的年龄,我以前曾经曾经以AT&T 3B2 / 400作为O / S来使用SVR2.0。
ConcernedOfTunbridgeWells,

再想一想,我很确定像UPX这样的exe压缩程序可以在只读媒体上进行解压缩执行。修改他们添加到打包的可执行文件上的任何存根,以便从管道读取而不是解压缩,然后...可能会起作用。

@Mat包装工已经加载了图像,因此不开始新的过程。要执行类似的操作,我需要有一个过程可以任意跳入输入数据(这将被视为安全漏洞)。
亚历克斯·B

@Alex B:您是专门问如何对输入数据进行任意跳转。当建议您这样做时,您为什么会抱怨呢?沙盒的目的是专门用来防止您尝试执行的操作吗?
大卫·史瓦兹

7

使用memfd syscall的解决方案:https : //github.com/abbat/elfexec

它将在内存中创建一个命名文件描述符,该描述符可以在中使用exec。伪代码:

#include <linux/memfd.h>
...
int memfd = syscall(SYS_memfd_create, "someName", 0);
...
write(memfd,... elf-content...);
...
fexecve(memfd, argv, environ);

1
memfd.h除非您要使用标题,否则不需要标题MFD_CLOEXEC#! /bin/sh由于linux中的错误,这会破坏脚本fexecve())。并不太复杂,您可以在答案中包含20行的工作示例(例如git gist,尽管这并不是您的替代品elfexec,因为这也将允许您指定argv[0],并运行二进制文件仅来自管道(UUoC授权;
mosvy

因此,我完全不知道该如何工作。gcc会将.o文件写入/ tmp,如果不能,则死掉。
约书亚

4

您可以尝试tcc,它将一步一步地编译和执行程序,而无需编写任何中间文件。它不是gcc,这可能对您来说是个问题,但是它的速度非常快,因此就您的目的而言,它甚至可能比gcc更好。


2

这将自动运行代码的编译,但是会(临时)在文件系统上创建一个文件来执行此操作。

echo 'main(){}' | gcc -xc -o /tmp/a.out && chmod u+x /tmp/a.out && /tmp/a.out && rm -f /tmp/a.out

(我目前正在对此进行测试,但是我可以肯定的是,或者接近它的东西可以为您工作)

编辑:如果管道的目标是从速度方程式中削减物理磁盘,请考虑创建一个ram磁盘来保存中间文件。


这当然可以工作,但是却遗漏了问题的要点-执行从未写入磁盘的二进制代码。
rozcietrzewiacz 2011年

@rozcietrzewiacz我的希望是,如果目标是在运行中轻松运行代码片段而不处理所需的物理文件,它将很有用。
dtyler 2011年

是的我明白。但是为此,人们可以简单地使用csh
rozcietrzewiacz 2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.