2 poin oleh GN⁺ 2024-03-18 | 1 komentar | Bagikan ke WhatsApp
  • Reverse engineering dengan menggunakan large language model

1. Pengenalan LLM4Decompile dan Decompile-Eval

  • Tujuan kami adalah membuat dan merilis LLM open source pertama yang didedikasikan untuk dekompilasi, serta membangun benchmark dekompilasi pertama yang berfokus pada kemampuan kompilasi ulang dan eksekusi ulang untuk mengevaluasi kemampuannya.
  • Satu juta sampel kode C yang dikumpulkan dari AnghaBench dikompilasi menjadi kode assembly menggunakan GCC, lalu digunakan untuk membangun dataset pasangan assembly-source sebesar 4 miliar token.
  • Dengan dataset ini, model DeepSeek-Coder, salah satu code LLM terdepan, di-fine-tune, dan benchmark evaluasi Decompile-Eval dibangun berdasarkan soal HumanEval dan sampel pengujian.
  • Evaluasi dilakukan dari dua sudut pandang: apakah kode hasil dekompilasi dapat berhasil dikompilasi ulang, dan apakah semua assertion dalam test case dapat dilalui.

2. Hasil evaluasi

Metrik

  • Kemampuan kompilasi ulang dan kemampuan eksekusi ulang adalah metrik penting untuk memverifikasi efektivitas proses dekompilasi.
  • Jika kode hasil dekompilasi dapat dikompilasi ulang, hal itu memberikan bukti kuat atas integritas sintaksis.
  • Karena sintaks saja tidak menjamin kesetaraan semantik dengan program asli, kemampuan eksekusi ulang menjadi ukuran penting untuk menilai akurasi semantik.
  • Kemampuan kompilasi ulang dan eksekusi ulang merepresentasikan pemulihan sintaks dan pelestarian semantik, yang sangat penting untuk dekompilasi yang andal dan dapat digunakan.

3. Cara menggunakan model

  • LLM4Decompile mencakup model dengan 1,3 miliar hingga 33 miliar parameter, dan model-model ini tersedia di Hugging Face.
  • Contoh model: llm4decompile-1.3b, llm4decompile-6.7b, llm4decompile-33b, llm4decompile-6.7b-nsp, llm4decompile-6.7b-uo
  • Model NSP dilatih dengan kode assembly, dan rata-rata kemampuan eksekusi ulangnya sekitar 0,17.
  • Model UO dilatih tanpa pengetahuan awal tentang tingkat optimasi (O0~O3), dan rata-rata kemampuan eksekusi ulangnya sekitar 0,21.
  • Contoh penggunaan model: kompilasi kode C menjadi biner, disassembly biner menjadi instruksi assembly, lalu gunakan LLM4Decompile untuk menerjemahkan instruksi assembly ke C.

4. Cara menggunakan Decompile-Eval

  • Data disimpan dalam format daftar JSON di llm4decompile/decompile-eval/decompile-eval.json.
  • Disediakan cara menjalankan evaluasi pada single GPU dan single process, serta cara menggunakan TGI (10x lebih cepat, mendukung multi-GPU dan multi-process).

5. Sedang berlangsung

  • LLM4Binary: berencana menyertakan dataset yang lebih besar untuk pre-training model dengan kode assembly dan kode C.
  • Decompiler-ALL: rencana untuk mendukung lebih banyak bahasa/platform dan konfigurasi (misalnya, dekompilasi banyak fungsi).

6. Lisensi

  • Lisensi MIT

Opini GN⁺

  • LLM4Decompile menawarkan pendekatan inovatif dibandingkan metode dekompilasi biner yang sudah ada, terutama dengan memanfaatkan large language model untuk memungkinkan dekompilasi yang lebih akurat dan efisien.
  • Teknologi ini bisa sangat berguna di bidang keamanan perangkat lunak, dan dapat membantu analisis malware maupun pemeliharaan sistem legacy.
  • Fakta bahwa kemampuan eksekusi ulang kode hasil dekompilasi belum sempurna menunjukkan bahwa teknologi ini masih memiliki ruang untuk perbaikan. Diperlukan riset tambahan untuk meningkatkan akurasi dan efisiensinya di lingkungan nyata.
  • Alat yang sudah ada dengan fungsi serupa mencakup decompiler komersial dan open source seperti Ghidra atau IDA Pro, tetapi LLM4Decompile menawarkan pendekatan baru berbasis machine learning.
  • Saat mengadopsi teknologi ini, perlu mempertimbangkan kualitas dan cakupan data pelatihan, akurasi model, kecepatan eksekusi, dan sebagainya. Keuntungan yang bisa diperoleh adalah akurasi dan fleksibilitas tinggi, tetapi kompleksitas model skala besar serta kebutuhan sumber daya komputasi dapat menjadi kekurangan.

1 komentar

 
GN⁺ 2024-03-18
Opini Hacker News
  • Opini tentang hasil "re-executability":

    • Re-executability adalah cara penting untuk mengukur akurasi semantik. Hasil dekompilasi dikompilasi ulang lalu test case dijalankan untuk menilai apakah logika dan perilaku program tetap terjaga. Recompilability dan re-executability menunjukkan pemulihan sintaks dan pelestarian semantik, yang penting untuk dekompilasi yang dapat digunakan dan andal.
  • Pertanyaan tentang keandalan hasil dekompilasi:

    • Ini adalah pertanyaan serius tentang apakah hasil dekompilasi bisa dipercaya. Re-kompilasi dapat menghasilkan machine code yang berbeda, dan khususnya mungkin sulit mengidentifikasi struktur baru yang bisa menjadi bagian inti dari kode. Saat dijalankan secara generatif, ada rasa ingin tahu apakah LLM punya cara untuk melaporkan tingkat kepercayaan terhadap bagian tertentu. Tampaknya verifikasi manusia akan diperlukan.
  • Kasus penggunaan yang sangat baik untuk fine-tuning LLM:

    • Ini merupakan kasus penggunaan yang sangat bagus untuk fine-tuning LLM karena dataset besar pasangan input/output dapat dengan mudah dibuat dari kode C yang dipublikasikan.
  • Ketertarikan pada pelatihan modul dekompilasi berbasis pengembang:

    • Menarik apakah modul dekompilasi bisa dilatih berdasarkan aplikasi yang dikerjakan oleh pengembang tertentu. Misalnya, Super Mario 64 dan Zelda 64 telah sepenuhnya didekompilasi, dan game N64 lain juga sedang berjalan. Ada rasa ingin tahu apakah ini bisa mempermudah dekompilasi game lain yang dikerjakan oleh pengembang tersebut.
  • Ketertarikan pada use case ideal decompiler dan pembuatan dataset:

    • Decompiler yang ideal akan menghilangkan kebutuhan akan source code proprietari. Karena melimpahnya kode C yang tersedia secara publik, dataset berupa pasangan ASM dan source code dapat dibuat dengan mudah.
  • Perkenalan proyek decompiler berbasis LLM yang sedang dikerjakan secara pribadi:

    • Sedang mengembangkan decompiler berbasis LLM untuk Python bytecode. Tidak banyak orang yang bekerja pada arah riset ini, tetapi dengan konteks perhatian yang panjang menjadi mungkin, ini tampak menarik. Jika ada yang tahu tim untuk diajak bekerja sama, ada minat untuk berkolaborasi.
  • Kekhawatiran tentang benchmark tanpa perbandingan dengan pendekatan berbasis AI:

    • Menarik melihat berbagai pendekatan, tetapi tanpa perbandingan dengan pendekatan non-AI seperti IDA Pro, benchmark mungkin tidak bermakna. Akan menarik melihat bagaimana performa model ini pada metrik dari paper keamanan.
  • Ketertarikan pada perbedaan besar antara skor recompilability dan re-executability:

    • GPT4 mencapai 8x% dalam recompilability (benar secara sintaksis), tetapi mencatat 1x% yang buruk dalam re-executability (benar secara konseptual), sekali lagi menunjukkan kemampuannya yang berlebihan dalam meniru.
  • Rasa ingin tahu tentang perbandingan dengan decompiler non-LLM lain:

    • Penasaran bagaimana perbandingannya dengan decompiler non-LLM seperti IDA, Binja, dan lainnya. Yang terlihat hanya perbandingan dengan LLM lain.
  • Rasa ingin tahu tentang model 6b yang berkinerja lebih baik daripada model 33b:

    • Menarik bahwa model 6b menunjukkan performa lebih baik daripada model 33b. Ada rasa ingin tahu apakah model 33b membutuhkan lebih banyak data pelatihan. Model 33b telah dipra-latih dengan sekitar 1 juta program C, sedangkan DeepSeek-Coder dilatih dengan 2 triliun token, yang berarti datanya beberapa tingkat lebih banyak.