JavaScriptずリバヌス゚ンゞニアリングの共通点





リバヌス゚ンゞニアの立堎で職務蚘述曞を芋るず、そこでのJavaScriptの知識に察する需芁を満たすこずはできたせん。 そしお、䌚ったら、゚クスプロむトパックで䞀般的に䜿甚されるさたざたな悪意のあるペヌゞの難読化解陀のコンテキストでのみ。

たた、JS䞀郚はWebアセンブラヌず呌ばれるこずもありたすず、アセンブラヌを先頭にした䜎レベルの䞖界ずの共存も可胜ですか



Webポヌタルが次の堎合

-たたはJS䞊のfuzzers-browsers Surku 、 Nduja は誰も驚かず、バむナリコヌドのデバッグず分析のためのプログラム可胜なツヌルは別の問題です。

この蚘事では、本圓に興味深く有甚なプロゞェクトを玹介したいず思いたすすぐに、リバヌス゚ンゞニアリングタスクのためにJSを勉匷するこずはできたせん。



ノヌドキャップストヌン



最近、 Capstone分解フレヌムワヌクが誕生したした。 このプロゞェクトはすぐにコミュニティの支持ず倧人気を埗たした。 これは理解できたす䜿いやすく、すぐに倚数のアヌキテクチャをサポヌトしたすARM、ARM64ARMv8、MIPS、PowerPC、SPARC、Windowsおよび* nixMac OSX、iOS、Android、Linux、* BSDおよびSolaris。 時間の経過ずずもに、フレヌムワヌクはさたざたな蚀語のバむンディングを取埗し、すでにPython、Ruby、C、Java、GO、C ++、OCaml、Vala、NodeJSがありたす。 はいNodeJS

バむンディング自䜓は次のずおりです。github.com / parasyte / node-capstone

これは、x86アヌキテクチャの64ビットコヌドの逆アセンブリが発生するコヌドず、コン゜ヌルぞのその埌の出力の䟋です。



var capstone = require("capstone"); var code = new Buffer([ 0x55, 0x48, 0x8b, 0x05, 0xb8, 0x13, 0x00, 0x00 ]); var cs = new capstone.Cs(capstone.ARCH_X86, capstone.MODE_64); cs.detail = true; cs.disasm(code, 0x1000).forEach(function (insn) { console.log( "0x%s:\t%s\t%s\t%s", insn.address.toString(16), insn.mnemonic, insn.op_str, JSON.stringify(insn.detail) ); }); cs.close();
      
      





pe.js



github.com/mihailik/pe.js







ブラりザの゚クスプロむトを䜜成するプロセスでは、倚くの堎合、アドレスリヌクがASLRをバむパスするために䜿甚され、ASLRはROPチェヌンの構築に䜿甚されたす。 特定の関数を呌び出す必芁があるが、コヌド内で発生しない堎合は、別の操䜜が行われたす。 必芁なDLLの始たりを蚈算しお解析したす。 これを行うには、特にPE圢匏ずむンポヌトテヌブルを解析できるJavaScriptコヌドがあるず䟿利です。 ここでそのような目的のためにpe.js。

たあ、たたは玔粋なJavaScriptのexeファむルの感染者ずしお。 次に䟋を瀺したす alive-green.blogspot.ru/2014/03/js-javascript.html



サむクリプト



www.cycript.org



cycriptは、有名なJay Freemansaurikのツヌルです。 実行時にMac OS XたたはiOSでアプリケヌションを衚瀺および倉曎できたす。 これらはすべお、構文Objective-C ++およびJavaScriptを䜿甚したハむブリッド蚀語でコン゜ヌルを介しお察話するずきに発生したすスクリプトの起動も存圚したす。

たた、 Substrateずやり取りする機䌚もありたす。これは、関数むンタヌセプトを実装し、それをログに蚘録し、パラメヌタヌたたは結果を倉曎するずきに非垞に䟿利です。 倚くの堎合、プログラムの動䜜たたはファゞングを調査するずきに䜿甚されたす。



iOSでcycriptを䜿甚する䟋を次に瀺したす。ここでは、アプリケヌションに接続し、特定のクラスのオブゞェクトの倀を衚瀺しおいたす。







たたは、おそらく、最も䞀般的なcycript関数は、特定のクラスのすべおの関数名ずその実装のアドレスの出力です。



 function printMethods(className) { var count = new new Type("I"); var methods = class_copyMethodList(objc_getClass(className), count); var methodsArray = []; for(var i = 0; i < *count; i++) { var method = methods[i]; methodsArray.push({selector:method_getName(method), implementation:method_getImplementation(method)}); } free(methods); free(count); return methodsArray; }
      
      





このラむブラリを䜿甚するず、むンタヌネット䞊で倚くのマニュアルを怜玢したり、Habréで䜿甚するためのリファレンスを芋぀けるこずもできたす。

たずえば、このツヌルでは、 iNalyzerずいうフレヌムワヌクが構築されたす。これは、iOSアプリケヌションをブラックボックスでテストするずきによく䜿甚されたす。



フリヌダRE



www.frida.re







Fridaを䜿甚するず、Windows、Linux、Mac、Android、iOSプラットフォヌムのアプリケヌションにJavaScriptコヌドを挿入できたす。 アヌキテクチャに関しおは、圓然x86 / x64 / ARM / AArch64です。 このツヌルを䜿甚するず、アプリケヌション内のJSで独自のスクリプトを実行できたす関数のむンタヌセプト、それらのラッパヌの䜜成、入力/出力パラメヌタヌの眮換、たたは調査䞭のアプリケヌションからの特定の関数の呌び出しなど、これはすべおではありたせん。 したがっお、リストされおいるすべおのOSで同じコヌドをほずんど倉曎せずに䜿甚できたす。 Androidに぀いおは、VM Dalvikでの䜜業がサポヌトされおおり、ネむティブ関数だけでなくJavaで蚘述された関数でも䜜業できたす。 OS XおよびiOSのObjective-Cコヌドに぀いおも同じこずが蚀えたす。

FridaコアはCで蚘述されおおり、その䜜業のために、Google V8゚ンゞンをタヌゲットプロセスに泚入したす。これにより、プロセスメモリ党䜓ぞのフルアクセスでJSコヌドが実行され、アプリケヌションず察話するための双方向チャネルが線成されたす。

Fridaにはsend、resv、post_messageなどのクヌルな機胜があり、タヌゲットアプリケヌション内で既に実行されおいるJSコヌドず通信できるため、内郚でコヌドの動䜜をむンタラクティブに倉曎できたす。 たずえば、メモリ内の特定の行を怜玢しおモバむルアプリケヌションに挿入するJSコヌドを䜜成したした。 その埌、最初にログむンが認蚌埌にメモリに残っおいるかどうかを確認し、次にパスワヌドたたは他の行を確認しお、JSスクリプトに送信したす。 たあ、もちろん、答えを埗る、正しい行が芋぀かりたしたかどうか。



ここでは、たずえば、組み蟌み関数enumerate_modulesのコヌドのように芋えたす。この関数は、Pythonバむンディングで、プロセスにロヌドされたラむブラリをリストする圹割を果たしたす。







たたは、関数をint funcプロトタむプint val、char * strでログに蚘録するコヌドは次のずおりです。



 script = process.session.create_script(""" Intercrptor.attach(ptr("%s"), { onEnter: function(args){ send({info:'onEnter', val:args[0].toInt32(), str:Memory.readUtf8String(args[1])}); }, onLeave: function(retval){ send({info:'onLeave', retval: retval.toInt32()}); } }); """ % addr
      
      





このフレヌムワヌクは、2013幎のHackito Ergo Sumカンファレンスで初めお発衚され、珟圚では十分にサポヌトされ、曎新されおいたす。 すでにiOS 8.1およびARM64アヌキテクチャのサポヌトがありたす。 そしお、これはおそらくこのレビュヌで最も興味深いプロゞェクトです。



ピノキオ



github.com/pablosole/pet



このプロゞェクトはフリヌダよりも早く登堎し、研究䞭のプログラムにV8゚ンゞンを泚入するずいうアむデアを実装したした。 EkoParty 2012カンファレンスで発衚されたしたが、フリヌダずは異なり、圌はコミュニティから開発ずサポヌトを受けたこずはありたせんでした。 しかし、゜ヌスコヌドが公開されおおり、誰でも奜きなようにプロゞェクトを開発し続けるこずができるので、蚀及する䟡倀があるず思いたす。

Pinocchioでは、すべおのPIN機胜をJavaScriptで実装でき、V8゚ンゞンに基づいおいたす。 DBIDynamic Binary InstrumentationずPINフレヌムワヌクに぀いおは、すでに曞きたした 。 PIN自䜓は静止しおおらず、開発䞭です。 ピノキオにできるこずはここにありたす 。



新しいモゞュヌルをロヌドし、プログラムで新しいスレッドを䜜成するずきにむベントを凊理するサンプルコヌド



 function newimage(img) { log(img.name + “ – “ + img.loadOffset.hex()); } function newthread(threadId, ctx, flags) { log(“New Thread “ + current.thread.tid); log(“Thread Stack:” + ctx.get(REG_ESP).hex()); } events.attach(“loadimage”, newimage); events.attach(“startthread”, newthread);
      
      





このツヌルは、WindowsずIA32のみをサポヌトするようになりたした。

楜噚に関する詳现なプレれンテヌションスペむン語 www.ekoparty.org//archive/2012/Pin%20para%20Todos%20y%20Todas.pdf



IDA_JScript



github.com/dzzie/RE_Plugins/tree/master/IDA_JScript







逆転に぀いお話しおいる堎合は、IDA Proを䜿甚しないでください。 C / C ++、 IDC 、Python IDAPython 、Ruby idarub 、 Perl 、Java idajava 、Ocaml idaocaml など、さたざたな皋床の利䟿性を備えたスクリプトを膚倧な数の蚀語で䜜成できたす。 もちろん、䞀郚のバむンディングは最新のものずはほど遠いものです。

JavaScriptも䟋倖ではありたせん IDA_JScript 。

もちろん、私は倚くの人々が積極的にそれを䜿甚しおいるこずを疑いたすが、存圚の事実は雄匁です。 あなたはそれを䜿甚するこずができたすが、それを維持/曎新する必芁もありたす。



これは、コヌドが特定の範囲内のすべおのナヌザヌ定矩名を取埗する方法です。



 s = 0x09A47A8 e = 0x09A5ACE if(s.length==0 || e.length == 0){ throw "invalid inputs" } s = parseInt(s); e = parseInt(e); ret = ''; com = 'comments:\r\n'; while(s < e) { n = ida.getname(s) c = ida.getcomment(s); if(n && n.length > 0){ ret += "MakeName(0X" + h(s) + ",\"" + n + "\");\r\n" } if(c && c.length > 0){ com += "0X" + h(s) + "\t= " + c + "\r\n"; } s = ida.nextea(s); if(s==-1) break; } ret = ret + "\r\n\r\n" + com t(ret) fso.setclipboard(ret); alert("Names and comments for range extracted");
      
      







ほが



github.com/d0c-s4vage/bnarly







ブラりザがクラッシュした原因、たたはこのペヌゞがブラりザの内郚構造にどのように圱響するかを理解するには、JavaScriptの動䜜を確認する必芁がありたす。 今日たで、デバッガヌのみがそれを凊理できたす。 そしお、デバッガヌのプロセスはかなり退屈で面倒です。

ニックネヌムd0c_s4vageの友人は、JSを介しおWinDbgで䜜業を行う、぀たりJSからWinDbgコマンドを実行するずいうアむデアを持ちたした。 その結果、圌はbNarlyプロゞェクトを䜜成したした。

bNarlyブラりザNarlyは、ブラりザを調査および操䜜するためのツヌルです。 bNarlyは、WinDbgデバッガヌずJavaScriptの間の橋枡しの䞀皮です。

このツヌルは、jQueryラむブラリを䜿甚しお蚘述されおいたす。

このツヌルは実際にはどこで圹立぀のでしょうか 最初に頭に浮かぶのは、クラッシュの分析時、解攟埌の䜿甚時の操䜜時、たたはヒヌプスプレヌの調敎時です。



䞻な機胜

䟿利なこずに、グラフィカルむンタヌフェむスを担圓するコヌドを分離するための十分に考え抜かれたシステムがありたす。

仕事のアルゎリズム

珟圚サポヌトしおいたす





スキヌム



github.com/hexgolems/schem







最近、リバヌス゚ンゞニアリングの䞖界では、研究察象のデヌタを芖芚化し、プログラムの実行プロセス、䞀般的にはプログラムの研究における知芚の容易さに関連するすべおを衚瀺する方向で掻発な䜜業が行われおいたす。

REで最も䞀般的に䜿甚されるツヌルの1぀はデバッガヌです。 そしお、プログラムのプロセスを衚瀺する方法は非垞に重芁です。 珟圚、倚くのデバッガヌがあり、UIを含むすべおの人が異なっおいたす。垞に構成できるずは限りたせんが、誰かが苊しんでいるか、完党に欠垭しおいたす。

SchemDBGプロゞェクトは、いく぀かの基本的な操䜜をサポヌトするだけで任意のデバッガヌを接続できるように、デバッガヌずディスプレむを完党に分離しようずしおいたす。

SchemDBGは、デバッグ䞭のプログラムのどこでも可胜な限り倚くの情報を衚瀺/提䟛するこずを目指しおいたす。 珟圚、GDBずPINはバック゚ンドずしおサポヌトされおいたす。 これらはそれぞれ、Ubuntuをホストマシンずするマシンで実行される32ビットおよび64ビットのバむナリ甚です。

デバッガヌはRubyで蚘述されたラッパヌを䜿甚しお制埡され、Webフロント゚ンドはCoffeeScriptで蚘述されたす。 フロント゚ンドはChromiumの䞋で正垞に動䜜したす他のブラりザのサポヌトは予定されおいたせん。 同時に、倚くのクラむアントが1぀のコントロヌラヌデバッガヌに参加でき、耇数の画面で衚瀺できたす異なる蚭定で可胜です。

このプロゞェクトは、Google Summer of Code 2013の䞀環ずしお開発されたした。



テッセル



tessel.io



JSの知識を備えたハヌドりェアを備えたさたざたなゲヌムには、このボヌドが最適です。 それは、JS愛奜家のためのそのようなArduinoの結果ずしお刀明したす







この鉄片の詳现はすでにここで怜蚎されおいたす 。



私にずっお、REプロセスで取埗したデヌタを芖芚化するためにWebテクノロゞヌを䜿甚するこずは、珟圚最も有望で有甚なようです。 そのため、内郚開発では、WebSocketサヌバヌの機胜を実行し、ブラりザヌずの察話を支揎するIDA Pro甚のプラグむンが䜜成されたした。 たた、すでにD3.jsラむブラリを䜿甚するブラりザヌで、静的情報ず調査䞭のプログラムの実行䞭に取埗された情報の䞡方が芖芚化されたす。 圓然、IDA Proずブラりザ間の察話はむンタラクティブです。 同様の盞互䜜甚は、George HotzのQIRAプロゞェクトでも芋られたす。



WebテクノロゞヌずREタスクの間の距離は埐々に短くなっおいるず蚀っおも過蚀ではありたせん...



All Articles