有人让我帮助他对以下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
并进行网络调用:
*.html
页面。 但由于最后一次混淆,我们不能完全排除其他事情正在发生,没有大量的额外工作。
<子> PS。我留下了原始名称和神秘的“魔法”参数,因为我认为去混淆算法也依赖于此。
答案 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这样的工具来查找任何恶意网络,否则需要进行严格的审计才能发现。