Answers:
您可以将/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*。
ld是程序链接器/加载器。它查找并加载程序使用的共享库,然后执行它。ld-linux处理ELF二进制文件。
/lib/ld-linux.so.2不是可执行文件(那甚至有可能吗?)
.so加载可执行文件,ld-linux这很重要。
/lib64/ld-linux-x86-64.so.2
如果文件不可执行exec,Linux内核的系统调用将失败并显示EACCES
尽管可以sh myprog.sh,但尝试运行程序./myprog.sh无法正常进行,因为这样做时:
./myprog.shexecLinux内核的系统调用直接解释,如下所述:https : //stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on pyt的第一行/ 40938801#40938801可以通过以下方式验证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-be-easily-bypassed-is-it-superfluous-or-whats-the