JSF**kとは
JSF**kとはJSFuckのことであり、Javascriptで以下の文字だけでプログラミングするJavascriptの縛りプレイのようなものです。
![]+()
JSF**kの基本
数の生成
まず、空の配列をNOTするとfalseになります。
![] //falseになる
そして、boolean同士を足すと数字になります。このときtrueは1、falseは0として演算されます。
!![]+!![] //2になる
あと、最初に+でもいけます。
+!![] //1になる
文字の生成
文字列を生成するには、以下の性質が必要です。
true + [] //"true"になる
false + []//"false"になる
そう、なんらかのオブジェクトに配列を足すと文字列になるのです。
コードの実行
コード実行のカラクリ
これである程度コードは作れますがこれでは何もできません。
が、なんとこのようにして文字列をJavascriptコードとして実行できます。
[]["at"]["constructor"]("任意のJSコード")()
"at"
と"constructor"
を作ろう
しかし、"at"
と"constructor"
のs,t,r,uはtrueとfalseから生成できますがc,o,nはありません。どうしたものか。
なんと、最初の文字生成は関数にも使えます。[]["at"]
は関数なので、このようにしましょう。
[][(![]+[])[+!![]]+(!![]+[])[+![]]]+[]
//"function at() { [native code] }"になる
これでconstructorは作れます!
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+ //c
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+ //o
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+ //n
(![]+[])[!![]+!![]+!![]]+ //s
(!![]+[])[+![]]+ //t
(!![]+[])[+!![]]+ //r
(!![]+[])[!![]+!![]]+ //u
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+ //c
(!![]+[])[+![]]+ //t
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+ //o
(!![]+[])[+!![]] //r
では[]["at"]["constructor"]
を書いてみましょう!
[][(![]+[])[+!![]]+(!![]+[])[+![]]][([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+(!![]+[])[!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+!![]]]
ではalert()でも実行しますか。
[][(![]+[])[+!![]]+(!![]+[])[+![]]][([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+(!![]+[])[!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+!![]]] //[]["at"]["constructor"]
(
(![]+[])[+!![]]+ //a
(![]+[])[!![]+!![]]+ //l
(![]+[])[!![]+!![]+!![]+!![]]+ //e
(!![]+[])[+!![]]+ //r
(!![]+[])[+![]]+ //t
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[+((+!![]+[])+(+!![]))]+ //(
([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[+((+!![]+[])+(!![]+!![]))] //)
)()
ではコメントを消して一行に
[][(![]+[])[+!![]]+(!![]+[])[+![]]][([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+(!![]+[])[+!![]]+(!![]+[])[!![]+!![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]]+(!![]+[])[+![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[!![]+!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+!![]]]((![]+[])[+!![]]+(![]+[])[!![]+!![]]+(![]+[])[!![]+!![]+!![]+!![]]+(!![]+[])[+!![]]+(!![]+[])[+![]]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[+((+!![]+[])+(+!![]))]+([][(![]+[])[+!![]]+(!![]+[])[+![]]]+[])[+((+!![]+[])+(!![]+!![]))])()
終わりに
JSF**は、文字列をJSとして実行する関数にJSの文字列を渡すことで動かすことができるのである。