有没有办法在 Linux 下运行没有设置执行位的可执行二进制文件?chmod +x
不是一个选项。
例如它的权限可能只是r--r--r--
。
无需设置执行位,也无需通过将源传递给解释器来放入shebang,就可以执行脚本,例如bash script.sh
或python script.py
。
那么是否有类似的东西execute abinaryfile
可以将目标代码加载到内存中并运行它?
答案1
您可以使用 /lib/ld*.so 作为 ELF 解释器,如下所示:
cp /bin/ls /tmp/ls
chmod a-x /tmp/ls
/lib/ld-linux.so.2 /tmp/ls
实际名称因架构而异。有些名称包括/lib/ld-linux.so.2
、/lib/ld-linux-x86-64.so.2
和/lib/ld-2.7.so
。您可能只找到/lib/ld*
。
答案2
不。至少,方式不一样。当你执行 Python 操作时,你仍在执行二进制文件。Python 是 +x。你需要编译可以加载文件并执行它的东西。
TiCL 应该将他的/她的回应作为答案,因为这是最好的方法。
答案3
如果文件不可执行,exec
Linux 内核的系统调用将失败EACCES
虽然您可以这样做sh myprog.sh
,但尝试按如下方式运行程序./myprog.sh
却无法工作,因为当您这样做时:
- Bash 使用 exec 系统调用
./myprog.sh
- Shebang 由
exec
Linux 内核的系统调用直接解释,如下所述:https://stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on-the-first-line-of-a-pyt/40938801#40938801 - Linux 内核拒绝执行没有可执行权限的文件
可以通过以下方法验证main.c
:
#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[] = {"myprog", NULL};
char *envp[] = {NULL};
int ret;
ret = execve("myprog.sh", argv, envp);
perror("execve");
printf("%d\n", errno);
printf("%d\n", EACCES);
}
和myprog.sh
:
#!/bin/sh
echo worked
如果myprog.sh
不可执行,main
则失败:
execve: Permission denied
13
13
在 Ubuntu 17.10 中测试gcc -std=c99
。
POSIX 7 提到:
除 fexecve() 之外的 exec 函数在下列情况下将会失败:
[EACCES] 拒绝对新进程映像文件的路径前缀中列出的目录进行搜索,或者拒绝对新进程映像文件进行执行。