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가지 트릭이 있습니다.
실제로 다음과 동일합니다.
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($&));
}
크리스탈처럼 투명하죠?
Reference
이 문제에 관하여(Japhs 부검 (2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/thibaultduponchelle/japhs-autopsies-2-41jl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)