2016-04-13 16 views
0
[]["constructor"]["constructor"](<string representing JavaScript code>)() 

をバイパスします。この場合、[]のプロトタイプはArrayクラスです。 Arrayクラスの "constructor"プロパティにアクセスすると、Functionオブジェクトが返されます。 Functionオブジェクトのコンストラクタは関数を返し、その関数の本体は最後のパラメータであり、コンストラクタに渡されます。これにより、提供された文字列を関数の本体(すなわちコード)として使用し、即座に実行される関数が作成されます。上記のコード行を「評価」の方法を用いることなく、難読化JavaScriptコードを実行するために使用されたhttps://www.trustwave.com/Resources/SpiderLabs-Blog/Angler-Exploit-Kit-%E2%80%93-Gunning-For-the-Top-Spot/?page=1&year=0&month=0賢いJavaScriptは「コンストラクタ」プロパティは、オブジェクトのプロトタイプを返すJavaScriptでは評価方法

:から、上の段落で述べたように

。この段落を読んだ後、私はこの巧妙なコード行を理解できません。実際に何が起きているのか誰でも説明できますか?

[].constructor === Array 

さらに、ArrayのコンストラクタはFunctionある:

答えて

4

Arrayインスタンスコンストラクタは明らかArrayあるJavaScriptで今

[].constructor.constructor === Array.constructor === Function 

Function(source)返しますソースがパラメータによって与えられる関数インスタンス。たとえば:

Function("alert(1337)"); 

が作成されます(とに似ている):

function() { 
    alert(1337); 
} 

あなたのコードは、このような機能をインスタンス化し、すぐに()でそれを呼び出します。そしてそれはまさにevalの振る舞いです。

Function(source)(); 
:それは場合に役立ちます

だから、あなたはあなたにコード例を減らすことができます

関連する問題