($=[$=[]][(__ =!$ $)[_=-~-~-~$] ({} $)[_/_]
($$=($_=!'' $)[_/_] $_[ $]) ])()[__[_/_] __
[_ ~$] $_[_] $$](_/_)
위 단락에 유의하세요. 매우 헷갈리는 코드는 자동으로 래핑되지 않고 3줄(물론 같은 줄에 작성해도 문제가 없습니다)입니다. 페이지를 작성하고 실행해 보면(IE에서는 작동하지 않는다고 합니다.) 이 코드의 기능은
alert(1)
왜 그럴까요? 이 코드를 분해해서 분석해 보겠습니다.
$=[] // $에는 빈 배열이 할당되므로 !$의 값은 false입니다.
__ = !$ $ // 더하기 기호는 !$와 $를 모두 문자열로 변환하므로 __의 값은 "false" 문자열이 됩니다.
_ = -~-~-~$ // 여기에 -($ 1)을 의미하는 ~ 연산자가 있으므로 -~$의 값은 1입니다. of _는 3입니다.
이렇게 추론할 수 있습니다.
(__ = !$ $ )[ _ = -~-~-~$] => ("false")[_] => ("false")[3] => [3 ] = "s"
({} $)[_/_] => ("[객체 개체]")[_/_] => ("[객체 개체]")[1] => ; "[object Object]"[1] = "o"
다음으로 분할합니다 $$=($_=!" $)[_/_] $_[$] :
$_=!" $ // !"에 두 개의 작은따옴표가 있다는 점에 유의하세요. 이는 빈 문자열에 대해 NOT 연산이 수행됨을 의미하므로 $_ 변수에 "true" 문자열이 할당될 수 있습니다. 추론:
$$=($_=!” $)[_/_] $_[ $] => $$ = ( “true”)[1] “true”[0] => "r" "t" = "rt"
그래서 (__=!$ $)[_=-~-~-~$] ({} $)[_/_] ($$=($_= !" $)[_/_] $_[ $])는 "s" "o" "rt", 즉 "정렬"입니다.
그래서 원래 표현은
($=[$=[]][(__=!$ $)[_= -~ -~-~$] ({} $)[_/_]
($$=($_=!'' $)[_/_] $_[ $])])()[ __[ _/_] __
[_ ~$] $_[_] $$](_/_)
는 다음으로 대체 가능:
($=[[]]["sort"])()[__ [_/_] __
[_ ~$] $_[_] $$](_/_)
다음으로 [__[_/_] __[_ ~$] $_ [_] $$](_/_) 뭔데?
이전에 배웠습니다:
__ = “false”
_ = 3
~$ = -1
$_ = “true”
$$ = “rt”
그래서 [__[_/_] __[_ ~$] $_[_] $$](_/_) => ["false"[1] "false"[3-1] "true" [ 3] "rt"](3/3) => ["a" "l" "e" "rt"](1) => ["alert"](1)
그래서 원래 표현식은 공식은 최종적으로 다음으로 대체될 수 있습니다:
($=[[]]["sort"])()["alert"](1)
이 코드는 어떻게 실행됩니까? 단계별로 분석해 보겠습니다.
a = [[]] // 배열 만들기
b = a["sort"] // 배열의 정렬 메서드 가져오기
c = b() / / 배열의 정렬 메서드 sort 메서드를 호출합니다. 여기서 b()는 창 객체를 반환합니다.
d = c["alert"] // window.alert 메서드 가져오기
d(1) // window.alert 호출 방법.
이러한 표현식의 최종 실행 결과는 window.alert(1)입니다.
자세한 내용은 원본 기사와 Reddit 토론을 참조하세요.
원본 댓글의 누군가는 JavaScript 코드를 다양한 이모티콘으로 인코딩할 수 있는 작은 도구를 게시했는데
그런데 위 코드는 그렇지 않습니다. XSS 공격 외에는 효과가 거의 없지만 이 코드를 분석하면 데이터 유형 변환에 대해 배울 수 있고 JavaScript의 유연성도 높이 평가할 수 있습니다.
상세 코드 분석:
(
$ =[$=[]] // $ = []
[
(__= !$ $) // __ = "거짓"
[_=-~-~-~$ ] // _ = 3
// (__)[3] = "s"
({} $) // ({} $) = [객체 객체]
[_/ _] / / _/_ = 1
// ([객체 객체])[1] = "o"
($$ = //
($_=!'' $) // !'' $ = "참" ; $_ = "참"
[_/_] // _/_ = 1
// $_[1] = "r"
$_ [ $] // $ = 0; $_[0] = "t"
) // $$= "rt"
] // ["정렬"]
// [ ][" sort"] = [].sort = function sort() { [네이티브 코드] }
// $ = []["sort"]
)() // ($)() = [객체 창 ]
[
__[_/_] // __ = "false"
// __[1] = "a"
__ [_ ~$] //_ = 3; ~$ = -1; _ ~$ = 2
// __[2] = "l"
$_[_] // $_ = "참" ; _ = 3 ;
// $_[3] = "e"
$$ // $$ = "rt"
](_/_) // _ / _ = 1
// 창["alert"](1)
몇 가지 주의할 점:
1. JavaScript에서는 $와 _를 변수 이름으로 사용할 수 있습니다
2. 함수는 다음과 같이 호출할 수도 있습니다. 1,9,1] .sort()는 [1,2,4,1,9,1]["sort"]()로 작성할 수 있습니다.
3 ~ 숫자의 비트 단위 반전
4. 자바스크립트의 다양한 유형 변수 사용 규칙
5. 일부 기본 코드에 대해 작성된 마지막 메소드는 실행 시
var s = [].sort; 창문이야