问题
众所周知,Linux 上的脚本可以通过 Shebang 符号(#!)来指定它的解释器(interpreter)。那么,ELF 格式的程序又是谁来执行的呢?
研究
Linux 系统必然存在一个用于加载 ELF 程序的程序,它本身是被内核拉起的。然而,虽然有这么一个叫做 init 的进程,但对应的 init 程序文件是位于 /sbin 下,它不应该是直接用来运行其它程序的,不然普通用户的程序岂不是都无法启动?
一次使用 file
时,发现它打印出一个 interpreter:
1 2
| $ file $(which bash) /usr/bin/bash: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=0b6b11360e339f231f17484da2c87d0d78554e31, for GNU/Linux 3.2.0, stripped
|
这个 /lib64/ld-linux-x86-64.so.2
可以说是相当眼熟的,每次 ldd
一个 ELF 程序都会看到:
1 2 3 4 5
| $ ldd $(which bash) linux-vdso.so.1 (0x00007ffcdbf89000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fe156917000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe156736000) /lib64/ld-linux-x86-64.so.2 (0x00007fe156aa1000)
|
所以,可以拿它来运行别的 ELF 程序?
1 2
| $ /lib64/ld-linux-x86-64.so.2 $(which pwd) /root
|
哦吼!还真可以……看看它到底是啥:
1 2 3 4
| $ file /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2: symbolic link to /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 $ file /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=38e7d4a67acf053c794b3b8094e6900b5163f37d, stripped
|
所以,在 x64 的 Linux,ELF 的解释器其实是 /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
。
结论
最快杀死 Linux 的方法是:
1
| > chmod -x /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
|
请勿轻易尝试。如果您真的很好奇,记得先备份这个程序,在一定时间内还能救回来。可以这么思考:这个解释器又是谁加载的?您不会已经关闭 shell 了吧?