/ / Desparsing / Decompor - passo a passo este script perl ofuscado - perl, desofuscation

Separando / Decompondo - passo a passo esse script perl ofuscado - perl, desobfuscation

Quanto ao título - alguém pode explicar como funcionam os próximos scripts

isso imprime o texto: "Perl guys are smart"

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

isso imprime apenas "b"

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

o perl -MO = Deparse mostra apenas isto:

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

mas não tenho ideia do porquê ...; (

Qual é a maneira recomendada de decompor como scripts? Como começar?

então, tentei isto:

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

várias partes são concatenadas por .. E o resultado do bit a bit ^ provavelmente dá as partes do texto. O:

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

imprime "Perl guys are smart" e o primeiro ^ gerando "impressão".

Mas quando, eu reescrevo para:

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

Meu perl me disse:

panic: top_env

Estranho, a primeira vez que vi uma mensagem de erro ...

Isso significa: não é permitido substituir o "str1" ^ "str2" com o result, (não entendo por que) e por que o perl imprime a mensagem de pânico?

meu perl:

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

Ps: exemplos são gerados Aqui

Respostas:

5 para resposta № 1

Na linha

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

quando você avalia "]" ^ "-", o resultado será a carta p. ^ é uma operação de string bit a bit, então, depois disso, seguimos letra por letra para obter a string de resultado.

Verifique meu script, ele funciona como o seu exemplo. Espero que ajude você.

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;
}

3 para resposta № 2

O truque para entender o que está acontecendo aqui é olhar para a string que está sendo construída pelos XORs e concatenações:

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

Este é um recurso experimental de expressão regular do formulário (? {código}). Então, o que você vê impresso no terminal é o resultado de

print "Perl guys are smart",$/

sendo invocado por ""=~.... $/ é o separador de registro de entrada do Perl, que por padrão é uma nova linha.