【问题标题】:Executing a ELF binary without creating a local file?在不创建本地文件的情况下执行 ELF 二进制文件?
【发布时间】:2013-04-12 11:39:19
【问题描述】:

是否可以在不复制到硬盘的情况下执行二进制文件?

我知道/lib/ld-linux.so.2 可以加载任意二进制文件,但这仍然需要一个本地存储的文件,我的想法是分配一个内存区域,将内容复制到内存并执行它。

那可能吗?

【问题讨论】:

  • 你不能简单地使用像tmpfs这样的无盘文件系统吗?
  • 我不知道您是否可以绕过使可写页面在用户空间中可执行。也许一个 setuid 'launch' 程序可以工作。
  • 看看UPX压缩器的来源。

标签: linux elf


【解决方案1】:

我的想法是分配一个内存区域,将内容复制到内存并执行它。

对于静态链接的a.out,您可以这样做。

对于动态链接的,您需要dlopen_phdr 之类的东西。

【讨论】:

    【解决方案2】:

    这是可能的,但非常困难。几年前我曾研究过类似的问题here。 (注意!该代码不完整并且包含严重的错误。)

    最困难的部分是确保您的进程的地址空间要求不与二进制文件或动态链接器的(例如 /lib/ld-linux.so.2)冲突。如果您控制两个程序的内存布局(因为您链接了它们),您可以避免这个问题。 (我的代码不承担这样的控制,如果有必要,它会很费力地将自己移开。)

    如果没有地址空间冲突,问题是为 exe 的 PT_LOAD 段(和链接器的,如果有的话)分配内存,对齐和复制段,保护只读段,分配堆栈,初始化堆栈和寄存器the way the kernel does,并跳转到exe或链接器的入口地址。

    【讨论】:

    • Interesting... 这假设您想直接从它所在的位置执行代码。我想如果你允许一个副本在内存中会容易得多,这样新进程就会有一个完全独立的内存布局。
    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多