teppay’s log

*について書きます

セキュキャンWS ~The Anatomy of Malware~ に参加した

はじめに

  • 3/23にセキュリティ・キャンプWSに参加してきました
  • 今回の講義は、セキュリティ・キャンプ2017全国大会で応募が殺到?した(倍率は1.5倍程度だったらしい)人気講義の完全版ということで、中津留勇さんのThe Anatomy of Malwareという講義でした。
  • 僕は2017年全国大会の修了生なのですが、僕もその講義の受講を希望して、落選したうちの一人だったので、今回参加できたのは非常に嬉しかったです。
  • 講義資料は公開できませんが、「勉強したことを公開するのはOK」 「僕がこの講義をした証を残してください(意訳)」的なことを中津留さんが言っていたので、講義で学んだことを簡単に書こうと思います。

セキュリティ・キャンプWSとは

一応、公式情報がインターネット上にない?そうなので書きます。

  • 「セキュリティ・キャンプWS」は、IPAが主催する、キャンプ修了生(全国大会、ミニキャンプ参加者)を対象に演習中心のワークショップ
  • セキュリティ・キャンプ参加した人しか参加できないというのが逆にとても良い(個人的な感想です)

学んだことメモ

講義内容としては、「The Anatomy of Malware(マルウェア解剖学)というタイトルからも分かる通り、

についての講義でした。
静的解析ということで、IDAを使って(効率的に)ゴリゴリアセンブリを読んでいく方法を教えてもらいました。
ちなみに、今回のものではありませんが、中津留さんのマルウェア解析講義に関する資料はJPCERTによって公開されており、これが今回の講義の事前学習になっていました。 セキュリティ・キャンプ全国大会2015でのマルウエア分析講義(2015-09-10)

引越しの準備で忙しいので、自分が特に印象に残っていて、すぐ使える!と思った2つのテクニックのみ挙げたいと思います。笑

色をつける!

IDAには、IDCというC言語に似たプログラムを実行する機能があり、解析のための機能(コメントをつける、エンコード・デコードするなど?)を独自で実装できます。
これを使ってアセンブリを読みやすく色をつけようということです。
今回の講義で色付けすることをおすすめされたのは、

  • jmp/call命令
  • xor命令

でした。前者は単純に関数内の遷移をわかりやすくするためですが、xorは、マルウェアによる難読化や簡単な暗号化などの処理によく使われるからだそうです。

公開された資料(セキュリティ・キャンプ全国大会2015でのマルウエア分析講義(2015-09-10))の最後にコードがのっていますが、 File > IDC Commandをクリックして、以下のコードを入力することで、jmp命令とcall命令をLight Blueにすることができます。

auto head, op;
head = NextHead(0x00000000, 0xFFFFFFFF);
while ( head != 0xFFFFFFFF ){
    op = GetMnem(head);
    if ( op == "jmp" || op == "call" )
        SetColor(head, CIC_ITEM, 0xFFFCF8);
    head = NextHead(head, 0xFFFFFFFF);
}

なぜかカラーコードはRGBではなく、BGRの順番です。
そして自分はこれを以下のように変更して、色を変えるのと、xor命令に対応させました。

auto head, op;
head = NextHead(0x00000000, 0xFFFFFFFF);
while ( head != 0xFFFFFFFF ){
    op = GetMnem(head);
    if ( op == "jmp" || op == "call" )
        SetColor(head, CIC_ITEM, 0xDDDDFF);
        
    if (op == "xor")
        SetColor(head, CIC_ITEM, 0xC9E6C8);

    head = NextHead(head, 0xFFFFFFFF);
}

調べてみると、
xor命令のうち、xor eax, eaxのようにゼロ初期化する以外の、純粋なxor?のみ色付けするようなことも出来るようなので、やってみようと思います。

ググる

APIについて

静的解析ではcallされているAPIとそれに渡される引数から関数の動作を特定していきます。
それにあたって、APIについて調べるのに一番手っ取り早いツールがGoogleというわけです。
例えば、CreateProcessというAPIcallされている場合、そのままAPI名でググれば一番上にドキュメントが、しかも日本語でヒットします。 (参考:CreateProcess - Google 検索)

とりあえずググる

さらに、静的解析をするにあたって、おそらく重要なことの1つとして、全部読まないことがあげられていました。
これは、コードを読まなくても推測が可能である部分は、読まずに済ませ、解析の速度をあげようということですが、これにもGoogleが活躍します。
例えば、コード内で("52 09 6A D5 30"から始まる)謎のバイト列を読み込んで処理を行う部分があった場合、ひとまず"52 09 6A D5 30"でググってみます。(参考: 52 09 6A D5 30 - Google 検索)
すると、これまた一番上にRijndael S-boxというAESに関連するワードがヒットします。
ここからこのバイト列を読み込んでいる部分はAESの処理をしている部分であると推測することができるわけです。

まとめ

  • 4時間の講義でしたが、すごく終わるのが早く感じました
  • ただめっちゃ頭がつかれました。。。
  • セキュキャンWSまた参加したいです