Japhs 부검 (2)

14904 단어 japhperlobfuscation

Con de MIME



이것은 프랑스 농담입니다 😃



이 Japh는 Reynold Scem 출신입니다.

use MIME::Base64;(eval decode_base64('am9pbignJywobWFwe2NocigpfShncmVwL1xTLyxzcGxpdCgvKC4uLikvLCcwNzQxMTcxMTUxMTYwMzIwOTcxMTAxMTExMTYxMDQxMDExMTQwMzIwODAxMDExMTQxMDgwMzIxMDQwOTcwOTkxMDcxMDExMTQwNDQnKSkpKQ=='))=~/.*/;print$&


이건... 이 인코딩된 문자열을 평가할 때 무슨 일이 일어날지 짐작할 수 없습니다...

실제로 2단계를 사용하여 첫 번째 base64 인코딩인 Japh를 생성하며 base64 -d로 확인할 수 있습니다.

echo "am9pbignJywobWFwe2NocigpfShncmVwL1xTLyxzcGxpdCgvKC4uLikvLCcwNzQxMTcxMTUxMTYwMzIwOTcxMTAxMTExMTYxMDQxMDExMTQwMzIwODAxMDExMTQxMDgwMzIxMDQwOTcwOTkxMDcxMDExMTQwNDQnKSkpKQ==" | base64 -d
join('',(map{chr()}(grep/\S/,split(/(...)/,'074117115116032097110111116104101114032080101114108032104097099107101114044'))))


디코딩에서 평가할 실제 Perl 코드를 얻었고 이제 기분이 조금 나아졌습니다 😁

코드 Japh 문자열 생성 코드는 다음과 같습니다.

my $str = eval { join('', ( map {chr()} ( grep/\S/, split(/(...)/, '074117115116032097110111116104101114032080101114108032104097099107101114044')))) };


그런 다음 펄 코드에는 map , chr (값을 문자로 변환), grep \S (공백이 아닌 모든 항목과 일치), split(/(...)/, (3 문자당 분할)가 있습니다.

좋은 쇼케이스입니다 😃 많은 것들이 실제로 쓸모없고 Perl 코드를 난독화하기 위해서만 존재하더라도 말입니다.

Japh 생성은 간단히 다음과 같이 줄일 수 있습니다.

my $str = join('', map {chr()} ( split(/(...)/, '074117115116032097110111116104101114032080101114108032104097099107101114044')));

join는 쓸모 없어 보이지만 문자열 컨텍스트를 강제합니다.

그래서 여기 전체 Japh가 펼쳐져 있습니다.

use MIME::Base64;

# Base 64 encoding
# am9pbignJywobWFwe2NocigpfShncmVwL1xTLyxzcGxpdCgvKC4uLikvLCcwNzQxMTcxMTUxMTYwMzIwOTcxMTAxMTExMTYxMDQxMDExMTQwMzIwODAxMDExMTQxMDgwMzIxMDQwOTcwOTkxMDcxMDExMTQwNDQnKSkpKQ==
# join('',(map{chr()}(grep/\S/,split(/(...)/,'074117115116032097110111116104101114032080101114108032104097099107101114044'))))

my $str = eval { join('', ( map {chr()} ( grep/\S/, split(/(...)/, '074117115116032097110111116104101114032080101114108032104097099107101114044')))) };
# Take 3 chars (...), do not keep space (\S), tranform to corresponding string representation, concat without space, eval (useless)

$str =~ /.*/; # Match everything
print $&; # The string matched by the last successful pattern match


정규식 일치 및 캡처된 일치 인쇄에도 약간의 재미가 있음을 알아차렸을 것입니다. 그것은 단지 재미를 위한 것입니다! 😃

오픈 포맷 쓰기




open(P,"|perl");print P"format=\nJust another Perl hacker,\n.\nwrite"


주문을 하고 나면 이런 모양이 됩니다.

open(P,"|perl"); 
print P "
format=
Just another Perl hacker,
.
write"


여기에는 2가지 트릭이 있습니다.
  • 다른 perl 프로세스에 대한 열린 파일 핸들
  • "형식", 요즘 점점 덜 사용되는 오래된 Perl 함수

  • 실제로 다음과 동일합니다.

    format=
    Just another Perl hacker,
    .
    write
    


    키스



    내부에 약간의 키스가 있는 단순하지만 흥미로운 japh가 있습니다! 😘 😘 😘 😘

    @_=("Just another Perl hacker," =~ /(.*) (.*) (.*) (.*)/);print"@_";
    




    이 japh는 기본 변수@_ 및 일치를 보여줍니다.

    다음과 같이 다시 작성할 수 있다고 생각합니다.

    my $str = "Just another Perl hacker,";
    my @a = $str =~ /(.*) (.*) (.*) (.*)/;
    print join(" ", @a) . "\n";
    


    Perl 개발자는 이 양식이 편해야 합니다 😄

    아마도 정규식 탐욕을 해결할 때입니다.

    이러한 종류의 탐욕스러운.* 일치는 가능한 한 많이 일치시키려고 하기 때문에 "위험"합니다(원하는 것에 따라 다름).

    예를 들어 욕심 많은 버전의 "Just another Perl 7 hacker,"는 다음과 같이 문자열 분할을 생성합니다.
    Just another Perl 7 hacker, (.*가 공간도 즐겁게 먹기 때문에)

    x25


    printf , x 및 ASCII 변환을 사용하여 간단한 japh를 살펴보겠습니다.

    printf "%c"x 25,74,117,115,116,32,97,110,111,116,104,101,114,32,80,101,114,108,32,104,97,99,107,101,114,44;
    


    연산자x는 마법입니다.

    printf "perl " x 10
    


    생산 예정:

    perl perl perl perl perl perl perl perl perl perl 
    


    japh에서 x 25"%c"에 적용되므로 다음과 같이 번역할 수 있습니다.

    printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",74,117,115,116,32,97,110,111,116,104,101,114,32,80,101,114,108,32,104,97,99,107,101,114,44);
    


    여기 화살표



    다시 printf "%c"이지만 이번에는 입력이 16진수이고 전체가 문자열 할당에 저장됩니다.

    $_ = <<'-- '; s/../printf "%c",hex($&)/ge;
    4a75737420616e6f74686572205065726c206861636b65722c
    -- 
    

    --로 구분되는 "here-doc"으로 시작합니다(DevTo로 표시되지 않는 대시 + 대시 + 공백).

    이상한 점은 모든 것이 문자열 할당처럼 보인다는 것입니다...

    실제로 정규식 내부의 printf는 stdout으로 인쇄됩니다. 마지막에 $_에는 문자열이 포함되어 있지 않지만 sprintf가 작업을 완료했을 것입니다.

    그리고 정확히 s/../printf "%c",hex($&)/ge는 무엇입니까?
  • s///는 대체용입니다.
  • $&matched이었습니다.
  • /e 수정자를 사용하면 대체의 오른쪽 부분이 실제로 일반 Perl 코드로 실행될 수 있습니다.
  • /g 한정자는 "루핑 한정자"또는 "전역 한정자"이며 문자열 !

  • 마지막으로 japh를 다음과 같이 다시 작성할 것을 제안합니다.

    my $str = "4a75737420616e6f74686572205065726c206861636b65722c";
    while($str =~ /../g) { # Or $str =~ s/..//
           printf("%c", hex($&));
    }
    


    크리스탈처럼 투명하죠?

    좋은 웹페이지 즐겨찾기