我可以在未设置执行权限位的情况下执行 Linux 二进制文件吗?

我可以在未设置执行权限位的情况下执行 Linux 二进制文件吗?

有没有办法在 Linux 下运行没有设置执行位的可执行二进制文件?chmod +x不是一个选项。

例如它的权限可能只是r--r--r--

无需设置执行位,也无需通过将源传递给解释器来放入shebang,就可以执行脚本,例如bash script.shpython 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

如果文件不可执行,execLinux 内核的系统调用将失败EACCES

虽然您可以这样做sh myprog.sh,但尝试按如下方式运行程序./myprog.sh却无法工作,因为当您这样做时:

可以通过以下方法验证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] 拒绝对新进程映像文件的路径前缀中列出的目录进行搜索,或者拒绝对新进程映像文件进行执行。

进一步的理由可参见:https://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

相关内容