如何在没有 /usr/bin/chmod 的情况下进行 chmod?

sun*_*ica 164 permissions chmod executable system-recovery

今天,一位 Unix 培训师告诉我一个故事,其中 root 密码被泄露给了学生,其中一个家伙从/usr/bin/chmod自己身上删除了执行权限。chmod在这种情况下如何恢复并使其再次可执行?假设从外部来源获取它或重新编译它不是一个更好的选择,是否有一些可以chmod自行恢复的智能黑客?

请注意,这发生在很久以前,我不是在寻找当前问题的解决方案,只是好奇 Unix 为我们提供了哪些解决此类问题的方法。

Mic*_*zek 208

您可以直接运行加载程序,并将您要运行的命令传递给它:

/lib/ld-linux.so /bin/chmod +x /bin/chmod
Run Code Online (Sandbox Code Playgroud)

您到加载程序的路径可能会有所不同。在 64 位系统上,您需要根据chmod编译方式选择正确的;64 位版本的名称类似于/lib64/ld-linux-x86-64.so.2

  • 我喜欢我学到新东西的任何一天。 (44认同)
  • 在 x86(32 位)Linux 上,动态链接器必须正好位于路径 `/lib/ld-linux.so.2`,在 x86-64(64 位)Linux 上,动态链接器必须正好位于路径路径`/lib64/ld-linux-x86-64.so.2`。这两个通常都是正确文件的符号链接,但需要存在确切的路径。 (6认同)
  • @gerrit 如果一切都未设置执行位,则使用实时 CD 重新启动系统并重置权限。但是,在这种情况下,重新安装整个系统可能更容易,因为谁知道在此过程中发生了什么。 (6认同)
  • 谢谢。ld-linux.so 本身有什么权限?(我只有 cygwin,它似乎没有这个文件。)这是一种覆盖可执行权限位的简单方法吗? (4认同)
  • 小更正:64 位库通常在`/lib64` 下 (2认同)
  • 如果它们的执行位也未设置怎么办? (2认同)

gol*_*cks 107

chmod实用程序依赖于chmod()系统调用(请参阅 参考资料man 2 chmod)。因此,您可以使用几行 C 或几乎任何其他带有包装器的语言(其中大部分是)来完成此操作。很少有 *nix 系统会缺少 C 编译器和 perl 解释器;大多数 linux 发行版都需要后者才能工作。

perl -e 'chmod 0755, "foobar.file"'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,好甜 我刚刚在 Perl 中尝试过,它奏效了。 (3认同)
  • @ruakh,在基于 Debian 的系统上, perl-base 包被标记为必不可少的。没有 perl-base 会让包管理器很不高兴。还有大量其他基本/重要的工具,例如 adduser 需要 perl,并且安装在绝对的准系统设置中。 (2认同)

fro*_*utz 72

有些系统也已经busybox安装,在这种情况下你可以运行:

busybox chmod +x /bin/chmod
Run Code Online (Sandbox Code Playgroud)

既然你要求黑客,我只是想到了另一个:

mv /bin/chmod /bin/chmod.orig
cp -a /bin/chown /bin/chmod
Run Code Online (Sandbox Code Playgroud)

现在你有一个/bin/chmod可执行文件,但它实际上是chown(即其他一些二进制文件)。现在我们要做的就是用原始二进制文件覆盖它。

dd if=/bin/chmod.orig of=/bin/chmod
Run Code Online (Sandbox Code Playgroud)

它保留了 +x 标志,因此您只需为这个文件窃取另一个文件的 +x 即可。

当然,如果所有这些替代二进制文件(包括加载程序、perl、python、gcc 等)都是 chmod -x,那么从救援系统修复它可能是唯一的选择。

  • 伟大的黑客,真的很聪明 (2认同)
  • +1,但是为什么要篡改现有的系统文件呢?为什么不直接做`cp /bin/tr /bin/newchmod && cp /bin/chmod /bin/newchmod`?似乎您不需要为 `cp` 指定任何选项。(我选择了 `tr`,因为它是一个小文件,名字简短,易于输入;显然,任何可执行文件,例如 `/bin/chown`,都可以使用。) (2认同)

Kaz*_*Kaz 47

简单。您可以做的是准备一些其他可执行文件,然后cp chmod将其覆盖。

 $ cp /bin/ls chmod
 $ cp /bin/chmod .
Run Code Online (Sandbox Code Playgroud)

第一个cp创建一个chmod具有可执行权限的文件,但它实际上是ls可执行文件。第二个cp用二进制代码填充这个文件chmod,同时保留目标文件的执行权限(因为我们没有指定任何选项来继承源文件的权限)。


另一种方法是使用install实用程序,它是一种美化的复制程序,可以一步设置权限。(见-m论证。)

$ install -m a+x /bin/chmod .
$ ./chmod # executes
Run Code Online (Sandbox Code Playgroud)

install程序不是 Unix 规范的一部分,但可以在 BSD 和 GNU Coreutils 中找到。两者都支持-m具有类似 chmod 语法的选项,包括符号和八进制。

  • 执行此操作时,请确保您不在 /bin 内,否则第一步将覆盖真正的 chmod。 (9认同)
  • +1 表示“安装”。这么多解决方案。:) (2认同)

Eig*_*ony 16

我头顶上的第一件事,

  • 从任何其他来源(网络书籍、CD 等)启动并使用该来源上的 chmod 来设置权限。
  • 编写一个微型 C 程序来更改权限。
  • 编写perl脚本(ruby、php、python等)修改权限

/usr/bin/chmod 只是进行系统调用来更改权限,您可以通过多种方式自己进行系统调用。


Sco*_*ott 13

这比任何其他答案都更骇人听闻(答案可能除外ld-linux.so,这是一个非常聪明的技巧),但可能更适合其他问题(特别是如果您陷入时间漩涡并回到之前的土地Perl™)。

  1. 为了安全起见,复制/bin/chmod到安全的地方:

    cd
    cp /bin/chmod .
    
    Run Code Online (Sandbox Code Playgroud)
  2. echo chmod | cpio -oc > chmod.cpio
    这将创建一个cpio档案(不象一个tar存档)包含chmod。该-c选项指定文件元数据以十六进制(即 ASCII)写入。

  3. vi chmod.cpio
    你会看到类似的东西

    0707010005DBFD000081A4000303E9000302010000000155C64D6E0000C01D000068E70000C361…chmod^@…
                       ???
    
    Run Code Online (Sandbox Code Playgroud)

    后跟控制字符、标准 ASCII 字符和扩展 ASCII 字符的混合。请注意,0644 = 0x1A4 和 0755 = 0x1ED。找到1A4(从第 20 个字符位置开始)并将其更改为1ED. 保存并退出。

    • 如果您有十六进制编辑器或类似的东西,最好使用它来避免vi污染文件中二进制可执行代码的风险。但是我用 尝试了这个vi,它似乎工作正常。
  4. cpio -i < chmod.cpio
    您现在chmod在您的目录中有一个受保护的 755的副本。

其他存档程序可能具有类似的功能。特别是,cpio是旧的,可​​能会被弃用;如果没有,请寻找pax

  • 这让我笑了,不错的小黑客 (2认同)

小智 9

甚至更容易 -setfacl现代系统中经常出现的使用:

  1. 为用户设置可执行权限:

    # setfacl -m u::rx /bin/chmod
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在使用现在可执行的二进制文件将其自己的权限设置回原始权限(即所有用户)

    # chmod +x /bin/chmod
    
    Run Code Online (Sandbox Code Playgroud)
  3. 删除扩展的 ACL 条目 - 可选,因为它们首先出现在那里可能有充分的理由。

    # setfacl -b /bin/chmod
    
    Run Code Online (Sandbox Code Playgroud)

请注意,它setfacl也可以用于不支持 ACL 的文件系统。


小智 7

rsync 也可用于更改文件的权限

# rsync /bin/chmod /tmp/chmod --chmod=ugo+x
# ls -al /tmp/chmod
  -rwxr-x--- 1 root root 52000 Sep  6 15:13 /tmp/chmod
#
Run Code Online (Sandbox Code Playgroud)


小智 5

将 chmod 的内容通过管道传输到一个已经可执行的文件中

cp /usr/bin/executable_file ~/executable_file
cat /usr/bin/chmod > ~/executable_file
~/executable_file +x file_to_be_executed.sh
Run Code Online (Sandbox Code Playgroud)