【问题标题】:Deparsing/Decomposing - step-by-step this obfuscated perl scriptDeparsing/Decomposing - 一步一步的混淆 perl 脚本
【发布时间】:2012-06-16 10:48:29
【问题描述】:

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

这会打印文本:“Perl guy are smart”

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

这只会打印“b”

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

perl -MO=Deparse 只显示这个:

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

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

推荐的分解脚本的方法是什么?如何开始?

所以,试试这个:

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

几个部分由. 连接。而按位 ^ 的结果可能会给出文本部分。该:

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

打印“Perl guy are smart”和第一个 ^ 生成“print”。

但是什么时候,我把它改写成:

'' =~
(
    '(?{'
    .
    (
        'print'
    )
    .
    '"'
    .
    (
         'Perl guys are smart'
    )
    .
    ',$/})'
)

我的 perl 告诉我:

panic: top_env

奇怪,第一次看到这样的错误信息...

这意味着:不允许将'str1' ^ 'str2' 替换为result,(不明白为什么)以及为什么perl 会打印出恐慌消息?

我的 perl:

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

Ps:示例生成here

【问题讨论】:

  • 但是说真的,没有人应该写这样的代码,所以没有理由去理解它。
  • 现在明白了。没有人应该受伤,所以这里没有理由学习急救。 ;)
  • 其实我觉得很有意思,也想了解一下。
  • @cajwine:如果有人写这样的代码(不是开玩笑),那他们就是个白痴。如果您发现自己(例如)处于可以容忍此类代码的工作环境中,那么您应该离开。但无论哪种方式,我仍然建议将“学习 Perl”作为第一步!
  • @OliCharlesworth,我真的不明白为什么你不能接受它只是作为“用 perl 完成的奇怪事情”的简单演示。我很确定没有人在现实生活中使用它。这并不意味着这样的代码可以生成字符串至少是有趣的。

标签: perl deobfuscation


【解决方案1】:

排队

.('_/).+{' ^ '/]@@_[

当您评估']' ^ '-' 时,结果将是字母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;
}

【讨论】:

    【解决方案2】:

    了解这里发生的事情的诀窍是查看由 XOR 和连接构造的字符串:

    (?{print "Perl guys are smart",$/})
    

    这是(?{ code }) 形式的实验性正则表达式功能。所以你看到打印到终端的是

    print "Perl guys are smart",$/
    

    ''=~... 调用。 $/ 是 Perl 的输入记录分隔符,默认是换行符。

    【讨论】:

      猜你喜欢
      • 2012-03-24
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 2014-07-14
      • 1970-01-01
      相关资源
      最近更新 更多