【发布时间】: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 是的,完全是一个普通的精灵可执行文件。
-
我觉得这个解决方案很棒,我会试试的。