Skip to main content
QUICK REVIEW

[論文レビュー] Improving type information inferred by decompilers with supervised machine learning

Javier Escalada, Ted Scully|arXiv (Cornell University)|Jan 19, 2021
Software Engineering Research被引用数 7
ひとこと要約

本論文では、C言語のソースコードと対応するバイナリを含む大規模データセットを用いて学習する教師あり機械学習アプローチを提案し、デコンパイラにおける型推論を向上させることを目的としている。コードをインターセプトしてバイナリパターンに高レベルの型情報をラベル付けすることで、関数の戻り値型を予測する際のF1スコアが79.1%に達し、既存のデコンパイラ(30% F1スコア)を著しく上回った。また、デコンパイラ統合に役立つ実行可能なバイナリパターンを文書化した。

ABSTRACT

In software reverse engineering, decompilation is the process of recovering source code from binary files. Decompilers are used when it is necessary to understand or analyze software for which the source code is not available. Although existing decompilers commonly obtain source code with the same behavior as the binaries, that source code is usually hard to interpret and certainly differs from the original code written by the programmer. Massive codebases could be used to build supervised machine learning models aimed at improving existing decompilers. In this article, we build different classification models capable of inferring the high-level type returned by functions, with significantly higher accuracy than existing decompilers. We automatically instrument C source code to allow the association of binary patterns with their corresponding high-level constructs. A dataset is created with a collection of real open-source applications plus a huge number of synthetic programs. Our system is able to predict function return types with a 79.1% F1-measure, whereas the best decompiler obtains a 30% F1-measure. Moreover, we document the binary patterns used by our classifier to allow their addition in the implementation of existing decompilers.

研究の動機と目的

  • デコンパイラが推論する型情報の正確性、特に関数の戻り値型の正確性を向上させること。
  • コンパイラの最適化によって本質的に情報が失われるため、バイナリコードから高レベルの型の意味論を回復する課題に対処すること。
  • 機械学習モデルの学習に用いるため、バイナリパターンと高レベルの型情報のペaired大規模データセットを構築すること。
  • 同じサイズおよび表現を持つ型を区別するための再利用可能なバイナリパターンを特定・文書化すること。
  • 学習されたパターンを既存のデコンパイラに統合し、そのリバースエンジニアリング能力を強化すること。

提案手法

  • Cソースコードを変更して、int、float、bool、struct などの高レベルの型構造と関連付けるように、バイナリマシンコードパターンをラベル付けする。
  • 32ビットWindows向けにMicrosoft Visual C++でコンパイルされた、実際のオープンソースCアプリケーションと合成プログラムを組み合わせたデータセットを生成する。
  • 関数の戻り値型を予測するために、バイナリオペコードシーケンスおよびポストコール命令パターンを用いて、複数の教師あり分類モデル(特に勾配ブースティング)を学習する。
  • 特徴工学を用いて、値が呼び出し元にどのように渡されるかをエンコードするRET(リターン)およびPOST CALL(ポストコール)パターンを抽出する。
  • ルールベースのパターン抽出を適用して、特定の型に対応する高信頼度の特定のバイナリ命令シーケンスを同定する。
  • 未知のコードに対してモデルを検証し、学習データを超えた一般化能力を確保する。主な評価指標としてF1スコアを用いた。

実験結果

リサーチクエスチョン

  • RQ1教師あり機械学習を用いることで、既存の最先端ツールを上回る精度でデコンパイラにおける関数の戻り値型推論を向上させることができるか?
  • RQ2int、float、bool、struct などの異なる高レベル型と相関する具体的なバイナリオペコードパターンは何か?
  • RQ3RETおよびPOST CALL命令パターンは、同じサイズおよび表現を持つ型を区別するためにどのように寄与するか?
  • RQ4学習されたパターンは一般化可能で、既存のデコンパイラの改善に再利用可能か?
  • RQ5同じバイナリサイズおよび表現を持つ型同士において、モデルの性能はどのように変動するか?

主な発見

  • 提案されたシステムは、未知のコードに対して79.1%のF1スコアを達成し、最高の既存デコンパイラ(30% F1スコア)を著しく上回った。
  • 勾配ブースティングがこのタスクにおいて最も効果的な分類アルゴリズムであり、ランダムフォレストやXGBoostといった他のモデルを上回った。
  • floatとdouble、またはboolとintを区別する、特定のオペコードシーケンスやポストコール命令の使用法を含む高信頼度のバイナリパターンを同定した。
  • RETおよびPOST CALLパターンを組み合わせることで分類の信頼性が向上し、1つのルールでは両方のシーケンスを組み合わせることで100%の信頼度を達成した。
  • マイクロソフトCコンパイラが使用するコード生成テンプレート(例:構造体をポインタで返す方法、比較結果を整数として返す方法)を正常に同定・文書化した。
  • データセットおよびパターンは公開されており、既存のデコンパイラへの直接統合が可能で、型推論の向上が可能である。

より良い研究を、今すぐ始めましょう

論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。

クレジットカード登録不要

このレビューはAIが作成し、人間の編集者が確認しました。