だでぃ子さんとしゅーとくんはイケメン(QEMUの話

☆はじめに
 今朝PostgreSQLの設定が終わって虚無感に襲われていた所、SFCの発表があるか伊賀るかみたいな話のときに、だでぃ子さんの発表内容しりてーなーとか思ってたらスライドくれたので読んでみました。内容はあまり言ってはいけないと思いますが、書かれていた単語にQEMUとか、仮想化?とか書かれていて、「仮想化って言っても、あまり知らねぇな〜」と思ったのでググりながら読んでみました。すると、エミュレーションとか、ゲストOSとか面白そうな単語がちらほら書かれていて、「っべーw面白そうw」ってなりましてどんどん読み漁りました。

☆内容
1.しゅーとくんの会話&だでぃ子さんのスライド
すると、イケメンしゅーとくんが


僕「QEMUだ。エミュレータでは一番イイイメージ。てか、仮想マシンエミュレータの違いってなんだ。」


僕「what's the best?」

僕「@shutingrz エミュレータって仮想マシンと同じなん? アレじゃないの、QEMUって自由度有るんじゃない?(だでぃ子さんのブログとか読んでるとそんなイメージ」

僕「@shutingrz マジか。そもそも、OSごとでCPUの使い方に相違点とかあるの? イメージできるのがカーネルのエミュレートまでかな…」

僕「@shutingrz え、え、x86 -> ARMとかってこと?(ありえなくね?」

僕「@shutingrz つまり、仮想的にx86のinstructionをARMにエミュレート(擬似)してるっちゅーことかな? けど、ARMってメモリに直接データぶっこんだりする書き方するし、エミュレートするの大変そう(KONAMI

と、僕の質問にすべて答えてくれました。最後には、だでぃ子さんから返事も来てやったぜという感じです。
しゅーとくん、だでぃ子さんありがとうございます。
好奇心旺盛のかわいいあしがるくんの素朴な質問に答えてくれて。


じゃあ、だでぃ子さんにもらったスライド読もうという話です。


QEMUは動的バイナリ変換できる。

ユーザーモードエミュレーション/ カーネルモードエミュレーションがある。
-すげぇ…。

じゃあ、そのすげぇDBTはどうやて実現してるんだって話が

・Tiny Code Translationらしいです

・ゲストのコードを逆アセンブルして、中間コードに直してホスト用に直す…
- あまり知らないけど、LLVMと何が違うの?

・unchained blockって何?

TCGにより Guest Code → Host Codeになる仕組み興奮してきた

・Translation Block
- 分岐命令やページ境界までコードを区切る…ふむ

・コードキャッシュ is 誰?

・そうそう、LLVMっぽい!

・binをLLVMにdiscompileする機能 を S2Eという。
  - そこは、 b2Lじゃないの?

・Win binをLLVM bitcodeになおす (bitcode 何?

・あ~、TCGとS2Eは違うDBTなのね。(今更

LLVM CodeでmappingするとLLVM bitcodeとやらが出てきて、
 任意のHost Code(dictonary)とmappingすると実行コード(Exec-c)が出力されると〜。
 (すばらしい)

Dagger IRとはで検索しても英語しか出てこないから、だでぃ子さんに聞いてみよう…

・あと、セマンティックギャップ って何ですか?
 - ぐぐったら、

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

http://ejje.weblio.jp/content/semantic+gap

って出てきた。

ついでに、bitcodeも調べる

LLVM bitcode

リファレンスも公開されている、LLVMメインの中間言語
静的単一代入(SSA Static single assignment)形式である。
大規模な変換(最適化)をやりやすく、低コストで解析、変換を行うことができる。その理由はuse-def連鎖と支配関係の、解析とメンテナンスが容易なため。
ASTで保持していたコンテキストが失われており、プログラミング言語のループ構文が失われている。
パターンマッチがし難い。

http://nothingcosmos.wiki.fc2.com/wiki/LLVMの中間言語

うぉお。思ったより詳しい。

そういえば、じりずの誕生日にLLVMのきつねの本買ったの読んでくれたのかな?

MachineInstr

llc内部で使われる、レジスタ割り付けや命令スケジューリング、アセンブラ変換用の中間言語
3番地および2番地コードの中間言語アセンブラに変換しやすい。
BitCodeよりも低レイヤー向けであり、1命令ごとの粒度が小さい。

LLVMバイナリコードはKLEEに投げられる

・与えられたコードをビルド。

・セマンティックギャップをQUMEが埋めた(素晴らしい)

・S2EはLLVMコンパイラとして使える(素晴らしい)

LLVMコンパイラで難読化解除できる(素晴らしい)

☆まとめ

僕「QEMUにDBTがある。DBTがある=LLVMbitcode使う。 LLVMコンパイルする=マルウェアなどの難読化を解読できる!! QEMUにDBTあってよかった!(感動」

なんというか、本質はGuest Code → Host CodeにTranslationするアルゴリズムの面白さとかだったりするのだと思うのですが、LLVMコンパイラなどを使うことにより難読化を解読できるというのは、今後、マルウェア解析にとっても非常に役に立つ存在だなと思いました
。学校の後期の研究をSVMを使ったマルウェア判別 IDS/IPSを作りたいと思っていたのですが、LLVMコンパイラおよびQEMUがあることが今後もっと研究を楽にしてくれるのではと思えました。


☆Reference

仮想化について載っていて面白かった。

http://www.atmarkit.co.jp/ait/articles/0903/12/news120.html

だでぃ子さんが書いてるブログで、動的Taint解析について書かれています。
今日は疲れたので、また読んでブログに書きたいです。

http://ntddk.hatenablog.com/entry/survey_dta