开发者生态
morning
挑剔《创:战纪》中的贝壳历史场景
2026-05-28
1 阅读
speckx
打印 shell 历史记录的命令 这是我第一次观看这部电影并暂停 DVD 时首先想到的事情。 Sam 通过运行 bin/history 而不仅仅是历史记录来请求 shell 历史记录。为什么?我看不出任何在真正的 Unix 上有意义的方法。 Shell 历史记录存储在 shell 进程本身内部的数据结构中,因此历史命令必须是 shell 内置命令,才能读出这些结构。即使您只想读出存储在磁盘文件中的历史版本,该文件的名称和位置也会随着 shell 及其配置的不同而变化,因此执行此操作的外部命令仍然很难正确执行。我当时的结论——现在对我来说仍然相当合理——是,这揭示了电影制片人用来呈现与情节相关的虚假历史的技巧。 (就像wire-fu中意外可见的电线一样。)我认为这个shell会话是通过在真实的、仔细配置的Unix机器中键入命令来生成的,而bin/history是一个简单的shell脚本,它打印该历史记录,以代替真实shell中存在的任何更无聊的东西。 (请特别注意,历史记录并不以命令 bin/history 结束!当您运行真正的 shell 历史命令时,通常输出会以您刚刚键入的历史命令结束,因为在读回历史列表之前它已被插入到历史列表中。)假设我是对的,通过使用别名或函数包装内置的历史 shell,可以做得更好。然后,用户可以输入简单的历史记录,并且仍然可以生成这个精心构建的输出。 (同样的参数不适用于 Sam 在这个会话中输入的其他命令,比如 uname ,因为这些不是 shell 内置命令:它们是在 PATH 上找到的,所以你可以通过将自己的目录放在 PATH 上来覆盖它们。所以我的猜测是,无论设置这个场景的人都知道如何做到这一点,但不知道如何设置别名。) 计算机上的帐户设置 Sam 看到的第一件事是 shell 提示符,而不是登录提示符:Flynn 已经让自己保持登录状态。首先运行 whoami 来确定他的登录身份。计算机打印 Flynn ,可能是非特权用户帐户。这不好——山姆知道他需要成为 root 才能进行正确的调查。他尝试以 root 身份登录,但失败了,因此他尝试后门,结果成功了。一个自然的问题是:如果 root 和后门是不同的帐户,那么他不是要列出错误帐户的 shell 历史记录吗?毫无疑问,弗林是以 root 身份登录的,可以做他正在做的事情。但是我们可以看到后门帐户的用户ID为0,与root相同,因为Sam成功以后门身份登录后,shell提示符是#而不是$。当 shell 检测到它以 root uid 身份运行时,通常会发生这种情况。因此后门和 root 共享一个 uid,因此有理由猜测它们也共享一个主目录和 shell 历史记录。我们还看到后门的主目录被登录为 VFS 根目录 / ,因为 /etc/passwd 中没有指定更好的内容。因此,大概 shell 只是从 VFS 根读取历史文件:类似 /.bash_history ,或者至少是 / 。一些_history(我认为没有太多证据表明这到底是什么外壳)。 root 也将其主目录设置为 / 是相当合理的;这不是 Linux 上的默认设置,Linux 为 root 提供了自己的正确主目录,但这在我在 20 世纪 90 年代使用的专有 Unix 上肯定很常见。这样所有的事情就连在一起了:Flynn 以 root 身份运行这些命令,并且通过一个稍微迂回的路线,Sam 可能确实登录到了一个可以以自然方式列出它们的帐户。 (我也有点怀疑使用登录在现有登录会话中切换用户;人们可能会期望 su ?要完成这项工作, /bin/login 需要 setuid ,而且它肯定不是在 Linux 上 - 它期望由 getty 或(历史上) telnetd 等程序调用,这些程序在运行时已经是 root 了。也许 Solaris(或 SolarOS)有所不同?但似乎不太可能。)最后,为什么会有后门帐户无论如何?通常,如果您有权访问某个系统,但担心有人会试图剥夺您的访问权限(并且是不择手段的),那么您通常会选择其中之一。黑客担心他们原来的进入路线会被关闭,或者其中一个拥有系统 root 权限的人担心其他人会剥夺他们的访问权限。在本例中,它是弗林自己的机器;他指望谁把他锁在门外,需要后门才能进去?我们可以简单地诉诸编剧的捷径:有时系统有后门,所以如果情节需要,你可以假设有后门,而且没有人需要提供现实世界的解释。但在这个练习中我们基本上不需要使用那种不回答的方式,所以我宁愿不这样做。我认为一个完美