Linux 解密混淆的perl脚本

Linux 解密混淆的perl脚本,linux,perl,security,spam,Linux,Perl,Security,Spam,我的服务器上出现了一些垃圾邮件问题,在发现并删除了一些Perl和PHP脚本后,我开始检查它们的真正功能,尽管我是一名高级PHP程序员,但我对Perl几乎没有经验,这里有谁能帮我处理一下脚本: (这是一行很长的代码,脚本名为list.pl) 脚本的开头是: $??s:;s:s;;$?::s;(.*); ]="&\%[=.*.,-))'-,-#-*.).<.'.+-<-~-#,~-.-,.+,~-{-,.<'`.{'`'<-<--):)++,+#,-.{).

我的服务器上出现了一些垃圾邮件问题,在发现并删除了一些Perl和PHP脚本后,我开始检查它们的真正功能,尽管我是一名高级PHP程序员,但我对Perl几乎没有经验,这里有谁能帮我处理一下脚本:

(这是一行很长的代码,脚本名为list.pl)


脚本的开头是:

$??s:;s:s;;$?::s;(.*); ]="&\%[=.*.,-))'-,-#-*.).<.'.+-<-~-#,~-.-,.+,~-{-,.<'`.{'`'<-<--):)++,+#,-.{).+,,~+{+,,<)..})<.{.)-,.+.,.)-#):)++,+#,-.{).+,,~+{+,,<)..})<*{.}'`'<-<--):)++,+#,-.{).+:,+,+,',~+*+~+~+{+<+,)..})<'`'<.{'`'<'<-}.<)'+'.:*}.*.'-|-<.+):)~*{)~)|)++,+#,-.{).+:,+,+,',~+*+~+~+{+<+,)..})

要求模块使其(稍微)可读。

替换
s;(.*);$_;看print
获取代码。替换
s;(.*);$_;看打印
,这是解密代码。有效负载的后半部分是要解密的代码,但我不能再进一步了,因为正如您所看到的,解密代码正在envvar或cookie中寻找密钥(因此,大概只有脚本的创建者可以控制或解码它),而我没有该密钥。这实际上是相当聪明的做法。

对于那些对细节感兴趣的人来说。。。第一部分,当解缠结看起来像这样时:

$?  ?  s/;s/s;;$?/ :
       s/(.*)/...lots of punctuation.../;
行开头的
$?
是预定义的变量,它无疑只起到混淆作用。它将是未定义的,因为此时可能没有子错误

后面的问号是三元运算符的开始

CONDITION ? IF_TRUE : IF_FALSE
这也只是为了混淆。返回true的表达式是替换正则表达式,其中斜杠分隔符已替换为冒号
s:pattern:replacement:
。上面,我放回了斜杠。另一个将要执行的表达式也是一个替换正则表达式,尽管它非常长。分隔符是分号

此替换使用相当多的标点符号替换
*
中的
*
(默认输入和模式搜索空间),标点符号代表大部分代码。由于
*
匹配任何字符串,即使是空字符串,它将被简单地插入到
$\u
中,并且无论出于何种目的,都与简单地将字符串分配给
$\u
相同,这就是我所做的:

$_ = q;]="&\%[=.*.,-))'-,-# .......;;
以下行是一个和另一个替换。(我插入注释以指出分隔符)

下一个换人是魔术发生的地方。它也是一个带有模糊分隔符的替换,但有三个:
请参见
s在这种情况下不起任何作用,因为它只允许通配符
匹配换行符<但是,code>ee
表示对表达式求值两次

为了看我在评估什么,我进行了音译并打印了结果。我怀疑我在这一行的某个地方有一些字符被破坏了,因为有一些细微的错误,但下面是简短的(清理过的)版本:

长正则表达式再次成为数据容器,并将数据插入要作为代码计算的
$\uu

s/(..)/chr(hex($1))/eg开始变得相当清晰。它基本上是一次从
$\uu
读取两个字符,并将其从十六进制转换为相应的字符

最后一行的下一行
&e\u echr(\$)让我困惑了一段时间,但它是一个子程序,定义在这个经过评估的代码的某个地方,因为霍布斯能够很好地解码。美元符号的前缀是反斜杠,这意味着它是对
$\uucode>的引用:即子程序可以更改全局变量


经过多次求值后,
$\uu
将通过此子例程运行,然后最后一次求值
$\u
中包含的任何内容。大概这次是在执行代码。正如霍布斯所说,需要一个密钥,它来自脚本运行所在机器的环境
%ENV
。我们没有。

在我看来像是普通的Perl。。。您确定此脚本不是经过商业许可的故意混淆的脚本吗?我们不是来帮助你违反许可协议的。我很想知道这是否有什么作用,但我真的不想在工作中运行它。这让我想起了一个即使是相当有经验的Perl程序员也会面对这样的垃圾而畏缩。它做什么并不重要;这是一个可怕的代码。@MarcB那真是鬼鬼祟祟的,不是吗?如果可以的话,请说清楚,如果它看起来是“商业的”@JonathanLeffler,用来从我的服务器发送垃圾邮件,请不要告诉我结果。我很想知道它是否与其他服务器连接,是的,这很可怕,就像我说的,我对PHP代码进行了模糊处理。我在代码中尝试了这一点(当我用
Perl-c list.pl
检查时,Perl说这是可以的);DeParse不想和我有任何关系——或者可能是它抱怨的代码。(
Perl-MO=DeParse list.pl
和一些小的变体。错误是
在(eval 1)调用的未定义的子例程&B::DeParse::compile)第24行。检查失败--呼叫队列中止。
)@JonathanLeffler那是因为Deparse的拼写是Deparse,而不是Deparse。谢谢-我没有注意到这一点,真是个白痴。Deparse的输出并不容易理解,尽管有些正则表达式更为清晰。一位同事指出,如果代码仍在运行,人们可以执行
cat/proc//env
,并可能发现什么加密密钥是(通过
E_-key
HTTP_-COOKIE
)。@编码者-这个脚本在你的服务器根目录下可见吗?如果你想进一步研究这个问题,也许你想放一个新脚本来捕获密钥。我会说它非常聪明,如果不是很有帮助的话。-)看起来很像Mirai,一个乌克兰perl特洛伊木马,在小型网络设备中漫游。非常感谢你花时间做这一切。
$_ = q;]="&\%[=.*.,-))'-,-# .......;;
y; -"[%-.:<-@]-`{-}#~\$\\;{\$()*.0-9\;\\_rs}&a-h;;
#^                       ^           ^          ^
#1                       2                      3
s;(.*);$_;see;
s;(.*);73756220656e6372797074696f6e5f6 .....;;  # very long line of alphanumerics
s;(..);chr(hex($1));eg;
s;(.*);$_;see;
s;(.*);704b652318371910023c761a3618265 .....;;  # another long line
s;(..);chr(hex($1));eg; 
&e_echr(\$_);
s;(.*);$_;see;