【问题标题】:How can I de-obfuscate or decode this Perl code?如何去混淆或解码这个 Perl 代码?
【发布时间】:2015-05-18 17:41:16
【问题描述】:

我找到了这段代码,我认为它是经过编码的。我试图了解它是如何编码的或如何读取它。有没有人有办法解码这段代码?

#!/usr/bin/perl

eval unpack u=>q{_<')I;G0@(EQN7&5<>#5"7'@S,UQX,S-<>#9$7'@U-UQX-C%<>#<R7'@V15QX-CE<>#9%7'@V-UQX,C!<>#4Y_7'@V1EQX-S5<>#(P7'@T1%QX-C%<>#<Y7'@R,%QX-$5<>#8U7'@V-5QX-C1<>#(P7'@U-%QX-D9<>#(P7'@T_.5QX-D5<>#<S7'@W-%QX-C%<>#9#7'@V0UQX,C!<>#<S7'@V1EQX-D1<>#8U7'@P05QX,C!<>#(P7'@R,%QX_,C!<>#(P7'@R,%QX,C!<>#(P7'@R,%QX-$1<>#9&7'@V-%QX-S5<>#9#7'@V-5QX-S-<>#!!7'@R,%QX,C!<_>#(P7'@R,%QX,C!<>#(P7'@R,%QX,C!<>#(P7'@T.%QX-C5<>#<R7'@V-5QX,C!<>#8Y7'@W,UQX,C!<>#0Q_7'@V15QX,C!<>#0U7'@W.%QX-C%<>#9$7'@W,%QX-D-<>#8U7'@S05QX,$%<>#(P7'@R,%QX,C!<>#(P7'@R_,%QX,C!<>#(P7'@R,%QX,C!<>#8S7'@W,%QX-C%<>#9%7'@R,%QX-$5<>#8U7'@W-%QX,T%<>#-!7'@T.5QX_-3!<>#!!7'@R,%QX,C!<>#(P7'@R,%QX,C!<>#(P7'@R,%QX,C!<>#(P7'@V,UQX-S!<>#8Q7'@V15QX,C!<_>#1#7'@U-UQX-3!<>#-!7'@S05QX-35<>#<S7'@V-5QX-S)<>#0Q7'@V-UQX-C5<>#9%7'@W-%QX,$%<>#(P_7'@R,%QX,C!<>#(P7'@R,%QX,C!<>#(P7'@R,%QX,C!<>#8S7'@W,%QX-C%<>#9%7'@R,%QX-35<>#4R7'@T_.5QX,T%<>#-!7'@U-%QX-CE<>#<T7'@V0UQX-C5<>#!!7'@R,%QX,C!<>#(P7'@R,%QX,C!<>#(P7'@R,%QX_,C!<>#(P7'@U-%QX-CA<>#8Q7'@V15QX-D)<>#(P7'@W.5QX-D9<>#<U7'@R,%QX-#9<>#9&7'@W,EQX,C!<_>#4U7'@W,UQX-CE<>#9%7'@V-UQX,C!<>#1$7'@W.5QX,C!<>#4S7'@V,UQX-S)<>#8Y7'@W,%QX-S1<>#!!_7'@R,%QX,C!<>#(P7'@R,%QX,C!<>#(P7'@R,%QX,C!<>#(P7'@V.5QX-D5<>#9!7'@S,UQX-C-<>#<T7'@V_1EQX-S)<>#,S7&5<>#5",%QX-D1<;B(["B-S;&5E<"@B,2(I.PIU<V4@3F5T.CI)4#L*=7-E(%1E<FTZ.D%._4TE#;VQO<CL*=7-E($Q74#HZ57-E<D%G96YT.PIU<V4@55)).CI4:71L92!Q=R@@=&ET;&4@*3L*=7-E('9A_<G,@<7<H("104D]'("D["FUY($!I<%]T96%M("`]("@I.PIM>2`D4%)/1R`]("0P.PHC57-A9V4*(VEF("@@_0$%21U8@/3T@,"`I('L*(R`@("`@("`@<')I;G0@(EQE6S0U;55S86=E.B`N+R104D]'(%MF:6QE72!;5$A2_14%$4UT@6U1)345/551=(%M/5510551=7&Y%>&%M<&QE('!E<FP@)#`@.3`N,"XR,RXU-"`Y,2XP+C4P+C`@_,3(P,"`Q(&QO;%QN:6YJ,V-T;W(S7&XB.PH@(R`@(&5X:70["B-]"FUY("1I<',@/2`D05)'5ELP73L*;W!E_;B!M>2`D:&%N9&QE+"`B7'@S0R(L("1I<',["F-H;VUP*"!M>2!`;&]A9&QI<W0@/2`\)&AA;F1L93X@*3LC_/#T]/3T]/3T]/3T]/3T]($]014X@55`@25!3"F-L;W-E("1H86YD;&4["@IM>2`D=&AR96%D<R`@/2`D05)'_5ELQ73L*(VUY("1I<"`@(#T@;F5W($YE=#HZ25`@*"(D05)'5ELP72`M("1!4D=66S%=(BD@;W(@9&EE("))_;G9A:6QD($E0(%)A;F=E+B(N($YE=#HZ25`Z.D5R<F]R*"D@+B)<;B(["@IP<FEN="`B7&5<>#5"7'@S,UQX_,S%<>#9$7'@U,UQX-S1<>#8Q7'@W,EQX-S1<>#8Y7'@V15QX-C=<>#(P7'@W-UQX-CE<>#<T7'@V.%QX,C`D_=&AR96%D<UQX,C!<>#<T7'@V.%QX-S)<>#8U7'@V,5QX-C1<>#<S7&Y<>#5"7'@R,5QX-41<>#4S7'@V,UQX_-C%<>#9%7'@V15QX-CE<>#9%7'@V-UQX,C`D05)'5ELP75QX,C!<95QX-4(P7'@V1%QN(CL*9F]R96%C:"!M_>2`D:7`@*$!L;V%D;&ES="D@>PIP<FEN="`B)&EP7&XB.PIP=7-H($!I<%]T96%M+"`D:7`K*R`M/FEP*"D[_"FEF("@@)'1H<F5A9',@/3T@0&EP7W1E86T@*2![(%-C86XH0&EP7W1E86TI.R!`:7!?=&5A;2`]("@I('T*_?0I38V%N*$!I<%]T96%M*3L*"@IS=6(@4V-A;@I["FUY($!0:61S.PH@("`@("`@(&9O<F5A8V@@;7D@)&AO_<W0@*$!?*0H@("`@("`@('L*("`@("`@("!M>2`D<&ED("`@("`@("`](&9O<FLH*3L*("`@("`@("!D:64@_(EQX-#-<>#9&7'@W-5QX-D-<>#8T7'@R,%QX-D5<>#9&7'@W-%QX,C!<>#8V7'@V1EQX-S)<>#9"7'@R,5QX_,C`D(5QN(B!U;FQE<W,@9&5F:6YE9"`D<&ED.PH*("`@("`@("`@("`@("`@(&EF("`H,"`]/2`D<&ED*0H@_("`@("`@("`@("`@("`@>PH@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@('!R:6YT("(D:&]S=%QN_(CL*("`@("`@("`@("`@("`@(&5X:70*("`@("`@("`@("`@("`@('T*("`@("`@("`@("`@("`@(&5L<V4*_("`@("`@("`@("`@("`@('L*("`@("`@("`@("`@("`@('!U<V@@0%!I9',L("1P:60*("`@("`@("`@("`@_("`@('T*("`@("`@("!]"@IF;W)E86-H(&UY("1P:60@*$!0:61S*2![('=A:71P:60H)'!I9"P@,"D@?0I]}

【问题讨论】:

  • 仅供参考,当你看到这种事情时,你应该非常怀疑;它通常用于伪装恶意软件。在这种特定情况下,它看起来一目了然,但仍然要非常小心这种代码。
  • 是的,我应该,因为我想解码代码看看他做了什么
  • 我在Mastering Perl 中有几个关于此的示例,因此我可以演示这种代码隐藏对于真正想了解发生了什么的人来说实际上只是一个障碍。
  • @briandfoy 示例使用Cleaning up Perl with B::Deparse and friends 吗?
  • 我的一些例子确实如此,但我的这类例子使用 print 而不是 eval。

标签: perl eval


【解决方案1】:

正如另一张海报所指出的 - 提取此功能的第一步是通过 print 而不是 eval 获取一些源代码:

第二阶段是通过-MO=Deparse 运行它,看看是否发生了任何奇怪的事情。 (然后perltidy 使其更易于阅读):

#!usr/bin/local/perl
print
    "\n\e[33mWarning You May Need To Install some\n         Modules\n         Here is An Example:\n         cpan Net::IP\n         cpan LWP::UserAgent\n         cpan URI::Title\n         Thank you For Using My Script\n         inj3ctor3\e[0m\n";
use Term::ANSIColor;
use LWP::UserAgent;
use vars ('$PROG');
my (@ip_team) = ();
my $PROG      = $0;
my $ips       = $ARGV[0];
open my $handle, '<', $ips;
chomp( my (@loadlist) = <$handle> );
close $handle;
my $threads = $ARGV[1];
print "\e[31mStarting with $threads threads\n[!]Scanning $ARGV[0] \e[0m\n";

foreach my $ip (@loadlist) {
    print "$ip\n";
    push @ip_team, ( $ip++ )->ip;
    if ( $threads == @ip_team ) {
        Scan(@ip_team);
        @ip_team = ();
    }
}
Scan(@ip_team);

sub Scan {
    my @Pids;
    foreach my $host (@_) {
        my $pid = fork;
        die "Could not fork! $!\n" unless defined $pid;
        if ( 0 == $pid ) {
            print "$host\n";
            exit;
        }
        else {
            push @Pids, $pid;
        }
    }
    foreach my $pid (@Pids) {
        waitpid $pid, 0;
    }
}

有用的是,最上面的部分包含了作者的签名。真的很好,因为我完全想重复使用这种非常有用的东西。

[33mWarning You May Need To Install some
         Modules
         Here is An Example:
         cpan Net::IP
         cpan LWP::UserAgent
         cpan URI::Title
         Thank you For Using My Script
         inj3ctor3[0m

所以看起来它的作用是:

  • 打开指定为 $ARGV[0] 的文件;
  • 将其读入(一次一行)到 IP 地址列表中。
  • 将其分批成由$ARGV[1] 限制的块。
  • 使用Net::IP 格式化地址

IP 以字符串形式返回四元格式的 IP 地址(或前缀或范围的第一个 IP)。 打印 ($ip->ip());

  • 将块发送到 Scan 其中:
  • 只是分叉并打印 IP 地址,而不做任何实际扫描它的操作。

所以...除非我遗漏了一些深刻的东西,否则这个脚本实际上并没有做任何事情。它只是打印一个 IP 地址列表,如果分叉的数量设置得非常高,也许可以用于分叉炸弹。

但是正如您所看到的 - perl 的优点之一(有些人可能称其为缺点)是很难混淆它,因为它是一种解释性语言。

【讨论】:

    【解决方案2】:

    将eval替换为print,你可以看到这里发生了什么:

    print "\n\e\x5B\x33\x33\x6D\x57\x61\x72\x6E\x69\x6E\x67\x20\x59\x6F\x75\x20\x4D\x61\x79\x20\x4E\x65\x65\x64\x20\x54\x6F\x20\x49\x6E\x73\x74\x61\x6C\x6C\x20\x73\x6F\x6D\x65\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x4D\x6F\x64\x75\x6C\x65\x73\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x48\x65\x72\x65\x20\x69\x73\x20\x41\x6E\x20\x45\x78\x61\x6D\x70\x6C\x65\x3A\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x63\x70\x61\x6E\x20\x4E\x65\x74\x3A\x3A\x49\x50\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x63\x70\x61\x6E\x20\x4C\x57\x50\x3A\x3A\x55\x73\x65\x72\x41\x67\x65\x6E\x74\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x63\x70\x61\x6E\x20\x55\x52\x49\x3A\x3A\x54\x69\x74\x6C\x65\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x54\x68\x61\x6E\x6B\x20\x79\x6F\x75\x20\x46\x6F\x72\x20\x55\x73\x69\x6E\x67\x20\x4D\x79\x20\x53\x63\x72\x69\x70\x74\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6E\x6A\x33\x63\x74\x6F\x72\x33\e\x5B0\x6D\n";
    #sleep("1");
    use Net::IP;
    use Term::ANSIColor;
    use LWP::UserAgent;
    use URI::Title qw( title );
    use vars qw( $PROG );
    my @ip_team  = ();
    my $PROG = $0;
    #Usage
    #if ( @ARGV == 0 ) {
    #        print "\e[45mUsage: ./$PROG [file] [THREADS] [TIMEOUT] [OUTPUT]\nExample perl $0 90.0.23.54 91.0.50.0 1200 1 lol\ninj3ctor3\n";
     #   exit;
    #}
    my $ips = $ARGV[0];
    open my $handle, "\x3C", $ips;
    chomp( my @loadlist = <$handle> );#<============== OPEN UP IPS
    close $handle;
    
    my $threads  = $ARGV[1];
    #my $ip   = new Net::IP ("$ARGV[0] - $ARGV[1]") or die "Invaild IP Range.". Net::IP::Error() ."\n";
    
    print "\e\x5B\x33\x31\x6D\x53\x74\x61\x72\x74\x69\x6E\x67\x20\x77\x69\x74\x68\x20$threads\x20\x74\x68\x72\x65\x61\x64\x73\n\x5B\x21\x5D\x53\x63\x61\x6E\x6E\x69\x6E\x67\x20$ARGV[0]\x20\e\x5B0\x6D\n";
    foreach my $ip (@loadlist) {
    print "$ip\n";
    push @ip_team, $ip++ ->ip();
    if ( $threads == @ip_team ) { Scan(@ip_team); @ip_team = () }
    }
    Scan(@ip_team);
    
    
    sub Scan
    {
    my @Pids;
            foreach my $host (@_)
            {
            my $pid        = fork();
            die "\x43\x6F\x75\x6C\x64\x20\x6E\x6F\x74\x20\x66\x6F\x72\x6B\x21\x20$!\n" unless defined $pid;
    
                    if  (0 == $pid)
                    {
                                    print "$host\n";
                    exit
                    }
                    else
                    {
                    push @Pids, $pid
                    }
            }
    
    foreach my $pid (@Pids) { waitpid($pid, 0) }
    }
    

    另请参阅:http://perldoc.perl.org/perlpacktut.html#Uuencoding

    Uuencoding

    模板字母表中的另一个奇怪的人是 u ,它包含一个“uuencoded 字符串”。(“uu”是 Unix-to-Unix 的缩写。)您可能永远不需要 这种编码技术的发明是为了克服 不支持简单 ASCII 以外的老式传输介质 数据。基本方法很简单:取三个字节,或 24 位。拆分它们 分成 4 个六包,每包添加一个空格 (0x20)。重复直到所有数据 是混合的。将 4 个字节的组折叠成不超过 60 行并装饰 它们在前面加上原始字节数(增加 0x20)和一个“\n” 结束。 - 打包厨师会为你准备这个,一分钟,当你 在菜单上选择包装代码 u:

    my $uubuf = pack( 'u', $bindat );
    

    在 u 之后的重复计数设置要放入 uuencoded 行的字节数, 默认情况下最大为 45,但可以设置为一些(更小) 三的整数倍。 unpack 只是忽略重复计数。

    【讨论】:

    • 我喜欢 packed 代码的格式 cmets 和缩进!
    猜你喜欢
    • 2012-03-10
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2014-05-09
    相关资源
    最近更新 更多