作为标题 - 请任何人解释下一个脚本如何工作
这打印文本:“Perl家伙很聪明”
''=~('(?{'.('])@@^{'^'-[).*[').'"'.('-[)@{:__({:)[{(-:)^}'^'}>[,[]*&[[[[>[[@[[*_').',$/})')
这只打印“b”
use strict;
use warnings;
''=~('(?{'.('_/).+{'^'/]@@_[').'"'.('=^'^'_|').',$/})')
perl -MO = Deparse仅显示:
use warnings;
use strict 'refs';
'' =~ m[(?{print "b",$/})];
但不知道为什么......;(
像脚本一样分解的推荐方法是什么?怎么开始?
所以,试过这个:
'' =~
(
'(?{'
.
(
'])@@^{' ^ '-[).*['
)
.
'"'
.
(
'-[)@{:__({:)[{(-:)^}' ^ '}>[,[]*&[[[[>[[@[[*_'
)
.
',$/})'
)
几个部分由.
连接在一起。按位^
的结果可能会给出文本部分。的:
perl -e "print '-[)@{:__({:)[{(-:)^}' ^ '}>[,[]*&[[[[>[[@[[*_'"
打印“Perl家伙很聪明”,第一个^
生成“打印”。
但是,当我重写它时:
'' =~
(
'(?{'
.
(
'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
答案 0 :(得分: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;
}
答案 1 :(得分:3)
理解这里发生的事情的技巧是查看由XOR和连接构造的字符串:
(?{print "Perl guys are smart",$/})
这是(?{ code })形式的实验正则表达式功能。所以你看到打印到终端的是
的结果print "Perl guys are smart",$/
由''=~...
调用。 $/
是Perl的输入记录分隔符,默认情况下是换行符。