这个混淆的Perl脚本如何工作?

时间:2014-07-04 17:41:37

标签: perl obfuscation

有人让我帮助他对以下Perl脚本进行去混淆 被发送给他,怀疑它是连接到一些外部服务器 但是,我不是Perl专家,所以我真的不明白 所有这些都发生在这里。

据他说,脚本应该处理一个input.txt文件 生成和HTML文件,带有一些命令行参数A, B, C, ...。 因此,您可以使用以下命令运行脚本:

MAGIC_NO_JAVASCRIPT=1 perl ./179252S0 gghkla5673lju-magic input.txt 1 A B C > output.html

模糊的Perl脚本179252S0只包含以下行, 接着是大约1 MB的行,其中包含不同数量的空格和制表符 在每一行。我只会给第一行,但你可以下载和 看看整篇文章here

第一行内容如下:

$_=<<'';y;\r\n;;d;$_=pack'b*',$_;$_=eval;$@&&die$@;$_

这是做什么的,我怎么能理解它?

我实际上通过替换$_=eval来设法看到部分代码 print $_,但该代码也被混淆了。

编辑:感谢Slade的分析和一些手工劳动,我可以得出结论,这个脚本的其余部分使用Acme::Floral使用类似的东西进行了混淆:

perl -MAcme::Floral my_script.pl > floral_script.pl

并进行网络调用:

  • a)一个webtool站点,用于提供内置的统计信息和页面计数器 到结果*.html页面。
  • b)另一个抓取图片文件进行html加载的网站。

但由于最后一次混淆,我们不能完全排除其他事情正在发生,没有大量的额外工作。


<子> PS。我留下了原始名称和神秘的“魔法”参数,因为我认为去混淆算法也依赖于此。

1 个答案:

答案 0 :(得分:4)

让我们首先清理第一行的混淆语法。 $_=<<'';成为

$_ = <<'';

这只是一个没有分隔符的heredoc;它将行下面的所有内容读入$ _变量。

y;\r\n;;d;变为

tr/\r\n//d;

这就是使用分号作为分隔符和类似sed的y///形式的音译运算符,这意味着与tr///完全相同。 d标志表示没有替换的字符将被删除,并且tr默认在$ _上运行,因此该语句只是从$ _的内容中删除DOS样式的行结尾。

$_=pack'b*',$_;变为

$_ = pack('b*', $_);

它接受$ _的内容并将其视为一个位串,将所有空格转换为Perl代码的文本字符串。

$_=eval;$@&&die$@;$_变为

$_ = eval;
$@ && die $@;
$_

此处的第一行使用eval的“字符串评估”形式。它将采用音译和解压缩的代码,然后解析并执行它。

$@ && die $@;只是写die $@ if $@;的愚蠢方式。 $ @是eval错误变量;如果代码无法解析并正确执行,它将保存一个真值,因此如果有错误,脚本将会死于该错误。

之后的唯一$_将是解释器看到的最后一个语句。它被赋予eval语句的返回值,当且仅当成功解析给eval的代码时才会为真。 Perl模块需要一些真值才能成为文件中的最后一个语句(通常只有1;)。如果反混淆出现问题,将$_置于此处将表示模块加载失败。

您的朋友是否对它连接到外部服务器是正确的更难确定。通过它进行的几次搜索似乎表明它没有导入任何网络模块(唯一的use语句是use strict 'refs';,而且没有requires),它没有似乎使用了任何可疑的内置函数(第一行中没有eval;除了open之外,没有与文件系统交互的函数可能用于处理输入文本文件;没有Perl的内置网络功能(所有这些功能都以'set','get'或'end'开头);而且没有Perl的套接字功能。

当然,不能保证它生成的JavaScript是良性的,但Perl脚本似乎没有访问网络。如果脚本在执行时没有做任何明显有害的事情,你的朋友可以尝试使用像Wireshark这样的工具来查找任何恶意网络,否则需要进行严格的审计才能发现。