Membuat modul prosesor untuk Ghidra menggunakan contoh bytecode v8

Tahun lalu, tim kami menghadapi kebutuhan untuk menganalisis bytecode V8. Pada saat itu, tidak ada alat siap pakai yang dapat memulihkan kode tersebut dan menyediakan navigasi yang nyaman melaluinya. Diputuskan untuk mencoba menulis modul prosesor untuk kerangka kerja Ghidra. Karena kekhasan dari bahasa deskripsi instruksi yang digunakan, kami tidak hanya mendapatkan sekumpulan instruksi yang dapat dibaca, tetapi juga dekompiler mirip-C. Artikel ini merupakan kelanjutan dari serangkaian materi ( 1 , 2 ) tentang plugin kami untuk Ghidra.





Beberapa bulan berlalu antara penulisan modul prosesor dan artikel. Selama waktu ini, spesifikasi SLEIGH tidak berubah, dan modul yang dijelaskan berfungsi pada versi 9.1.2โ€“9.2.2, yang dirilis selama enam bulan terakhir.





Sekarang di ghidra.re dan dalam dokumentasi yang dilampirkan ke Ghidra ada deskripsi yang cukup baik tentang kemampuan bahasa - materi ini layak dibaca sebelum menulis modul Anda sendiri. Modul prosesor siap pakai dari pengembang kerangka kerja dapat menjadi contoh yang sangat baik, terutama jika Anda mengetahui arsitektur yang dijelaskan di dalamnya.





Dalam dokumentasi, Anda dapat membaca bahwa modul prosesor untuk Ghidra ditulis dalam bahasa SLEIGH, yang berasal dari bahasa SLED (Bahasa Spesifikasi untuk Pengkodean dan Penguraian Kode) dan dikembangkan secara khusus untuk Ghidra. Ini menerjemahkan kode mesin menjadi kode-p (bahasa perantara yang digunakan oleh Ghidra untuk membangun kode yang didekompilasi). Sebagai bahasa yang dimaksudkan untuk mendeskripsikan instruksi prosesor, ia memiliki banyak batasan, yang, bagaimanapun, dapat dihentikan karena mekanisme injeksi p-code dalam kode java.





github. , SLEIGH . , p-code, . The Ghidra Book: The Definitive Guide.





Eclipse, , Ghidra: GhidraDev GhidraSleighEditor. Ghidra Module Project v8_bytecode. , .





, , The Ghidra Book: The Definitive Guide. .





  • *.spec โ€” .





  • *.ldefs โ€” . . *.sla, .





  • *.pspec โ€” .





  • *.opinion โ€” ; , opinion : .





  • *.slaspec, *.sinc โ€” , SLEIGH.





.sla, slaspec-.





, , , , . . .





V8

Jsc-, , c JavaScript Node.Js 8.16.0 bytenode ( Node.Js, npm). , bytenode Node.js . , jsc js:





Node.js , . , ( bytecode-register.cc, bytecode-register.h). v8 Node.js:





, aX , . .





 โ€” <this>, aX โ€” , , rN โ€” , . 1- , 2- Wide- 4- ExtraWide-. Wide- :





Node.js v8 .





, SLEIGH , . , 124  rN 125  aX. , . :





, Node.js - . (X aX) . , , .





, , .





CSPEC                                                  

, cspec-, github. :





Ghidra .  โ€” , , . Ghidra SLEIGH , Intel x86, . , , . , , .





, :





  • Compiler Specific P-code Interpretation;





  • Compiler Datatype Organization ( <data_organization>);





  • Compiler Scoping and Memory Access ( <global>);





  • Compiler Special Purpose Registers ( <stackpointer>);





  • Parameter Passing ( <default_proto>).





, , .





<data_organization> <stackpointer> ; <prototype> <default_proto>, . : <input>



, <output>



, <unaffected>



.





, aX. . , register. . , , , , . (space="register"



) <input>



, , 0x14000 (0x14000 , , *.slaspec aX).





(acc), <output>



. , , . <unaffected>



, , , .





, <global>



register 0x2000.





LDEFS

 โ€” .ldefs. : ( le), (*.sla, *.pspec,*.cspec), id , Ghidra. - , Node.js, , <language>, *.ldefs , Ghidra.





, , .





PSPEC

( .pspec). processor_spec.rxg ( Ghidra ). - . , .





, ( <processor_spec> ).





SLASPEC

SLEIGH .slaspec.





. , , .





, ( register ram), define space,  โ€” define register. offset , , . size. , *.cspec , .





(https://ghidra.re/courses/languages/html/sleigh_constructors.html) , ,  โ€” . SLEIGH , , , ยซ ยป. 5 .





  1. Table Header ( )





  2. Display Section ( )





  3. Bit Pattern Sections ( )





  4. Disassembly Actions Section ( )





  5. Semantics Actions Section ( )





, .





  1. Table Header , , ( ).





  2. Display Section โ€” , Ghidra.





  3. Bit Pattern Section โ€” - , ยซยป c ( ).





  4. Disassembly Actions Section - , .





  5. Semantics Actions Section , , .





( instruction), , .





, , . , , . . , ( ), .





, :





  • ^ โ€” / , ;





  • โ€œโ€ โ€” , , ;





  • , ;





  • ( - , ,  #, ).





. , . , . . , :





tokenMaxSize  8. , - . , , , . : start- endBitNumX 0 tokenMaxSize-1 startBitNumX <= endBitNumX.





v8 , . , , ยซ&ยป ยซ|ยป.





: , , , ยซยป , .





, . , . v8, ( Wide- ExtraWide- , , ). :





, op , Illegal Nop, :





ยซ0xa7ยป Ghidra Illegal, . unimpl. , , . Nop , , . Nop Node.js , SwitchOnSmiNoFeedback,





: LdaSmi, (acc ), AddSmi, c .





bytecodes.h Node.js, operand, . , (. AddSmi).





- LdaSmi [-02]. , , disassembly action ( , ).





AddSmi , op, , ยซ;ยป operand. . , . , , (, , ).





ยซ;ยป , , , ( ), .





PCode ยซ ยป Ghidra. - , p-code.





v8 , lda, . acc . , acc, , .





return, , , :





, , . Mul, , .





ยซ ยป , , , ยซยป . kReg 8 . attach variables 0b 11111111b ( kReg) . , , , 0xfb (11111011b), kReg r0.





, kReg , :





interpreter-generator.cc Node.js. kReg , Table Header src.  โ€” export. p-code, export , ยซยป src. Ghidra .





, :





goto

. SLEIGH goto. , kUImm, . disassembly action rel. inst_start SLEIGH .





SLEIGH . , ( ), , ( , p-code ), .





ยซยป dest. *[ram]:4 rel , 4  rel. rel ram. ยซ*ยป SLEIGH , ( Dynamic References).





[ram] ( ), . p-code, ram.





JumpIfFalse - . SLEIGH goto. js False , , pspec , , . , .





inst_start . TestGreaterThan, goto (<true> ) inst_next. : , , . .





goto inst_next . , ยซs>ยป, . .





. .





, (. ), . v8, . , 4  CallProperty2 , . :CallProperty2 kReg, kReg, kReg, kReg, [kIdx] Sleigh . - :





, , . , callable, receiver, arg1 arg2 - attach :





kReg .  โ€” .





CallProperty2 , call [callable];, . v8 aX ( cspec). , , (, , sinc-, x86). , . Ghidra, . , - , . :





( : sp , ) CallUndefinedReceiver1:





, , java-. , , , SLEIGH. p-code .





, , . , acc , , . , , ( CallVariadicCallOther ยซ ยป ). define pcodeop OperationName , .





p-code- : callotherfixup



cspec- .





java- , :





. bytenode jsc- js:





jsc- Ghidra. - , Ghidra , eclipse , . : sleigh .





, . .





, . 010.  D  F, . :





( SLEIGH), . , ( SLEIGH cpool) LdaGlobal. ( ):





, , JavaScript, , .slaspec ( .sinc). , p-code, , p-code. p-code .





v8 , / . . , , .





, , : ForInPrepare r9, r10!3. , , , , , .





,

. . , ARM: ( , - ).





, . , . . , , , , .





, CallProperty , ยซยป , , . , : rangeSrc rangeDst. rangeSrc โ€” , , rangeDst ยซยป . rangeDst , : aX rX .





. ยซ=ยป, , disassembly action. - . , , , aX, rX, . : , , , .





. . , (contextreg ).





, , ( ), . counter offStart , .





, .





, , , - disassembly action. rangeSrc, , disassembly action offStart,  โ€” counter. ยซ{ยป.





, v8 range_size: , . rangeSrc .





  rangeDst 5  .





  • a0 counter 0 ( ).





  • r0 counter 0 ( ).





  • offStart a0, disassembly action counter , offStart , rangedst1.





  • offStart r0, disassembly action counter offStart , rangedst1.





  • , rangedst1( , , , ).





. rangeDstN, N โ€” , , aN/rN.





. rangeSrc , , rangeDst - , . epsilon, .





rangeDst, rangeDst1, rangeDst2, . , github. , rangeDst rangeDstX, ,  โ€” , .





, . ยซ&ยป ยซ|ยป.





CallProperty :





:





, , CallVariadicCallOther. github java- p-code. p-code call ( Node.js, ,  โ€” ). slaspec, , , :





, :





rangeDst ( r7 ) , console.log(1,2,3,4,5,6). bytenode . 0x167,  โ€” 0x18b.





, , , , - ( , , , ).





, rangeDst , ( , 2 4 ):





, : , . , , . , , , . , , . , SLEIGH.





Node.js , , .





:





:





  1. https://ghidra.re/courses/languages/html/sleigh.html โ€” SLEIGH.





  2. https://github.com/NationalSecurityAgency/ghidra/tree/master/Ghidra/Framework/SoftwareModeling/data/languages โ€” *.cspec, *.pspec, *.opinion, *.ldefs.





  3. https://spinsel.dev/2020/06/17/ghidra-brainfuck-processor-1.html โ€” brainfuck Ghidra.





  4. https://github.com/PositiveTechnologies/ghidra_nodejs โ€” Ghidra .








All Articles