7

タイトルの通り - 次のスクリプトがどのように機能するかを誰か説明してください

これはテキストを出力します:

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

これは「b」のみを出力します

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

perl -MO=Deparse はこれだけを示します:

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

しかし、理由がわかりません... ;(

スクリプトのように分解する推奨される方法は何ですか? 始める方法は?

だから、これを試しました:

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

によっていくつかの部分が連結され.ます。そして、ビットごとの結果は^おそらくテキスト部分を与えます。:

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

「Perl の連中は賢い」と最初に^生成された「print」を出力します。

しかし、いつ、私はそれを次のように書き直します:

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

私のperlは私に言った:

panic: top_env

奇妙な、初めてエラーメッセージのようなものを見た...

'str1' ^ 'str2'つまり、を ,に置き換えることは許可されてresultいません (理由がわかりません)。なぜ perl はパニック メッセージを出力するのですか?

私のパール:

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

Ps: 例はここで生成されます

4

2 に答える 2

5

ラインで

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

評価する']' ^ '-'と、結果は文字になり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;
}
于 2012-06-16T13:10:53.413 に答える
3

ここで何が起こっているのかを理解する秘訣は、XOR と連結によって構築されている文字列を見ることです。

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

これは(?{ code })という形式の実験的な正規表現機能です。したがって、ターミナルに表示されるのは、次の結果です

print "Perl guys are smart",$/

によって呼び出され''=~...ます。$/Perl の入力レコードセパレーターで、デフォルトでは改行です。

于 2012-06-16T12:01:12.867 に答える