Javascriptは、クレイジーでありながら有効なコードを作成できる、奇妙で素晴らしい言語です。 彼は、私たちがどのように作業するかに応じて、ある作品を別の作品に変換することで私たちを助けようとします。
何かに行を追加すると、テキストを取得するものと見なされるため、すべてが行に変換されます。
接頭辞「プラス」または「マイナス」を追加すると、彼は数値表現が必要であると想定し、可能であれば文字列を数値に変換します。
何かを拒否すると、彼はそれをブール値に変換します。
言語のこれらの機能を使用して、6文字のみで小さな魔法を作成できます: [
、 ]
、 (
、 )
!
および+
これをデスクトップで読むと、ブラウザでコンソール(開発者ツールなど)を開いてコードを実行できます。 以下の例のコードをコンソールにコピーするだけで、実行されてtrueが返されます。
簡単に始めましょう。 主なルールは次のとおりです。
- プレフィックス
!
ブール値に変換します - プレフィックス
+
数値に変換 -
[]
追加すると文字列が変換されます
ここでそれらは動作しています:
![] === false +[] === 0 []+[] === ""
留意すべきもう1つの重要な点は、角括弧を使用すると、次のような文字列から特定の文字(文字)を取得できることです。
"hello"[0] === "h"
また、いくつかの数字を取得し、それらを文字列表現に追加してから、数値に戻すことができることも覚えておいてください。
+("1" + "1") === 11
OK、これらのトリックを組み合わせて、文字a
を取得してみましょう。
![] === false ![]+[] === "false" +!![] === 1 ------------------------ (![]+[])[+!![]] === "a" // same as "false"[1]
かっこいい!
このかなり単純な組み合わせを使用すると、単語true
およびfalse
からすべての文字を取得できfalse
。 a
、 e
、 f
、 l
、 r
、 s
、 t
、 u
さて、どこからでも手紙をもらえますか?
さて、 undefined
、これは[][[]]
ような奇妙なナンセンスを使用して取得できます。 メインルールの1つを使用して文字列に変換し、追加の文字d
、 i
、およびn
を取得します。
[][[]] + [] === "undefined"
まだ持っている文字を使用して、単語fill
、 filter
、 find
書くことができfind
。 もちろん、他の単語もありますが、これら3つの単語は配列メソッド(Array)であるため、私たちにとって興味深いものです。 つまり、これらはArray
オブジェクトの一部であり、配列インスタンスで直接呼び出すことができます。 たとえば、 [2,1].sort()
。
Javascriptの重要な機能:オブジェクトのプロパティには、 ドット表記または角括弧(角括弧表記)を使用してアクセスできます。 配列メソッドはArrayオブジェクト自体のプロパティであるため、ピリオドの代わりに角括弧を使用してこれらのメソッドを呼び出すことができます。
つまり、 [2,1]["sort"]()
は[2,1].sort()
と同じです。
使用可能な文字を使用して配列メソッドのいずれかを使用するとどうなるかを見てみましょうが、呼び出しません。
[]["fill"]
これにより、 function fill() { [native code] }
ます。 このメソッドヘッダーは、既知のルールによって文字列に変換できます。
[]["fill"]+[] === "function fill() { [native code] }"
現在、追加の文字があります: c
、 o
、 v
、 (
、 )
、 {
、 [
、 ]
、 }
、
。
文字c
とo
を使用して、 constructor
を作成できます。 constructor
は、すべてのJavascriptオブジェクトで使用可能なメソッドであり、コンストラクター関数を返すだけです。
今利用できるすべてのオブジェクトのコンストラクター関数の文字列表現を取得しましょう:
true["constructor"] + [] === "function Boolean() { [native code] }" 0["constructor"] + [] === "function Number() { [native code] }" ""["constructor"] + [] === "function String() { [native code] }" []["constructor"] + [] === "function Array() { [native code] }"
ここから、兵器庫の新しい文字B
、 N
、 S
、 A
、 m
、 g
、 y
を取得します。
これで、 "toString"
という単語を収集できます。 これは、角括弧で呼び出すことができる関数です。 はい、今回は実際に彼女に電話します。
(10)["toString"]() === "10"
しかし、基本的なルールのいずれかを使用して、すでに何かを文字列に変換できます。 用途は何ですか?
それでは、 Number
型のtoString
メソッドにradix
という秘密の引数があり、文字列に変換する前に返された数値のradix
を変更するとします。 参照:
(12)["toString"](10) === "12" // 10 (12)["toString"](2) === "1100" // 2, (12)["toString"](8) === "14" // 8, (12)["toString"](16) === "c" // 12
しかし、なぜ16で停止しますか? 最大値は36です。これには、 0
の数字とa〜zの文字がすべて含まれます。 これで、任意のキャラクターを取得できます:
(10)["toString"](36) === "a" (35)["toString"](36) === "z"
かっこいい! しかし、句読点や大文字などの他の文字はどうすればよいでしょうか? ウサギの穴にさらに深く潜る!
Javascriptを実行する場所に応じて、事前定義されたオブジェクトやデータにアクセスできる場合とできない場合があります。 ブラウザで作業している場合、HTMLラッピングメソッドにアクセスする可能性が高いでしょう。
たとえば、 bold
はbold
タグを追加する文字列メソッドです。
"test"["bold"]() === "<b>test</b>"
ここから、 <
、 >
および/
取得できます。
おそらくescape
機能について聞いたことがあるでしょう。 大まかに言って、単純なブラウザが解釈できるように、文字列をURI形式に変換します。 スペースを渡すと、 %20
ます。 <
を渡すと、 %3C
得られます。 残りのすべての欠落文字を取得する場合、この大文字のC
非常に重要です。
この文字を使用して、 fromCharCode
を記述できます。 この関数は、指定された10進数に基づいてUnicode文字を返します。 これはStringオブジェクトの一部であり、以前に行ったように、コンストラクターを呼び出すことで取得できます。
""["constructor"]["fromCharCode"](65) === "A" ""["constructor"]["fromCharCode"](46) === "."
Unicodeルックアップを使用して、任意のUnicode文字のコードを簡単に見つけることができます。
したがって、文字列の形式で何でも記述できるようになり、Array、String、Number、Boolean、およびObject型のコンストラクターで任意の関数を実行できます。 わずか6文字でまともな力。 しかし、それだけではありません。
関数のコンストラクタとは何ですか?
答えは、 function Function() { [native code] }
、つまりFunctionオブジェクト自体です。
[]["fill"]["constructor"] === Function
これを使用して、コード行を渡し、実際の関数を作成できます。
Function("alert('test')");
取得するもの:
Function anonymous() { alert('test') }
最後に()
を追加することで、すぐに呼び出すことができます。 はい、実際のコードを実行できます!
わあ! 以上です!
これですべての文字にアクセスでき、それらを使用して任意のコードを記述して実行できます。 したがって、Javascriptは、 [
、 ]
、 (
、 )
、 +
、 !
6文字のみで完全なチューリング !
。
変換を自動化するツールがあり、各文字をどのように翻訳するかを以下に示します。
用途は何ですか?
何もない。 eBayは最近悪いことをしていたため 、売り手はこれらの文字を使用して実行可能なJSをページに埋め込むことができましたが、これは典型的な攻撃ベクトルではありません。 難読化の話題を提起する人もいますが、率直に言って、これにはもっと良い方法があります。
ごめんなさい
しかし、私はあなたがこの旅行を楽しんだことを願っています
ソース: