2 ポイント 投稿者 GN⁺ 2024-03-18 | 1件のコメント | WhatsAppで共有
  • 大規模言語モデルを用いたリバースエンジニアリング

1. LLM4Decompile および Decompile-Eval の紹介

  • 私たちの目標は、初の逆コンパイル専用オープンソース LLM を作成・公開し、再コンパイル可能性と再実行可能性に焦点を当てた初の逆コンパイルベンチマークを構築して、その性能を評価すること。
  • AnghaBench で収集した 100 万件の C コードサンプルを GCC を使ってアセンブリコードにコンパイルし、これにより 40 億トークンのアセンブリ-ソース対データセットを構築した。
  • このデータセットを用いて、先進的なコード LLM である DeepSeek-Coder モデルをファインチューニングし、HumanEval の問題とテストサンプルに基づく評価ベンチマーク Decompile-Eval を構築した。
  • 評価は、逆コンパイルされたコードが正常に再コンパイルできるか、テストケースのすべてのアサーションを通過できるかという 2 つの観点から行われる。

2. 評価結果

メトリクス

  • 再コンパイル可能性再実行可能性は、逆コンパイル過程の有効性を検証する重要な指標である。
  • 逆コンパイルされたコードが再コンパイル可能であれば、構文的完全性の強力な証拠となる。
  • 構文だけでは元のプログラムと意味的に同一であることは保証されないため、再実行可能性は意味的正確性を評価する重要な尺度である。
  • 再コンパイル可能性と再実行可能性は、構文の復元と意味の保持を示しており、これは実用的で堅牢な逆コンパイルに不可欠である。

3. モデルの使用方法

  • LLM4Decompile には 13 億から 330 億パラメータのモデルが含まれており、これらのモデルは Hugging Face で利用できる。
  • モデル例: llm4decompile-1.3b, llm4decompile-6.7b, llm4decompile-33b, llm4decompile-6.7b-nsp, llm4decompile-6.7b-uo
  • NSP モデルはアセンブリコードで訓練されており、平均再実行可能性は約 0.17 である。
  • UO モデルは最適化レベル (O0~O3) に関する事前知識なしで訓練されており、平均再実行可能性は約 0.21 である。
  • モデル使用例: C コードをバイナリにコンパイルし、バイナリをアセンブリ命令に逆アセンブルし、LLM4Decompile を使ってアセンブリ命令を C に変換する。

4. Decompile-Eval の使用方法

  • データは llm4decompile/decompile-eval/decompile-eval.json に JSON リスト形式で保存されている。
  • 単一 GPU・単一プロセスで評価を実行する方法と、TGI(10 倍高速、マルチ GPU およびマルチプロセス対応)を使う方法が提供されている。

5. 進行中

  • LLM4Binary: アセンブリコードと C コードでモデルを事前学習するため、より大規模なデータセットを含める予定。
  • Decompiler-ALL: より多くの言語・プラットフォーム・設定に対応する計画(例: 複数関数の逆コンパイル)。

6. ライセンス

  • MIT ライセンス

GN⁺の意見

  • LLM4Decompile は、既存のバイナリ逆コンパイル方式と比べて革新的なアプローチを提示しており、とくに大規模言語モデルを活用することで、より正確で効率的な逆コンパイルを可能にしている。
  • この技術はソフトウェアセキュリティ分野で非常に有用となる可能性があり、マルウェア解析やレガシーシステムの保守に役立つ可能性がある。
  • 逆コンパイルされたコードの再実行可能性が完全ではない点は、この技術にまだ改善の余地があることを示している。実環境での正確性と効率を高めるための追加研究が必要である。
  • 類似機能を提供する既存ツールとしては、Ghidra や IDA Pro のような商用・オープンソース逆コンパイラがあるが、LLM4Decompile は機械学習ベースの新しいアプローチを提供している。
  • この技術を導入する際には、学習データの質と範囲、モデルの精度、実行速度などを考慮する必要があり、導入によって得られる利点は高い精度と柔軟性だが、大規模モデルの複雑さと計算資源の要求量が欠点となりうる。

1件のコメント

 
GN⁺ 2024-03-18
Hacker Newsのコメント
  • 「再実行可能性」の結果についての意見:

    • 再実行可能性は意味論的正確性を測定する重要な方法である。デコンパイルされた結果を再コンパイルし、テストケースを実行して、プログラムのロジックと動作が保持されているかを評価する。再コンパイル可能性と再実行可能性は、構文の復元と意味の保持を示しており、これは実用的で堅牢なデコンパイルに不可欠である。
  • デコンパイル結果の信頼性に関する疑問:

    • デコンパイル結果が信頼できるのかという真剣な疑問である。再コンパイルによって異なる機械語コードが生成される可能性があり、特にコードの中核部分であるかもしれない新しい構造物を識別するのは難しいことがある。生成的に実行する際、LLMが特定セクションに対する信頼度を報告する方法があるのか気になる。人間による確認が必要になりそうだ。
  • LLMのファインチューニングにとって優れたユースケース:

    • 公開されているCコードから入出力ペアの大規模データセットを容易に生成できるため、LLMのファインチューニングにとって優れたユースケースである。
  • 開発者ベースのデコンパイルモジュール学習への関心:

    • 特定の開発者が手がけたアプリケーションを基にデコンパイルモジュールを学習できるかどうかは興味深い。たとえば、Super Mario 64とZelda 64は完全にデコンパイルされており、他のN64ゲームでも作業が進んでいる。そうした開発者が手がけた別のゲームを、より簡単にデコンパイルできるのか気になる。
  • デコンパイラの理想的なユースケースとデータセット生成への関心:

    • 理想的なデコンパイラは独自ソースコードを不要にするだろう。公開利用可能なCコードが豊富にあるため、ASMとソースコードのペアからなるデータセットを簡単に作成できる。
  • 個人で進めているLLMベースのデコンパイラプロジェクトの紹介:

    • Pythonバイトコード向けのLLMベースのデコンパイラを開発中である。この研究方向に取り組む人は多くないが、長い注意コンテキストが可能になったことで面白くなるのではないかと考えている。協力できるチームを知っていれば、連携に関心がある。
  • AIベースのアプローチとの比較がないベンチマークへの懸念:

    • さまざまなアプローチを見るのは素晴らしいが、IDA Proのような非AIベースのアプローチとの比較がなければ、ベンチマークには意味がないかもしれない。このモデルがセキュリティ論文のメトリクスでどのような性能を示すのか見るのは興味深い。
  • 再コンパイル可能性と再実行可能性スコアの大きな差への関心:

    • GTP4は再コンパイル可能性(構文的に正確)で8x%を達成した一方、再実行可能性(概念的に正確)ではひどい1x%を記録しており、その過剰な模倣能力を改めて示している。
  • LLM以外のデコンパイラとの比較への疑問:

    • IDA、Binjaなどの非LLMデコンパイラとの比較はどうなのか気になる。他のLLMとの比較しか見当たらない。
  • 6bモデルが33bモデルより優れた性能を示したことへの興味:

    • 6bモデルが33bモデルよりも良い性能を示しているのは興味深い。33bモデルにはより多くの学習データが必要なのだろうか。33bモデルは約100万個のCプログラムで事前学習されていたが、DeepSeek-Coderは2兆トークンで学習されており、これは数段多いデータ量である。