Deparsing/Decomposing - 这个混淆的perl脚本的一步一步

caj*_*ine 7 perl deobfuscation

作为标题 - 请任何人解释下一个脚本的工作原理

这打印文字:"Perl家伙很聪明"

''=~('(?{'.('])@@^{'^'-[).*[').'"'.('-[)@{:__({:)[{(-:)^}'^'}>[,[]*&[[[[>[[@[[*_').',$/})')
Run Code Online (Sandbox Code Playgroud)

这只打印"b"

use strict;
use warnings;
''=~('(?{'.('_/).+{'^'/]@@_[').'"'.('=^'^'_|').',$/})')
Run Code Online (Sandbox Code Playgroud)

perl -MO = Deparse只显示:

use warnings;
use strict 'refs';
'' =~ m[(?{print "b",$/})];
Run Code Online (Sandbox Code Playgroud)

但不知道为什么......;(

像脚本一样分解的推荐方法是什么?怎么开始?

所以试过这个:

'' =~
(
        '(?{'
        .
        (
                '])@@^{' ^ '-[).*['
        )
        .
        '"'
        .
        (
                 '-[)@{:__({:)[{(-:)^}' ^ '}>[,[]*&[[[[>[[@[[*_'
        )
        .
        ',$/})'
)
Run Code Online (Sandbox Code Playgroud)

几个部分连接在一起..按位的结果^可能给出了文本部分.的:

perl -e "print '-[)@{:__({:)[{(-:)^}' ^ '}>[,[]*&[[[[>[[@[[*_'"
Run Code Online (Sandbox Code Playgroud)

打印"Perl家伙很聪明",第一次^产生"打印".

但是,当我重写它时:

'' =~
(
    '(?{'
    .
    (
        'print'
    )
    .
    '"'
    .
    (
         'Perl guys are smart'
    )
    .
    ',$/})'
)
Run Code Online (Sandbox Code Playgroud)

我的perl告诉我:

panic: top_env
Run Code Online (Sandbox Code Playgroud)

奇怪,我第一次看到像错误信息...

那意思是:这是不允许更换'str1' ^ 'str2'result,(不明白为什么),为什么perl的打印故障消息?

我的perl:

This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-multi-2level
Run Code Online (Sandbox Code Playgroud)

Ps:这里生成示例

Pav*_*sov 5

在线

.('_/).+{' ^ '/]@@_[
Run Code Online (Sandbox Code Playgroud)

当你评价时']' ^ '-',结果就是这封信p.^是一个按位字符串操作,所以在此之后我们逐字逐句地获取结果字符串.

检查我的脚本,它就像你的例子.我希望它会对你有所帮助.

use v5.14;

# actually we obfuscated print and your word + "
# it looks like that (print).'"'.(yor_word")
my $print  = 'print';
my $string = 'special for stackoverflow by fxzuz"';

my $left  = get_obfuscated($print);
my $right = get_obfuscated($string);

# prepare result regexp
my $result = "'' =~ ('(?{'.($left).'\"'.($right).',\$/})');";

say 'result obfuscated ' .  $result;
eval $result;

sub get_obfuscated {

    my $string = shift;
    my @letters = split //, $string;

    # all symbols like :,&? etc (exclude ' and \)
    # we use them for obfuscation
    my @array = (32..38, 40..47, 58..64, 91, 93..95, 123..126);

    my $left_str = '';
    my $right_str = '';

    # obfuscated letter by letter
    for my $letter (@letters) {

        my @result;
        # get right xor letters
        for my $symbol (@array) {

            # prepare xor results
           my $result = ord $letter ^ $symbol;
           push @result, { left => $result, right => $symbol } if $result ~~ @array;
        }

        my $rand_elem = $result[rand $#result];
        $left_str  .= chr $rand_elem->{left};
        $right_str .= chr $rand_elem->{right};
    }

    my $obfuscated = "'$left_str' ^ '$right_str'";
    say "$string => $obfuscated";

    return $obfuscated;
}
Run Code Online (Sandbox Code Playgroud)