【问题标题】:How to pass a char buffer as codes to call on exec?如何将 char 缓冲区作为代码传递给 exec?
【发布时间】:2023-03-21 04:00:01
【问题描述】:

我使用execxx 来执行一些可执行文件,但出于安全原因(和其他原因),我将二进制作为十六进制数字硬编码到调用者的代码中作为const unsigned char[]

例如:

unsigned char code[] = {
    0x7f,0x45, 0x4c,0x46, 0x01,0x01, 0x01,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, ...
}

还有一些如何执行它:exec(code, argv[])...

但我搜索了一段时间,发现所有 exec 系列都接受路径或 File 结构。

那么我有办法做到吗?

【问题讨论】:

  • Exec 系列函数只能执行外部程序,不能执行任意字节的代码。甚至不能保证标记为可执行的内存段中的数据。如果它是(在可执行内存段中),您可以直接运行它而无需任何 exec 函数。
  • @Someprogrammerdude 我使用mmap(0, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) 将一些汇编代码推送到可执行内存中并在之前运行它,您的意思是我可以在这里使用相同的方式吗?我认为可执行文件与汇编代码有很大不同(例如动态加载或崩溃处理)
  • 哦,这是一个完整的 ELF 可执行映像?那么不,那是行不通的。您需要将其保存到您传递给exec 的(临时)文件中。
  • @Someprogrammerdude 是的,完全是一个普通的精灵可执行文件。
  • 我觉得这个解决方案很棒,我会试试的。

标签: c exec posix


【解决方案1】:

有两种可能的解决方案:

  1. 将图像保存到(临时)文件中,然后您可以将其与标准exec 函数之一一起使用;或者

  2. 创建一个您将图像发送到的管道,并在另一端使用fexecve 从管道读取端描述符执行。

【讨论】:

  • 恐怕2的方案行不通,我试了一会儿,errno说我没有权限...我猜路径像“/proc/self/ fd/95" 无效。
  • @psionic12 也许我应该添加一个我从未尝试过并且实际上不知道它是否会工作的免责声明...... :) 阅读the POSIX exec reference 似乎描述符必须是“可执行的”。可以使用fcntl 或类似方法吗?
  • 你可以用 memfd 做 2,但不能用管道。
  • @JosephSible-ReinstateMonica 这是一个更好的主意。 :)
猜你喜欢
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
相关资源
最近更新 更多