Javascriptのコードはたった6文字あれば書ける。
1 2 |
+![]() |
某Brainf*ckを彷彿とさせられますがこの6文字はちゃんとJavascriptの実行環境で動きます。任意のJavascriptのコードをこの6文字に変換してくれるサイトがこちら。
どうやって動いているのか簡単な例を見てみます。
1 2 3 4 5 |
$node >![] false |
Javascriptは弱い動的型付き言語ですのでちぐはぐな式が与えられるとそれを評価できる型に積極的に変換しようとします。この場合は!によって空の配列[]がBoolean型のtrueに変換され!が作用してfalseを返しています。[]がtrueに変換されることは例えば以下の式で確認できます。
1 2 3 |
>if([]) console.log("true"); true |
次に
1 2 3 |
>+[] 0 |
これも+によって[]が数値に変換された結果0を返しています。
1 2 3 |
>+!![] 1 |
今度は[]を!を使ってtrueに変換してから+を使って数値の1を返しています。1ができたのでこの先の数字は+を使って足していけば作ることができますね
1 2 3 4 5 |
>+!![]+!![] 2 >+!![]+!![]+!![] 3 |
次に
1 2 3 |
>[][[]] undefined |
これは存在しない配列の要素にアクセスしようとしているのでundefinedが返されます。
1 2 3 |
>[]+[][[]] 'undefined' |
[]とundefinedに+を作用させることで文字列として評価させ’undefined’という文字列を作っています。これを使えば
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
> ([]+[][[]])[+[]] 'u' > ([]+[][[]])[+!![]] 'n' > ([]+[][[]])[+!![]+!![]] 'd' > ([]+[][[]])[+!![]+!![]+!![]] 'e' > ([]+[][[]])[+!![]+!![]+!![]+!![]] 'f' > ([]+[][[]])[+!![]+!![]+!![]+!![]+!![]] 'i' > ([]+[][[]])[+!![]+!![]+!![]+!![]+!![]+!![]] 'n' > ([]+[][[]])[+!![]+!![]+!![]+!![]+!![]+!![]+!![]] 'e' > ([]+[][[]])[+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]] 'd' |
のように文字を取り出すことができます!
このようにして文字と数字を生成していき最後はeval関数(これも6文字で書ける)によって実行するという方針でJSF*ckは任意のJavascriptコードをたった6文字の組み合わせで表現することができています。
その他の文字や型・関数などの作成方法はここにまとめられています。
JS奥が深い…
ひろせ