Perl 奇怪的源代码

标签 perl

我确实找到了可以正常运行的非字母数字 perl 代码!
代码的开头:

eval eval '"'.
('!'^'+').'#'.('`'^'!').('['^'.').('['^'/').('`'|'(').('`'|'/').('['^')').':'.('{'^'/').('['^"\,").(
'`'|'%').('`'|'.').('['^'/').('['^'"').('`'^'/').('`'|'.').('`'|'%').('!'^'+').'#'.('`'^'$').(('`')|
'!').('['^'/').('`'|'%').':'.('`'^'!').('['^'.').('`'|"'").('['^'.').('['^'(').('['^'/').('{'^'[')

here是 pastebin 中的文件。那是怎么发生的:D

最佳答案

注意双字符串 eval。最右边的 eval 解释所有 ("["^"/") 类型的片段并将它们连接在一起。最左边的 eval 运行由最右边 eval 的解释产生的字符串。

小 (....) 片段每个(大部分)采用一个字符并使用另一个字符执行按位运算,例如 xoror。因此,例如,("["^"/") 变成了单个字符 't'。这与连接相结合构建了一个字符串,该字符串是实际可运行的 Perl 代码(如果您解开第一个(最右边的)eval,这看起来会更合理)。事实上,很容易看到真正的代码是什么样子的。只需将最左边的“eval ”替换为“print ”,您就会看到最右边的 eval 如何转换代码。

这是输出:

#Author:TwentyOne
#Date:August 21, 1969
#Title:md5bf.pl
#Description:Generates MD5 checksums provided by brute_keyword and then testing itself against the supplied hashster
#Contact <<<<<removed in SO post>>>>>
$speed = "1";

if ($speed<=0)
{ 
die "Set the speed equal or greater than one.\n";
}

use Digest::MD5 qw(md5_hex);
use Time::HiRes qw(gettimeofday);

if ($ARGV[0] =~"new") {
system('clear');
print "Enter a string\n";
print ">";
chomp(my $ask = <STDIN>);
system('clear');
system("echo -n '$ask' | md5sum\n");
exit(1);
}

if ($ARGV[0]=~"l") {
 $brute = "abcdefghijklmnopqrstuvwxyz";}
if ($ARGV[0]=~"u") {
 $brute = $brute. "ABCDEFGHIJKLMNOPQRSTUVWXYZ";}
if ($ARGV[0]=~"n") {
 $brute = $brute."1234567890";}
if ($ARGV[0]=~"x") {
 $brute = $brute. "!\"\$%&/()=?-.:~\\*'-_:.;,";}
if ($ARGV[0]=~"lu") {
 $brute = $brute. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";}
if ($ARGV[0]=~"ln") {
 $brute = $brute. "abcdefghijklmnopqrstuvwxyz1234567890";}
if ($ARGV[0]=~"un") {
 $brute = $brute. "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";}
if ($ARGV[0]=~"all") {
 $brute = $brute. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!\"\$%&/()~=?-.:\\*'-_:.;,1234567890";}

if (! $ARGV[0]) {
usage();
exit(1);
}
if (! $ARGV[1]) {
usage();
exit(1);
}
if (! $ARGV[2]) {
usage();
exit(1);
}
if (! $ARGV[3]) {
usage();
exit(1);
}

if ($ARGV[3]) { 
    if (length($ARGV[3]) != 32) {
    print "MD5 Is Not Valid\n";
    sleep(1);
    system('clear');
    exit(1);
    }
}

if ($ARGV[0]=~"all") { 
print "Starting to Crack '$ARGV[3]'...\n";
sleep(2);
}else{
print "Starting to Crack '$ARGV[3]'...\n";
sleep(2);
}

for (my $bfv=$ARGV[1];$bfv<=$ARGV[2];$bfv++){
 crack ($bfv);
}

sub usage{
system('clear');
print '

████████╗██╗    ██╗███████╗███╗   ██╗████████╗██╗   ██╗ ██████╗ ███╗   ██╗███████╗\'s MD5 BRUTEFORCER
╚══██╔══╝██║    ██║██╔════╝████╗  ██║╚══██╔══╝╚██╗ ██╔╝██╔═══██╗████╗  ██║██╔════╝
   ██║   ██║ █╗ ██║█████╗  ██╔██╗ ██║   ██║    ╚████╔╝ ██║   ██║██╔██╗ ██║█████╗  
   ██║   ██║███╗██║██╔══╝  ██║╚██╗██║   ██║     ╚██╔╝  ██║   ██║██║╚██╗██║██╔══╝  
   ██║   ╚███╔███╔╝███████╗██║ ╚████║   ██║      ██║   ╚██████╔╝██║ ╚████║███████╗
   ╚═╝    ╚══╝╚══╝ ╚══════╝╚═╝  ╚═══╝   ╚═╝      ╚═╝    ╚═════╝ ╚═╝  ╚═══╝╚══════╝
';

print "\nUsage: perl $0 (brute_char) MIN_CHAR MAX_CHAR MD5 (options)" . "\n";
print "Ex) perl $0 all 1 5 865c0c0b4ab0e063e5caa3387c1a8741" . "\n";
print "brute_char // options;
all |   ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!\"\$%&/()~=?-.:\\*'-_:.;,1234567890
-
l   |   abcdefghijklmnopqrstuvwxyz
-
u   |   ABCDEFGHIJKLMNOPQRSTUVWXYZ
-
n   |   1234567890
-
x   |   !\"\$%&/()=?-.:~\\*'-_:.;,
-
lu  |   ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-
ln  |   abcdefghijklmnopqrstuvwxyz1234567890
-
un  |   ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890
---
new |   Generates MD5 Hash
-
v   |   Verbose (print output)
";
}

sub crack{
 $CharSet = shift;
 @RawString = ();
 for (my $i =0;$i<$CharSet;$i++){ $RawString[i] = 0;}
 $Start = gettimeofday();
 do{
  for (my $i =0;$i<$CharSet;$i++){
   if ($RawString[$i] > length($brute)-1){
    if ($i==$CharSet-1){
    print "Bruteforce finished, no results with $CharSet charachters. \n";
    $count=0;
    return false;
   }
   $RawString[$i+1]++;
   $RawString[$i]=0;
   }
  }

   $ret = "";
   for (my $i =0;$i<$CharSet;$i++){ $ret = $ret . substr($brute,$RawString[$i],1);}
   $hash = md5_hex($ret);
   $count++;
   $Stop = gettimeofday();
   if ($Stop-$Start>$speed){
    $count = int($count/$speed);
    $count=0;
    $Start = gettimeofday();
}

if ($ARGV[4] =~ 'v') { 
print "$ARGV[3] != $hash ($ret)\n";
}

   if ($ARGV[3] eq $hash){
    print "\n[+] MD5 Cracked! => $ret\n";
    exit(1);
   }
  $RawString[0]++;
 }while($RawString[$CharSet-1]<length($brute));
}

我想知道顶部评论中日期字段的重要性。 MD5 算法于 1992 年首次发布,当然 Perl 5 直到 1994 年才发布。可能是作者的生日?他的联系信息是可用的(虽然我已经从这里发布的翻译代码中删除了它;你必须自己翻译才能获得它)。

对日期的谷歌搜索没有找到任何可能适用的东西,所以我想人们不得不要求作者解开那部分谜团。

关于Perl 奇怪的源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24231075/

相关文章:

regex - XML::Twig - xpath 中的正则表达式因等号 = 失败

perl - 如何使用Perl拍摄网页的屏幕截图?

perl - 如何找出哈希中是否至少有一个键

perl - Perl 中 IO::Pipe 构造函数的参数是什么?

perl - 使 Moose 构造函数忽略 undef 参数

mysql - 数据库中的运动跟踪

algorithm - 在perl中找到下一个更高数字的最佳算法

perl - 如何在Perl中删除哈希值的最后七个字符?

perl - 使用严格/不严格的括号代码部分?

javascript - 如何使用 Javascript 值作为 Perl 变量