快速杀死 Linux

问题

众所周知,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 了吧?