だでぃ子さんとしゅーとくんはイケメン(QEMUの話
☆はじめに
今朝PostgreSQLの設定が終わって虚無感に襲われていた所、SFCの発表があるか伊賀るかみたいな話のときに、だでぃ子さんの発表内容しりてーなーとか思ってたらスライドくれたので読んでみました。内容はあまり言ってはいけないと思いますが、書かれていた単語にQEMUとか、仮想化?とか書かれていて、「仮想化って言っても、あまり知らねぇな〜」と思ったのでググりながら読んでみました。すると、エミュレーションとか、ゲストOSとか面白そうな単語がちらほら書かれていて、「っべーw面白そうw」ってなりましてどんどん読み漁りました。
☆内容
1.しゅーとくんの会話&だでぃ子さんのスライド
すると、イケメンしゅーとくんが
リア糞OS
— しゅーと (@shutingrz) 2014, 7月 30
@ashigirl96 俺の中で一番ダメなイメージ
— しゅーと (@shutingrz) 2014, 7月 30僕「what's the best?」
@ashigirl96 qemu=>virtualboxにしたら体感3倍位早くなった
— しゅーと (@shutingrz) 2014, 7月 30僕「@shutingrz エミュレータって仮想マシンと同じなん? アレじゃないの、QEMUって自由度有るんじゃない?(だでぃ子さんのブログとか読んでるとそんなイメージ」
@ashigirl96 CPUそのものエミュレートしてるらしいから自由度は高いっぽ
— しゅーと (@shutingrz) 2014, 7月 30僕「@shutingrz マジか。そもそも、OSごとでCPUの使い方に相違点とかあるの? イメージできるのがカーネルのエミュレートまでかな…」
@ashigirl96 i386とかx86_64とかあるやん?それぞれ使い方が違う
— しゅーと (@shutingrz) 2014, 7月 30僕「@shutingrz え、え、x86 -> ARMとかってこと?(ありえなくね?」
@ashigirl96 ネットワークのカプセル化を想像してみると、IPv4データ部の中にIPv6ヘッダが入ってるようなもん
— しゅーと (@shutingrz) 2014, 7月 30僕「@shutingrz つまり、仮想的にx86のinstructionをARMにエミュレート(擬似)してるっちゅーことかな? けど、ARMってメモリに直接データぶっこんだりする書き方するし、エミュレートするの大変そう(KONAMI」
@ashigirl96 @shutingrz ご参考まで: https://t.co/Wmpmx3HlVf
— 能登だでぃ子 (@ntddk) 2014, 7月 30@ntddk @ashigirl96 アーありがとうございます あしがるの質問にビクビクしてた
— しゅーと (@shutingrz) 2014, 7月 30
と、僕の質問にすべて答えてくれました。最後には、だでぃ子さんから返事も来てやったぜという感じです。
しゅーとくん、だでぃ子さんありがとうございます。
好奇心旺盛のかわいいあしがるくんの素朴な質問に答えてくれて。
じゃあ、だでぃ子さんにもらったスライド読もうという話です。
・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メインの中間言語。
http://nothingcosmos.wiki.fc2.com/wiki/LLVMの中間言語
静的単一代入(SSA Static single assignment)形式である。
大規模な変換(最適化)をやりやすく、低コストで解析、変換を行うことができる。その理由はuse-def連鎖と支配関係の、解析とメンテナンスが容易なため。
ASTで保持していたコンテキストが失われており、プログラミング言語のループ構文が失われている。
パターンマッチがし難い。
うぉお。思ったより詳しい。
そういえば、じりずの誕生日にLLVMのきつねの本買ったの読んでくれたのかな?
MachineInstr
llc内部で使われる、レジスタ割り付けや命令スケジューリング、アセンブラ変換用の中間言語。
3番地および2番地コードの中間言語。アセンブラに変換しやすい。
BitCodeよりも低レイヤー向けであり、1命令ごとの粒度が小さい。
・与えられたコードをビルド。
・セマンティックギャップをQUMEが埋めた(素晴らしい)
☆まとめ
僕「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
今日は疲れたので、また読んでブログに書きたいです。