最近,我学到了一个技巧,如果一个文件缺乏可执行权限,我们可以使用/lib64/ld-linux-x86-64.so.2
.
例如,要恢复 x 权限
-rw-r--r-- 1 root root 59K Mar 1 2017 /bin/chmod
我们可以跑
/lib64/ld-linux-x86-64.so.2 /bin/chmod +x /bin/chmod
我真的不知道这是怎么做到的,这不是一个普通的东西,有点神秘。
答案1
这就是动态链接器;如果你单独运行它,它会告诉你它的作用:
用法:
ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]
您已经调用了“ld.so”,即共享库可执行文件的帮助程序。该程序通常位于文件中
/lib/ld.so
,并且使用 ELF 共享库的可执行文件中的特殊指令告诉系统的程序加载器从此文件加载帮助程序。该帮助程序加载程序可执行文件所需的共享库,准备要运行的程序,然后运行它。您可以直接从命令行调用此帮助程序来加载并运行 ELF 可执行文件;这就像执行该文件本身,但始终使用您指定的文件中的帮助程序,而不是您运行的可执行文件中指定的帮助程序文件。这主要用于维护人员测试该帮助程序的新版本;您很可能并不打算运行该程序。
链接器用于运行动态链接的程序。当您运行 时chmod
,内核实际上会运行相当于/lib64/ld-linux-x86-64.so.2 /bin/chmod
您手动执行的操作;即使chmod
二进制文件不可执行,后者也可以工作,因为对执行权限的检查是通过对execve()
被告知要执行的文件的系统调用完成的,并且在/lib64/ld-linux-x86-64.so.2 /bin/chmod
shell 命令行中,shell 传递到的路径execve()
是/lib64/ld-linux-x86-64.so.2
,而不是/bin/chmod
,它是检查执行权限的那个,/bin/chmod
仅作为参数传递给链接器。在不需要可执行的/bin/sh ./some-script
地方也是同样的事情。./some-script
您将在优秀的文章中找到更多关于此的详细信息程序如何运行:ELF 二进制文件文章。