자바 스크립트 (67 66 62 줄 227 269 바이트)
(참고 : Firefox 36 및 Safari 8에서만 테스트되었으며, 사소한 ES6 기능 ( Set
클래스)이 포함되어 있습니다 )
Z
=
!""+
(0[[]]
+
(
!!""+Set
));c
=Z[~
-22]
$=Z[
3]
$$=Z[
15]
$$$=Z[
24]
$$$$=Z[
1]
$$$$$=Z[
0]
Set
[c
+
$$$+Z[
5]
+Z[
16]
+
$$$$$+
$$$$+Z[
2]
+c
+
$$$$$+
$$$+
$$$$]
(Z[
14]
+
$$+
$+
$$$$+
$$$$$+
"(\
'H\
"+
$+
$$+
$$+
$$$+
",\
W\
"+
$$$+
$$$$+
$$+Z[
6]
+
"\
!')\
")
()
위의 코드는 기본적으로 다음과 같습니다.
alert("Hello, World!")
분명히 alert
분류되지 않았습니다. 대신 문장을 문자열로 생성하고 "평가"해야합니다.
s = "alert('Hello, World!')"; // generate this using sorted code
eval(s)
문자열을 생성하는 방법? ES5는 줄 연속을 지원하므로
"AL\
ERT" === "ALERT"
그러나 문자 코드 \
는 모든 소문자 앞에 나타나 므로 다른 방법을 사용하여 소문자를 생성해야합니다.
여기서 JSFuck에 대한 아이디어를 빌립니다 . 경고문과 관련된 소문자는 다음과 같습니다.
t e r a o l d
이들 모두는 표준 객체의 문자에서 추출 할 수 있으며 정렬 된 순서로 표현 될 수 있습니다.
t, e, r ← true = !""
a, l ← false = !!""
o ← function = Set
d ← undefined = 0[[]]
우리는 어떻게 문자열을 평가합니까? 반드시 eval(s)
분류 되지 않았으므로 사용할 수 없습니다 . 또는을 사용할 수 Function(s)()
있지만 Function
정렬 되지 않았으므로 사용할 수 없습니다 . 그러나 Function
모든 함수의 생성자이므로 의미 Set.constructor === Function
합니다.
식별자 constructor
를 추가하면 소문자 목록이됩니다.
t e r a o l d c u n s
다행히도 다음과 같이 생성 할 수 있습니다 "truefalseundefinedfunction"
.
t, e, r, u ← true = !""
a, l, s ← false = !!""
o, c, n ← function = Set
d ← undefined = 0[[]]
확인 후 위의 코드는 다음과 같아야합니다.
// lines 1~8 defines our string containing all lowercase letters we want
Z = true + (undefined + (false + Set))
// Z = "trueundefinedfalsefunction Set() { [native code] }"
// lines 8~20 defines the variables `c`, `$` (e), `$$` (l), `$$$` (o),
// `$$$$` (r), `$$$$$` (t)
// for the corresponding lowercase letters extracted from `Z`
// the rest calls:
Set["constructor"]("alert('Hello, World')")()
// lines 22~36 generates the "constructor" string
// lines 37~61 generates the "alert('Hello, World')" string
업데이트 : 이름 변경은 E
, L
, O
, R
, T
다양한 반복에 $
4 개 라인을 줄일 수 있습니다.