セキュキャンWSに行ってきたよ

こんばんは、zuvです。
セキュキャンWSに行ってきたので、ブログにしたいと思います。
因みにWSってどういう意味か分かりますか?
WSでググったら「ヴァイスシュヴァルツWeiβ Schwarz」やら「Work Station」やら出てきましたが、今回は「Work Shop」です。

講義の内容は
名称:The Anatomy of Malware 完全版
講師:中津留 勇

まず最初に感想としては、とても楽しかったですw
はい、楽しかった。それに尽きる、、というのは嘘でとても有益でした。
知識とhow toが絶妙なバランスな講義だったのでとても分かりやすかったです。
もうずっとマルウェア解析してられる、、

ブログ、、と言っても何を書けばいいんですかね。まぁ適当に書いていきます。
駄文だもんっ!

講義の流れ

・自己紹介
・事前学習の確認、IDAの機能紹介。
マルウェアのトレンド
・解析の基礎知識
・解析前の準備の知識
・やってみる

解析について

今回感じたのはWindows api の重要さです。これを探してググれば大体分かってくるんじゃ、、と素人ながら感じました。
少し前から本を参考に解析の勉強をしていたんですが、全然イメージが変わりました。
簡単、、とは言わないですがなんだかいけそうな気がするぅって気がした気がしました。
あと関数をIDAで追っていくのがとにかく楽しい。

後、最後に話されていたScreen Capture を発見しました。アドレスは401410です。
見るからにそれっぽい感じが出ていますw
sixth senceに従って追っていたら偶々見つけました。
規模が大きいマルウェアだともっと難しくなるんだろうなぁ。。
暗号化の処理とか難しい事はたくさんある、、
また色々自分でやっていきをしたいです。
ブログが寂しいので写真を貼っておきます。win api はこんな感じで表示されていきます。
f:id:zuvizudar:20180326141905p:plain

IDAメモ

IDCで特定の命令に色が付けれるよ 。
関数に自分で命名する時、aa_bot_main みたいに「aa」とかつけるとsort後に見やすい。
範囲選択->edit->others->color instruction で選択範囲に色が付けれる。 ctrl + e => entry point
g => アドレスに飛ぶ
IDAの上のバーはコードとデータの場所を表している。

その他メモ

stdcall 先で掃除 cdecell 元で掃除 レジスタ渡し 意識しろ
分岐の多いのはbotっぽい。
色々ググろう。定数とか。
com interface は抽象度高くて厳しい。。

まぁ僕のこんな無ログをみるよりこのリンク先を見た方が有益です!
セキュリティ・キャンプ全国大会2015でのマルウエア分析講義(2015-09-10)
x86アセンブリ言語に関するメモ - kira924ageの雑記帳
https://www.secureworks.jp/resources/rp-bronze-butler
呼出規約とは - 備忘録
https://www.jpcert.or.jp/present/2014/20140424ssmjp.pdf

elvm-cpuを作った話

この記事はseccamp2017 Advent Calendar 2017 - Adventarの24日目の記事です!
これまた素人記事なので間違え有ったらご指摘お願いします!

自作CPUってなんだ

まずこれです。僕はこれすら分かっていなくて苦労しました。

基本の流れ

命令を読み取る

デコードする

実行する

の繰り返しだと思います。
verilog等のハードウェア記述言語で書いていきます。
回路は勝手に生成してくれるので割とソフトウェアっぽく書くことが出来ます(感想)
最小構成は
GitHub - zuvizudar/td4
が分かりやすいと思います。(「CPUの創りかた」のTD4のverilog実装です)

デコード

f:id:zuvizudar:20171224123526p:plain (命令フォーマットの例)

読み取った命令を分解します。
(このブログ毎回分解してる気が、、w)

//td4の場合、op4bit,im4bitの構成
assign im=dout[3:0];
assign op=dout[7:4];

実行

case(op)
    4'b0000:begin
        a<=a+im; //add 
    end
   (略)
endcase

elvm-cpu

流れは掴んで貰えたでしょうか?

次は僕がセキュキャンで作ったCPUの紹介です。

その名も「elvm-cpu」!
github.com

そのまんまの命名ですね。。w

設計思想?

当初の考えとしてはc言語が動くcpuを作りたい!というものです。

アセンブリと対応する命令セットを書けば良いのかな?とか考えていました。

そんな時「ELVMというのがあるよ」と教えてもらいました。

ELVM

EsoLang Virtual Machineの略で、C言語で書かれたプログラムをELVM IRという中間形式に変換した後に、それを元に多言語にトランスパイルするものです。
GitHub - shinh/elvm: EsoLangVM Compiler Infrastructure

つまり、elvmにcpuのバックエンドを追加すれば、

c → elvm ir → elvm-cpuの命令  

と言った感じに生成されます。

バックエンドの書き方はcのバックエンドを参考にしました。(c → elvm ir → c というのもあるんです)

これの良さは命令が21種類しか無いこと、頑張ってアセンブリを命令に落とし込むコードをゴリゴリ書く必要が無くなったことです。

様子

なんということでしょう!
なんの変哲もないhello,worldコードが

int main() {
  const char* p = "Hello, world!\n";
  for (; *p; p++)
    putchar(*p);
  return 0;
}

80個のelvm-cpuの命令に大変身!?

1_00100_00000000_000_0_01001000 //mem[0b00000000]に0b1001000(=72='H')をstore!
1_00100_00000001_000_0_01100101
.
.
(略)

(命令フォーマットの詳細はgithubのREADMEに載せてます。興味があれば!)
実行!(rs232c出力)
f:id:zuvizudar:20171224234336j:plain:w400

あとがき

cpu全然分かってないのでこれから勉強していきたいです。
パタヘネ本とか読みたい、、