by shigemk2

当面は技術的なことしか書かない

QEMUのDynamic Binary Translationがあってよかったねという話 #kernelvm

QEMU

  • 伏魔殿
  • インシデントレスポンスごっこ
  • 謎のマクロ
  • C言語のくせにnewとかあるし
  • 仮想化技術について学びたい

QEMU

  • 異なるアーキテクチャのモードをサポートしている

TCGによってDBTを実現

  • ゲストのコードを逆アセ
  • 中間コードに変換
  • ホストのコードに変換
  • 実行

  • main()からcpu_exec()

実行コードをごにょごにょするのは大変

Basic Blockで切り分ける

なんかLLVMぽくない?

バイナリをLLVMに逆コンパイルするためにQEMUを研究している

semantic gapをどうするか

semantic gapの意味 - 英和辞典 Weblio辞書

高水準言語の言語要素とこれらを実現するためのコンピュータの機能構造との間には大きな隔りがあること.例えば,配列,データ型,文字列処理,手続き,ブロック構造などを取り扱うには,多数の機械語命令が必要になる.

KLEE

  • LLVMでビルド
  • テストケースを生成
  • 15年かけて書いた手動テストを89時間で達成

Symbolic execution

  • 記号実行と訳される
  • 変数に台数シンボルを与えて監視

SAT solver

DPLLアルゴリズム - Wikipedia

SMT solver 入門 - すえひろがりっっっっ!

続・今日も反省の色無し(masayangの日記): S2Eで内部記憶領域(mmcblk0)を開放

まとめ

  • LLVMbitcodeとx86にあるsemantic gapをQEMUで達成
  • OpticodeでバイナリをLLVM bitcodeに変換
  • LLVMへの逆コンパイルとsymbolic executionへの適用

  • QEMUのDBTがあってよかったね

モデルベーステスト - Wikipedia

(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) ol.className = "preLine" ol.setAttribute("role", "presentation") for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)