root@system:~# less myfile
-bash: /bin/less: Input/output error
根文件系统已死。但是我的猫还活着(在我的记忆中):
root@system:~# cat > /tmp/somefile
C^d
root@system:~#
不过他有点寂寞,他所有的朋友都走了:
root@system:~# mount
-bash: /bin/mount: Input/output error
root@system:~# dmesg
-bash: /bin/dmesg: Input/output error
root@system:~# less
-bash: /bin/less: Input/output error
root@system:~# chmod
-bash: /bin/chmod: Input/output error
该系统仍在运行,并实现其目的。我知道,我知道,对此唯一明智的反应是关闭系统并更换根驱动器。不幸的是,这不是一个选择,因为它会花费大量时间和金钱。而且,它会杀了我的猫,这会让我很难过。
我想从捐赠者那里给他带来他平时的朋友。我不敢尝试将它们 scp 放入,以防 ssh 尝试加载它并切断线路(二进制文件无论如何都消失了)。这听起来像是我猫的表弟的工作:
root@system:~# netcat -l 1234 > /tmp/less
-bash: netcat: command not found
可惜他早就走了。
现在,我可以尝试欺骗我的猫进行仪式以复活他:
cat > netcat < /dev/tcp/localhost/9999
那种工作。他几乎还活着:
root@system:/tmp# /tmp/netcat
-bash: /tmp/netcat: Permission denied
他只需要一点生命的火花。+x
那个我现在无法背诵的小魔法咒语。
你能帮我把我猫的朋友带回来吗?
有几种可能性,都取决于您现在情况的确切参数。我将在以下适用的示例中假设 Linux,但在大多数情况下,其他平台上也存在类似的功能。
您也许可以让动态加载程序为您运行可执行文件。假设
cat
是动态链接的,您的平台的等价物/lib/ld-linux.so.2
也可能在内存中,因此可用于运行二进制文件:您可能有多个这些(可能是 32 位和 64 位),并且可能有多个副本可用,或者需要解析的符号链接。其中之一可能有效。
如果你有一个挂载的 vfat 或 NTFS 文件系统,或者另一个将所有文件视为 777 的文件系统,你可以在那里创建你的可执行文件。
如果有一个您不关心内容的已安装分区,则在仍然大部分工作的驱动器上,您可以用包含您想要的可执行文件的相同文件系统类型的新映像替换内容 -
cat
在人们通常使用dd
的角色,您可以通过网络提供图像。这个是合理的,但有很多地方不能工作,具体取决于该分区的内存中到底有什么。
如果有任何可访问的文件在任何可写文件系统上具有执行权限,您可以
cat >
将其内容替换为您选择的二进制文件。ctypes.sh
,它为 Bash 提供了一个外部函数接口,然后dlcall chmod ./netcat 511
.您可以引入
foo.so
您的构造的动态库文件,然后cat
通过 代表您加载它LD_PRELOAD
,从而允许您执行任意代码。例如,如果您拦截
open
:然后你可以在那里做任何你需要做的事情。
我的建议是引入一个静态链接的
busybox
可执行文件作为第一项(或者实际上是唯一一项),这样您就可以获得所有可用的命令,而无需重用任何让您筋疲力尽的黑客行为。