解密混淆perl脚本

The*_*der 14 linux security perl spam

有一些垃圾邮件问题,我的服务器上,并找出和消除一些Perl和PHP脚本,我到检查他们真正做之后,虽然我是一个高级PHP程序员我有Perl的一点经验,任何人都可以给我一个手写脚本在这里:

http://pastebin.com/MKiN8ifp

(这是一长串代码,脚本叫做list.pl)


脚本的开头是:

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

它继续使用珍贵的少数非标点字符,直到最后:

0-9\;\\_rs}&a-h;;s;(.*);$_;see;
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 26

更换s;(.*);$_;see;print得到这个.在有效负载的前半部分s;(.*);$_;see;再次替换print以获取此信息,这是解密代码.有效载荷的后半部分是要解密的代码,但我不能再深入了解它,因为如你所见,解密代码正在寻找envvar或cookie中的密钥(这样只有脚本的创建者可以控制它或解码它,大概是),我没有那把钥匙.这实际上是相当巧妙的.

  • 和`严格'兼容! (3认同)
  • 一位同事指出,如果代码仍在运行,可以执行`cat/proc/<pid>/env`并可能找出加密密钥是什么(通过`E_KEY`或`HTTP_COOKIE`). (2认同)

TLP*_*TLP 17

对于那些对细节感兴趣的人......第一部分,当去纠结时看起来像这样:

$?  ?  s/;s/s;;$?/ :
       s/(.*)/...lots of punctuation.../;
Run Code Online (Sandbox Code Playgroud)

$?行的开头是包含子错误的预定义变量,毫无疑问它仅用作混淆.它将是未定义的,因为此时可能没有子错误.

跟随它的问号是三元运算符的开始

CONDITION ? IF_TRUE : IF_FALSE
Run Code Online (Sandbox Code Playgroud)

这也简单地添加到混淆.返回true的表达式是替换正则表达式,其中/斜杠分隔符已替换为冒号s:pattern:replacement:.在上面,我已经放回斜线.另一个表达式,即将要执行的表达式也是替换正则表达式,尽管是一个非常长的表达式.分隔符是分号.

这种替换取代.*$_- 默认输入和模式搜索空间 - 带有相当大量的标点符号,代表了大部分代码.因为.*匹配任何字符串,甚至是空字符串,它只会被插入$_,并且与所有意图和目的相同,只是简单地将字符串分配给$_,这就是我所做的:

$_ = q;]="&\%[=.*.,-))'-,-# .......;;
Run Code Online (Sandbox Code Playgroud)

以下行是音译和另一种替换.(我插入注释以指出分隔符)

y; -"[%-.:<-@]-`{-}#~\$\\;{\$()*.0-9\;\\_rs}&a-h;;
#^                       ^           ^          ^
#1                       2                      3
Run Code Online (Sandbox Code Playgroud)

(1,2,3是分隔符,2到3之间的分号被转义)

它的基本要点是各种字符和范围-"(空间到双引号),以及看起来像字符类(带范围)的东西[%-.:<-@],但不是,被音译成更易读的字符,例如花括号,美元符号,括号,0-9

s;(.*);$_;see;
Run Code Online (Sandbox Code Playgroud)

下一个替代是魔术发生的地方.它也是混淆分隔符的替代品,但有三个修饰符:see.s在这种情况下什么都不做,因为它只允许通配符.匹配换行符.ee但是,表示两次评估表达式.

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

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;
Run Code Online (Sandbox Code Playgroud)

长正则表达式再一次是数据容器,并将数据插入$_以作为代码进行评估.

s/(..)/chr(hex($1))/eg;开始看起来相当清晰.它基本上是从当前读取两个字符$_并将其从十六进制转换为相应的字符.

接下来的最后一行&e_echr(\$_);让我困扰了一段时间,但它是一个子程序,在这个评估代码的某处定义,因为hobbs如此恰当地能够解码.美元符号以反斜杠为前缀,这意味着它是对以下内容的引用$_:即子例程可以更改全局变量.

经过相当多的评估后,$_运行这个子程序,然后在$_最后一次评估包含的内容.大概这次执行代码.正如hobbs所说,需要一个密钥,它取自%ENV脚本运行的机器的环境.我们没有.

  • 感谢您抽出宝贵时间来做这一切. (2认同)

DCo*_*der 6

B :: Deparse模块让它(更多一点)可读.

  • @JonathanLeffler那是因为Deparse拼写为Deparse,而不是DeParse. (2认同)