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

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

第十回カーネル/VM探検隊 発表資料

5c6358240ec94522f70cf7b0e657f58f?s=128

Yuma Kurogome

May 25, 2014
Tweet

Transcript

  1. 2.

    自己紹介 • Yuma Kurogome(@ntddk) • Keio Univ. B2 • 作ったことがあるもの

    – デバドラ, OS, VMM, EFI Application • 作ったことがないもの – CPU, GPU, ネットワーク機器 • チョトモワカラナイのにインターンでQEMUを 触ることになってしまった • ので調べた
  2. 8.

    QEMUの論文 • F. Bellard. QEMU, a fast and portable dynamic

    translator. In USENIX, 2005. – 開発者による論文 – Wikiには”QEMU is a generic and open source machine emulator and virtualizer.”とあり、 – 今でこそQEMUはKVMの一部になっているが、 – そもそもVT-xを云々というよりdynamic translator としての側面が大きい[要出典] • DBTがQEMUの肝[要出典]
  3. 9.

    Tiny Code Generatorの概略 • Tiny Code Generator(TCG)によってDBT を実現 • ゲストのコードを逆アセンブル

    • 中間コードに変換 • 中間コードをホストのコードに 変換 Vitaly Chipounov and George Candea. Dynamically Translating x86 to LLVM using QEMU. In EPFL, 2010.
  4. 11.

    TCG Guest Code TCG Operations Host Code gen_intermediate_code() tcg_gen_code() •

    target-[architecture] /translate.c • tcg/tcg.c QEMU Internals
  5. 12.

    TCG Guest Code TCG Operations Host Code gen_intermediate_code() tcg_gen_code() push

    %ebp mov %esp,%ebp not %eax add %eax,%edx mov %edx,%eax xor $0x55555555,%eax pop %ebp ret QEMU Internals
  6. 13.

    TCG Guest Code TCG Operations Host Code gen_intermediate_code() tcg_gen_code() ld_i32

    tmp2,env,$0x10 qemu_ld32u tmp0,tmp2,$0xffffffff ld_i32 tmp4,env,$0x10 movi_i32 tmp14,$0x4 add_i32 tmp4,tmp4,tmp14 st_i32 tmp4,env,$0x10 st_i32 tmp0,env,$0x20 movi_i32 cc_op,$0x18 exit_tb $0x0 QEMU Internals
  7. 14.

    TCG Guest Code TCG Operations Host Code gen_intermediate_code() tcg_gen_code() mov

    0x10(%ebp),%eax mov 0x10(%ebp),%edx mov (%ecx),%eax mov %eax,%ecx add $0x4,%edx mov %edx,0x10(%ebp) mov %eax,0x20(%ebp) mov $0x18,%eax mov %eax,0x30(%ebp) xor %eax,%eax jmp 0xba0db428 (retのみ) QEMU Internals
  8. 15.

    TCG • Translation Block(TB) – translate-all.hで定義されたBasic Block – 分岐命令かページの境界まででコードを区切る •

    コードキャッシュからreturnしていると遅くな るため、TBを繋げて実行 • なんかLLVMっぽくないですか?
  9. 21.
  10. 22.

    SAT solver • ブール式の充足可能性問題を解くプログラム • 式は連言標準形(CNF)で与えられる ( a1 or !a2

    or a3 ... or an) and ( b1 or b2 or !b3 ... or !bn) and … – リテラル: a1や!a2といった命題変数またはその否定 – 節: 複数のリテラルの選言(or) – CNF式: 複数の節の連言(and)
  11. 24.

    KLEEのSAT solver • KLEEはSTPを使用 – 前身のEXE[CCS06]のために開発された – 厳密にはSAT solverの上位版であるSMT solver

    • SMT solver – ブール式に加えて「背景理論」をサポートす • 配列 • ビットベクトル • etc …
  12. 25.

    S2Eにおけるsymbolic execution • Q. バイナリを直接symbolic executionすれば良 いのでは? • A. x86はSSAでないのでレジスタがコンフリク

    トを起こすかも mov esi, 0x13 mov edx, 0x2014 mov esi, 0x13 … mov esi, 0x2014 (esi == 0x13) and (edx == 0x2014) (esi == 0x13) and (esi == 0x2014)
  13. 28.

    OptiCode • バイナリをLLVM bitcodeに変換 – QEMUを用いたのかどうかは不明 • LLVMの最適化パスによって難読化を除去 – レジスタに無意味な値を挿入する難読化

    • -dse, -simplifycfg – NOPと等価の命令を挿入する難読化 • -constprop, -instcombine – レジスタへの代入をばらけさせる難読化 • -instcombine – etc …