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
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)
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,那么从救援系统修复它可能是唯一的选择。
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 语法的选项,包括符号和八进制。
Eig*_*ony 16
我头顶上的第一件事,
/usr/bin/chmod 只是进行系统调用来更改权限,您可以通过多种方式自己进行系统调用。
Sco*_*ott 13
这比任何其他答案都更骇人听闻(答案可能除外ld-linux.so,这是一个非常聪明的技巧),但可能更适合其他问题(特别是如果您陷入时间漩涡并回到之前的土地Perl™)。
为了安全起见,复制/bin/chmod到安全的地方:
cd
cp /bin/chmod .
Run Code Online (Sandbox Code Playgroud)做echo chmod | cpio -oc > chmod.cpio
这将创建一个cpio档案(不象一个tar存档)包含chmod。该-c选项指定文件元数据以十六进制(即 ASCII)写入。
vi chmod.cpio
你会看到类似的东西
0707010005DBFD000081A4000303E9000302010000000155C64D6E0000C01D000068E70000C361…chmod^@…
???
Run Code Online (Sandbox Code Playgroud)
后跟控制字符、标准 ASCII 字符和扩展 ASCII 字符的混合。请注意,0644 = 0x1A4 和 0755 = 0x1ED。找到1A4(从第 20 个字符位置开始)并将其更改为1ED. 保存并退出。
vi污染文件中二进制可执行代码的风险。但是我用 尝试了这个vi,它似乎工作正常。cpio -i < chmod.cpiochmod在您的目录中有一个受保护的 755的副本。其他存档程序可能具有类似的功能。特别是,cpio是旧的,可能会被弃用;如果没有,请寻找pax。
小智 9
甚至更容易 -setfacl现代系统中经常出现的使用:
为用户设置可执行权限:
# setfacl -m u::rx /bin/chmod
Run Code Online (Sandbox Code Playgroud)现在使用现在可执行的二进制文件将其自己的权限设置回原始权限(即所有用户)
# chmod +x /bin/chmod
Run Code Online (Sandbox Code Playgroud)删除扩展的 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)
| 归档时间: |
|
| 查看次数: |
58039 次 |
| 最近记录: |