Slide 1

Slide 1 text

Shizuoka University Aクラスチューター 齊藤遼太 (@77777kusa) 静岡大学情報学部 セキュリティキャンプ全国大会2025 2025年 8月 14日 デコンパイラ研究最前線

Slide 2

Slide 2 text

Shizuoka University はじめに 日本でデコンパイラの研究をしてる人がいなくて寂しいです 興味がある方は軽率にご連絡ください 議論, 質問, 指摘, マサカリ歓迎 @齊藤(Aチューター) Twitter: @77777kusa デコンパイラ研究最前線について語ろうとしたら スライドが60枚になってしまいました 話が終わりません 配布するので勝手に読んでください 背景

Slide 3

Slide 3 text

Shizuoka University 研究背景 デコンパイラ De-Compiler (日本語: 逆コンパイラ) コンパイラがソースコードを実行ファイルに変換するように, 実行ファイル をソースコードに変換したい マルウェア解析, 脆弱性調査, ソフトウェアの復元などに使用される 皆さまデコンパイラの原理と実装をご存じでしょうか ソフトウェアリバースエンジニアリングにおいて, 割と基盤技術なのに研究 者がいなさすぎる 使用者と開発者の割合が釣り合ってなくてダメ, 気持ちの良くない抽象化 またの名をブラックボックス 少なくとも表に出てる分には, 実用に耐えうるデコンパイラが米国に集中 しすぎ 背景

Slide 4

Slide 4 text

Shizuoka University 既存のデコンパイラ 背景 Ghidra[NSA] NSAが古くから内部的に使用してきたDecompiler 2019年に機密解除, オープンソース化 WannaCryの補償...? PythonやJavaを使って拡張機能が作成できる

Slide 5

Slide 5 text

Shizuoka University 既存のデコンパイラ 背景 IDA Pro[Hex-Ray] Hex-Ray社が開発しているデコンパイラ 商業デコンパイラの中で広いシェアを持つ 拡張機能をユーザーが開発可能 MS-DOSの時代から開発が続いており, 老舗

Slide 6

Slide 6 text

Shizuoka University 既存のデコンパイラ 背景 Binary Ninja[Vector 35 Inc] CTF(Capture the Flag) 向けに開発された 独自のAI Copilotを搭載 Rustでプラグインを開発可能 モダン(主観による評価)

Slide 7

Slide 7 text

Shizuoka University デコンパイラの実装 主に以下のコンポーネントを作成し, 統合することでデコンパイラは実装される Disassemble 機械語をアセンブリに変換 CFG(Control Flow Graph) Construction アセンブリをCFGに変換 IL / IR Lifting データフロー解析のためのILをアセンブリから生成 Control Flow Graph Structuring グラフパターンマッチングにより, CFGから高級言語の構造を復元 (e.g., if, while, for, etc) Type Recovery IRからデータフローを解析し, 式に型制約を付加 実現したいこととその方針

Slide 8

Slide 8 text

Shizuoka University 困難性 特に難しいのが CFG Construction こっちはコンパイラの人たちが割と研究してくれているので CFG Structuring こっちの話からします Type Recovery 時間が足りない, ここでしゃべれるほどまだ詳しくない ちょっとだけ書いとくと, 型制約というものを使うらしいです データの振る舞いから, 満たされる条件を収集し, あり得る型のリストを列挙 詳しい人教えてください 背景

Slide 9

Slide 9 text

Shizuoka University 困難性 CFG Structuring CFGのブロックを縮約したい Seq, If-Then(-Else), Switch, For, While 基本的にはグラフスキーママッチングを使用する ノードを縮約 背景

Slide 10

Slide 10 text

Shizuoka University 困難性 CFG Structuring グラフの例 基本的にはSESSでグラフを 切り出して頑張る Single Entry Single Successor 全人類がこのグラフを目Structuring できればいいが... 背景

Slide 11

Slide 11 text

Shizuoka University 困難性 CFG Structuring グラフの例 基本的にはSESSでグラフを 切り出して頑張る Single Entry Single Successor 全人類がこのグラフを目Structuring できればいいが... そんなわけはない ずっとCFGと戯れてたらちょっとでき るようになってきた 背景 continue break ネストしたif 多分Whileの中にif-then-elseがある Entry

Slide 12

Slide 12 text

Shizuoka University 困難性 CFG Structuring 切り出したグラフに適用するスキーマの例 Phonix[Schwartz+,14] 背景

Slide 13

Slide 13 text

Shizuoka University 困難性 CFG Structuring かつての敵は”goto” スキーマにマッチしなかったエッジはgotoにデコンパイル していた → デコンパイル結果からgotoが減れば品質が上がるはず DREAM no more gotos[Yakdan+, 2015] CFGに適用できる現実的な計算量の構造化アルゴリズム goto edge 0を達成 詳細は3時間話せるので割愛 背景

Slide 14

Slide 14 text

Shizuoka University 困難性 0 goto (構造化定理) は一種の答えだが... 究極のデコンパイラとは何か 実行ファイルを生成した真のソースコードを復元できること? これは少なくともNP Hard コンパイラが情報を忘却するため ソースコードにgotoが含まれていた場合... コンパイラ最適化でgotoが発生していた場合 →むしろ真のに求めるソースコードからは遠くなる 背景

Slide 15

Slide 15 text

Shizuoka University 困難性 DREAMの Control Flow Graph Edit Distanceが他よりでかい rev.ngも0 goto cfg structuring 背景

Slide 16

Slide 16 text

Shizuoka University 困難性 元のソースコードと同じ数のgotoが存在し, かつCFGEDが小さい結果が欲し い 背景

Slide 17

Slide 17 text

Shizuoka University 困難性 元のソースコードと同じ数のgotoが存在し, かつCFGEDが小さい結果が欲し い 背景 なんだこれは

Slide 18

Slide 18 text

Shizuoka University 困難性 SAILR[Zion+, 2024] Deoptimizing CFG Gcc –O2 で行われる最適化の中で可逆なものをできるだけ元に戻す 逆最適化 (De-Optimization) これによって, gotoの数とGEDをオリジナルに近づける 背景

Slide 19

Slide 19 text

Shizuoka University 困難性 SAILR[Zion+, 2024] Deoptimizing CFG あと妙に高速なCFGED評価プログラムもOSSで公開してる https://github.com/mahaloz/sailr-eval 背景

Slide 20

Slide 20 text

Shizuoka University 問題点 しかしこのSAILR, 素晴らしい一方で... DeOptimizationをコンパイラ毎に作るのか? 大変すぎる 不可逆なOptimizationはどうする 最適化手法も今後進化するのでは LLVMが頑張ってくる気がする LLVM詳しい人教えてください 大変面白いが, 実運用できない気がする 多くの言語, コンパイラで使用できる汎用的な手法が欲しい そんなものがあるのか…? 背景

Slide 21

Slide 21 text

Shizuoka University そもそも良いデコンパイルとは何か? デコンパイラの出力に関するメトリクスとして何を使えばよい? SAILR以前はgotoの数だった SAILRはCFGEDを提案した 他には...? 背景

Slide 22

Slide 22 text

Shizuoka University メトリクス 背景 Perfect Decompilation[Kevin Burk+, 22] もしくはBytecode Exact Decompilation[Schulte+,2018] 同一のコンパイラを使ったときに, (メタデータを除いて)同一の バイナリが出力されるソースコードをバイナリから復元すること

Slide 23

Slide 23 text

Shizuoka University メトリクス Decomperson[Burk+,2022] 大規模なユーザー実験(CTF)を通じて, 人間がPerfect Decmpilationを行えること Perfect Decompilationがどのように行われるか 等を示した 背景

Slide 24

Slide 24 text

Shizuoka University メトリクス 背景 Functionally Accurate Decompilation バイナリレベルで一致していなくても, 同一の機能を持っていれば よい 元のバイナリと生成されたバイナリの入力と出力が一致する. 副作用については考慮できない (e.g., Memory Mapped I/O) Decompiled Binary Original Binary Same Input Same Output

Slide 25

Slide 25 text

Shizuoka University メトリクス 背景 EMI[Le+,2014] たぶんこの発想が源流にある.

Slide 26

Slide 26 text

Shizuoka University メトリクス 背景 Human-Readable Decompilation コンパイルの操作は, 変数名などの情報を忘却させる これらの情報の探索空間は膨大であり, 復元はNP困難 構造の一意な復元も困難な問題 アセンブリから高級言語への射が一意でない できるだけ人間にとって読みやすい形式を選択したい. よりよく意味を持った表現? 操作的意味? 読みやすいプログラムとは何か → 非自明

Slide 27

Slide 27 text

Shizuoka University メトリクス 背景 メトリクスがたくさんある, なぜか 究極を言えば, バイナリの生成に使用されたソースコードそのもの が欲しい しかし, この条件は原理的に達成不能 (少なくともNP-Hard) 一番達成したい問題が解決不能なので妥協点を探している

Slide 28

Slide 28 text

Shizuoka University ベンチマーク 背景 先に挙げたメトリクスを測るためにベンチマークが欲しい 何を使う? GNU coreutils? GitHubから収集できるリポジトリ? 人手で作る?

Slide 29

Slide 29 text

Shizuoka University ベンチマーク 背景 Decompile-Bench[Tan+,2025] デコンパイラのベンチマークを測るためのベンチマーク C言語と, それをもとにgccで生成したバイナリのペア 100万関数を含む https://huggingface.co/datasets/LLM4Binary/decompile-bench

Slide 30

Slide 30 text

Shizuoka University 新しいことをやる前に デコンパイラはどう発展してきたのか 何が試され, 何が試されていないのか 代表的な古い研究を探す D.L. Brinkley. Intercomputer transportation of assembly language software through decompilation. Technical report, Naval Underwater Systems Center, October 1981. https://apps.dtic.mil/sti/tr/pdf/ADA107645.pdf 背景

Slide 31

Slide 31 text

Shizuoka University 古のデコンパイラ 背景

Slide 32

Slide 32 text

Shizuoka University 古のデコンパイラ 背景

Slide 33

Slide 33 text

Shizuoka University デコンパイラの実装 なんか80年代から主な方法は変わってないっぽい 続きの歴史を調べてもおおむね同じ 実現したいこととその方針

Slide 34

Slide 34 text

Shizuoka University 最古のデコンパイラ もっと古く...! Neliac Decompiler[Herman Englander+,1960?] Navy Electronics Laboratory International ALGOL Compiler なんか米海軍が作ってたっぽい ALGOL58派生ののNeliac言語向けデコンパイラ 命令列でパターンマッチングしていた やはりパターンマッチ 詳しくは↓に書いてあるらしい https://a.co/d/0oIQZqb 背景

Slide 35

Slide 35 text

Shizuoka University 最古のデコンパイラ もっと古く...! Neliac Decompiler Navy Electronics Laboratory International ALGOL Compiler なんか米海軍が作ってたっぽい ALGOL58派生ののNeliac言語向けデコンパイラ 詳しくは読んでないが, 命令列でパターンマッチングしてたっぽい? 詳しくは↓に書いてあるらしい https://a.co/d/0oIQZqb 背景

Slide 36

Slide 36 text

Shizuoka University 形式証明デコンパイラ 別のアスペクトから Formally Verified Decompilation 形式的証明を用いたデコンパイラ BIRD[Engel+,23] 形式的証明付きデコンパイルを実現するための汎用 IR Coqで定義される 厳密な意味的保存が目的 Haskellなどに出力できる https://zenodo.org/records/7928216 背景

Slide 37

Slide 37 text

Shizuoka University 形式証明デコンパイラ FoxDec:Formal x86-64 Decompilation 意味的同値かつ再コンパイル可能なデコンパイラ indirect branching, variadic functions, setjmp/longjmp,並行性などが対象外 惜しい.. ここでもCFGを使っている https://github.com/ssrg-vt/FoxDec 背景

Slide 38

Slide 38 text

Shizuoka University 先行研究 Evolving Exact Decompile[Schulte+,2018] Bytecode Exact Decompilationを実現する手法 巨大なデータベースと進化的アルゴリズムを使用してBytecode Exact Decompileを実現する 欠点として, 計算コストが莫大 先行研究 Big DB Compiler Has Map of Asm and C Distance Function Is Same Evolving Algorithm

Slide 39

Slide 39 text

Shizuoka University Transformer/LLMの勃興, 最新の研究 もっと新しく 機械学習技術の急速な発展 Transformer以降機械学習技術が急速に進化 機械翻訳の精度が向上 文脈に従って, 文章を生成できるように 背景

Slide 40

Slide 40 text

Shizuoka University Transformer/LLMの勃興 もっと新しく 機械学習技術の急速な発展 Transformer以降機械学習技術が急速に進化 機械翻訳の精度が向上 文脈に従って, 文章を生成できるように 背景

Slide 41

Slide 41 text

Shizuoka University 別側面からデコンパイラを見る 機械翻訳 入力はアセンブリ言語で出力はC言語 人工言語間の機械翻訳として捉えられるのでは 生成 デコンパイラはソースコードの情報を忘却するため, 原理的に 復元不能な部分がある e.g, 変数名などのラベル → 生成すればよいのでは (分類タスクから生成タスクへの転換) 出力結果の整形, 改善への応用 (Human Readable Code) 背景

Slide 42

Slide 42 text

Shizuoka University 別側面からデコンパイラを見る 機械翻訳 入力はアセンブリ言語で出力はC言語 人工言語間の機械翻訳として捉えられるのでは 生成 デコンパイラはソースコードの情報を忘却するため, 原理的に 復元不能な部分がある e.g, 変数名などのラベル → 生成すればよいのでは (分類タスクから生成タスクへの転換) 出力結果の整形, 改善への応用 (Human Readable Code) 背景

Slide 43

Slide 43 text

Shizuoka University 先行研究 DIRTY[Qibin Chen+,22] 変数名, 型, コメントの復元に注目したLLM ソースコードの構造は既存のデコンパイラのアプローチによって決定論的 に再構築できるという前提のもと, そうではない(非決定的な)部分に注力 https://github.com/CMUSTRUDEL/DIRTY 先行研究

Slide 44

Slide 44 text

Shizuoka University 先行研究 DeGPT[Peiwei Hu+, 24] 既存の(機械学習を用いていない)デコンパイラの出力をLLMで最適化する タスクを3つに分割することで, 性能を向上 レフェリー アドバイザー オペレーター https://github.com/PeiweiHu/DeGPT 先行研究

Slide 45

Slide 45 text

Shizuoka University 先行研究 LLM4Decompile[Tan+,24] LLMを用いて関数の単位でアセンブリをCに翻訳 O0でいいならかなりやれる https://github.com/albertan017/LLM4Decompile 先行研究

Slide 46

Slide 46 text

Shizuoka University 先行研究 LLM4Decompile[Tan+,24] Optimizationが入ると球に正のが下がる. どうにかしたい. 方向性としては面白かったのでちょっと延長してみる 先行研究

Slide 47

Slide 47 text

Shizuoka University 先行研究(俺) Poster: Enhancing LLM4Decompile with Obfuscated Source Code for Optimized Assembly[Saito+,2025] 学習データに難読化したソースコードを混ぜたら精度が上がった 特にOptimizedなやつ しかしなぜ... → 研究中です 先行研究

Slide 48

Slide 48 text

Shizuoka University 機械学習系研究の問題点 デコンパイラをセキュリティ用途で使う場合, とにかく精度が欲しい 100% 一方機械学習の手法でこのようなグローバルミニマムを求めるのは 難しい 99.99...% 先行研究

Slide 49

Slide 49 text

Shizuoka University 組み合わせ最適化としてのデコンパイル アセンブリも, Cも人工言語 構文的な正しさが明確に決まっている 構文的に許されるコードの数は有限 既存のコードに対して許される操作の数も有限 あるコードを元に欲しいコードへと近づけていくという操作は 組み合わせ最適化として捉えられる. 先行研究

Slide 50

Slide 50 text

Shizuoka University 先行研究(再掲) Evolving Exact Decompile[Schulte+,2018] 進化的アルゴリズム(GA)を使って, Bytecode Exact Decompilationを 達成するアプローチ Seedの生成は, データベースからの検索で行っていた. Seedとオリジナルの一致度は最大55%... さっきまでのアプローチと組み合わせたらいいのでは? 先行研究 Big DB Compiler Has Map of Asm and C Distance Function Is Same Evolving Algorithm

Slide 51

Slide 51 text

Shizuoka University 研究の今後 Recompilable Decompilation 再度コンパイル可能な出力が欲しい リバースエンジニアリングをソースコードのレイヤにリフト できるようになる 既存のソースコード向け資産を活用できるようになる Fazzer, linter, その他静的解析機... Automated Reverse Engeneeringへの活用が見込まれるのでやりたい 先行研究 Decompiler Compiler

Slide 52

Slide 52 text

Shizuoka University 研究の今後 Human Readable Decompilation より人間が理解しやすい出力が欲しい LLMの登場によって急速に発展中 e.g, DIRTY[Chen+,22] 命名, 構造体の復元, 構造の選択 など 人による解析の効率化が見込まれる 先行研究

Slide 53

Slide 53 text

Shizuoka University 研究の今後 Semantic Equivalence of Decompilation 意味的に等価な出力が欲しい より正確なデコンパイラを作る話 e.g, BIRD[Engel+,23] 形式的証明を用いる方法が模索されている 先行研究

Slide 54

Slide 54 text

Shizuoka University 研究の今後 Syntax Equivalence of Decompilation よりオリジナルに近いCFG構造化 (ソースコード) が欲しい オリジナルのソースコードにより近いデコンパイルをしたい話 e.g, SAILR[Zion+,2024] グラフの操作を頑張る グラフより上のレイヤでも戦える e.g, Evolving Exact Decompile[Schulte+,2018] 先行研究

Slide 55

Slide 55 text

Shizuoka University 最最新研究 ACM CCSのSURE (Software Understandings and Reverse Engineering) Workshop 今年初開催, 明らかにデコンパイラが主要なテーマの一つ Chairが SAILR[Zion+,2025] の主著者. Hex-Raysの人も来る https://sure-workshop.org/ 背景

Slide 56

Slide 56 text

Shizuoka University 最最新研究 SUREのAreas of Interest 背景 Decompilationが一番上 メトリクスをどうにか するための話 LLM Agentを使う 形式的デコンパイル

Slide 57

Slide 57 text

Shizuoka University 最最新研究 ACM CCSのSURE (Software Understandings and Reverse Engineering) Workshop ポスタープロポーザルが通ったので行って話を聞いてきます はたしてこのスライドで説明した認識は正しい(共通見解)なのか 背景

Slide 58

Slide 58 text

Shizuoka University おわりに 議論, 質問, 指摘, マサカリ, その他感想は以下まで @齊藤(Aチューター) Twitter: @77777kusa 背景

Slide 59

Slide 59 text

Shizuoka University 参考文献 Ghidra[NSA], https://github.com/NationalSecurityAgency/ghidra IDAPro[Hex-Rays], https://hex-rays.com/ida-pro BinaryNinja[Vector 35 Inc], https://binary.ninja Phonix[Schwartz, 2014], https://www.usenix.org/conference/usenixsecurity13/technical-sessions/presentation/schwartz DREAM[Yakdan+,2015], https://www.ndss-symposium.org/ndss2015/ndss-2015-programme/no-more- gotos-decompilation-using-pattern-independent-control-flow-structuring-and-semantics/ SAILR[Zion+,2024], https://www.usenix.org/conference/usenixsecurity24/presentation/basque Decomperson[Burk+,2022], https://www.usenix.org/conference/usenixsecurity22/presentation/burk EMI[Le+,2014], https://people.inf.ethz.ch/suz/publications/emi.pdf Decompile-Bench[Tan+,2025], https://arxiv.org/abs/2505.12668 BIRD[Engel+,23], https://dl.acm.org/doi/10.1007/978-3-031-38828-6_1 DIRTY[Qibin Chen+,22], https://www.usenix.org/conference/usenixsecurity22/presentation/chen-qibin 背景

Slide 60

Slide 60 text

Shizuoka University 参考文献 DeGPT[Peiwei Hu+, 24], https://www.ndss-symposium.org/ndss-paper/degpt-optimizing-decompiler-output-with-llm/ LLM4Decompile[Tan+,24], https://arxiv.org/abs/2403.05286 Poster: Enhancing LLM4Decompile with Obfuscated Source Code for Optimized Assembly[Saito+,2025], https://www.ndss-symposium.org/wp-content/uploads/2025-poster-51.pdf 背景