親ページ:マルウェア解析に必要な素養
アセンブリを読むのに慣れない者がIDA Proをいきなり使うのは時期尚早と考える。objdumpでも分かるのはどこまでか、IDA Proが気を利かせて表示してくれる情報は、PE/ELFのどこを見たものなのかということをIDAを前にして察することができるくらいに、objdumpを使い倒して欲しい。IDAを使い始めるのはその後だ。
アセンブリが初めてで、本を読んで学びたい場合は以下の本が良いと思われる。リストの下にある本ほど内容が高度である。
アセンブリというものが分かってきたら、デコンパイラを使わずにバイナリをリバーシングすることをおすすめする。題材はCTF(Capture The Flagの略。セキュリティの競技の1つ)のReversingカテゴリで出題されるような問題がやりやすい。次におすすめを示す。
分からない命令があったら公式ドキュメントを読もう。Intel CPUの命令の仕様書は以下のサイトで配布されている。この資料はバイナリアン必携と言ってもいい。その命令の引数のパターンではなく、疑似命令を覚えておくことを勧める。
Intel® 64 and IA-32 Architectures Software Developer Manuals
https://software.intel.com/en-us/articles/intel-sdm
演繹的なやり方でなく、体系的に学びたい場合、以下の資料が参考になるかもしれない。
英語が読めない、読むのにすごく時間がかかってしまうのは致命的だ。レベルを抑えた英語の本やニュースサイト(gizmodeの本家とか?)が世の中にあるのでたくさん読むといいと思う。いつそれを始めるかは問題ではないと思う。筆者は中学・高校で読まされるOxfordの"薄い本"を多読することで英語を読むことの抵抗感が薄れた感じがする。
(余談だが、大学の英語の先生曰く、英語力の高さはその人の母国語の運用能力で抑えられてしまうらしい。日本語の上達も大事ということだ。)
英語はあまり読めない場合にどうするのかを考える。
マルウェア解析の場面では以下の用語に出くわすだろう。
これらの用語は、大学の学部で「計算機ハードウェア/アーキテクチャ」と「オペレーティングシステム」というような名前の講義で出てくるものである。未履修の方には次の本を推薦する。(ただ講義の"教科書"なので初学者が独習するのは大変すぎるかもしれない。←手っ取り早いのは大学に入ることですかね)マルウェア解析の世界を堪能するために、この辺の理解を期待する。
「マルウェアが巧妙化している」と言われている通り、攻撃者はあの手この手を使います。解析する技術力(アセンブリやコードから直感を得る力など)も大事ですが、なんだかんだ全てに通ずる知性を求められます。
要求される知識・了見をレイヤー単位でレイヤーが低い順にまとめると以下のようになります。心を折るような分量ですみません。でも、それにめげず何年もかけて着実に学んでいくことをあなたに期待します。最初は、気になったレイヤーやキーワードから着手すると良いでしょう。
逆アセンブラをうまく使えるように練習を重ねるのもいいが、本やインターネットで知識をため込んでいくことも大事だ。以下におすすめ(?)の資料を紹介する。簡単な書評も付けた。もちろんOSSのソースコードも資料扱いする。
個人的におすすめな本の付き合い方は、書かれていることを覚えはしないが理解しつつ、何がどこに書かれていたのかを覚えておくとよい。たくさん読んでも苦になりにくいし、読む速度が安定するので1週間以内に読み切れる。
最後まで読めずに積読してしまう人は、1週間で読み切ることを目標にするとよいでしょう。読みきれなかったら諦めて次の本を読むのが一番です。
うまく理解できない内容に直面したら、そこを読むのに時間をかけないほうがよいです。次の章はその内容とは関係ない話のはずなので飛ばしても問題ないです。自己研鑽なのでそれをしても誰も減点しないですよ。うまく理解できなかった内容は、同じことを説明している他の人の本・記事を何本か読むと理解できたりします。あなたが理解できないのは本やブログの書き方が悪いだけなので、そこは開き直っていきましょう。
[余談](工学部生向けの)数学書は、証明を自分でし直しながら読むことはしないと理解したつもりで終わってしまいますよ。単位を取れればいいや~の気持ちでは半人前です。
【高校生・大学生の方へ】お財布事情で本を買い込むことに抵抗があるかもしれませんが、読めば値段以上の価値のある知識を得られます。ためらわず読み進めていって欲しいと思います。(人によりますが、今はIPAの未踏や、サイボウズラボユースや、ラックのすごうでなどの若者支援プログラム的なもので簡単にペイできたりしますね。)。
1週間でさくっと読んでしまう速読派は、図書館に購入申請するとよいでしょう。好意的に対応してくれるはずです。
以下のリストにはExploitに関する資料が含まれている。Exploitはマルウェアの本質(=本当にしたいこと)ではないが、感染の原理を知るために必要になる知識なので遅くならないうちに理解して欲しい。ExploitはスタックBOFでさえも初学者には難解な内容であり、ブラウザエクスプロイトでも使われるようなUAFやROPまで実践していると長い学習時間が必要になる(筆者は思い出したときに勉強したので1年くらい要した)。
資料名の前の記号の意味:* 特におすすめ(手元においておきたい or 要ブクマ)/** 必読
** The Antivirus Hacker's Handbook (Wiley) (2015/9)
* Machine Learning and Security: Protecting Systems with Data and Algorithms (O'REILLY) (2018/3)
Binary Hacks
読むと勉強になるセキュリティ関係のソフトウェアソースコードを推薦
TODO:読むと勉強になるAnti-Malware/Anti-anti-Malwareな論文
TODO: Torが分かる何か →用語解説コーナーでまとめる
TODO: DNSのセキュリティに関する本なんかないかなー?
TODO:リストがごちゃごちゃしてきたので、一軍・二軍に分けたい。
ブラウザエクスプロイトの資料も追加したい。
[閑話休題]現実世界で、脆弱性をどうエクスプロイトするのかに興味がある人は、以下の記事を読んでみるといいかもしれない。
併せて読むといいかもしれない文献リスト
How to start? | hasherezade's 1001 nights
Many people approach me asking more or less the same questions: how to start RE, how to become a malware analyst, how did I started, what materials I can recommend, etc. So, in this section I will collect some hints and useful links for the beginners.
//WARNING: this article is a work-in-progress
Awesome Malware Analysis(初出2015年;2019年現在まで更新あり)
マルウェア解析に役立つリソース集。本書の事例無し版と思って。
abbr | non-abbr |
---|---|
cf. | 関連。~を見よ。 |
see *** | ***を見よ。 |
e.g. | 例えば |
AV | アンチウイルス |
IE | Internet Explorer |
MS | Microsoft |
SPN | Substitution Permutation Network(構造)※ブロック暗号の構成法 Service Principal Name ※Kerberos認証のくだり (Trend Micro Smart Protection Network) |
Win | Windows |
VM | 仮想マシン(Virtual Machine) |
VT | VirusTotal |
アーキ | アーキテクチャ |
各CPUアーキテクチャ向けのbinutilsで入る。より便利にするやつはあるのかな?
ディスアセンブラの出力が怪しいときの確認用に大変重宝するので、 使えて当然 のツールの一つ。
読み:らだれ。
objdumpの類似としてradareがある。個人的にはradareは組み込み機器の解析によく使われている印象が強いが、CTFのwriteupで2016年頃からちらほら見かけるようになった。
高機能objdumpと言うと語弊があるかも。ファイルシステムも解析できるらしい。TUIがメインで、GUIバージョンもリリースされている。Python向けのAPIもあり、radareの操作感に慣れるとPythonからのスクリプティングに大きな価値を感じられる。
Digging into radare2 for fun and profit speaked at AVTOKYO 2017, by pancake (2017/11/11)
2017年11月にGitHubベースの日本語コミュニティーが発足した。
https://github.com/radareorg/r2jp
radareのGUI版
https://github.com/radareorg/cutter
IDAの読み方は「あいだ」「あい・でぃー・えー」のどちらでも通じる。
IDA Freeはx86(32bit)のバイナリオンリーなので有用性の壁がある。
2017/2/2 IDA Freeware 7.0 for Windows/Linux/Mac がリリース!うれしい!
- no commercial use is allowed
- lacks all features introduced in IDA > v7.0
- lacks support for many processors, file formats, debugging etc…
- comes without technical support
IDA Free v5.0のデータベースファイルの拡張子はidbで、IDA Free v7.0では同拡張子ファイルは読み込み不可の模様。
https://www.hex-rays.com/products/ida/support/download_freeware.shtml
TODO:IDA Freeware 7.0でプラグインが使えるのか?
IDA Demoは試用期間があるものの、x86_64(64bit)もOK。定期的にポップアップが出るようになっている。
逆アセンブラだけの Pro の Named License は15万円ほどなので、そんな高くない気も。ライセンスを与えるPCは1年間だけ好きに変えられるという契約らしい。研究室などではFloating Licenseで買うことになる。Decompilerまで含めるとべらぼうに高くなる。
IDAは静的解析が特にしやすい作りになっており、バイナリ解析ツールの入門としてうってつけである。IDA Proが無い方はIDA Freeだけはインストールしておくとよい。(個人的にはobjdumpとテキストエディタとgrep+lessだけでバイナリを読み進めるようにはなって欲しいとおもいます。)
2019年3月にはEducational Licenseが登場しました。今の所授業での使用を想定している使用条件ですね。
IDA: Educational licenses
The educational license supports x86, x64, ARM, and ARM64 processors. It comes with a native local debugger for Windows or Linux. Python and IDC scripts are supported. Input files up to 1MB can be analyzed.
IDA text Execution – RISCY BUSINESS (2018/2/21)
IDA 6.5でstring中のリンクを開かれる機能のフィルタリング不備により、fileプロトコルでファイルを実行できるらしい。filEとスラッシュの数がみそなのかね。
趣味レベルの解析であればそんなに悪くはないと思いますよ。ただ、構造体の解析がIDAほどできるのがない?
NSAから満を持して登場。2019年でRSAカンファレンスでお披露目した。
画面はIDAに近い。
ショートカットがIDAとだいぶ異なる。
ディスアセンブラが結構使えるのでお試しの価値あり。
貧乏人用IDAとも言われる。筆者はCTFで使っていたが、objdumpライクのUIで、これはこれで好き。グラフ表示はGraphvizっぽい表示してくれるが、スクロールせずに入る情報量が少ないので、筆者はあまり使用していない。Cライクなコードにデコンパイル可能。macOSとLinux(Ubuntu 14.04/REMnuxでは、依存パッケージのバージョンのせいでHopper v4をインストールできないので注意)向け。
プラグインをPythonで書ける。APIのマニュアルがあるにはあるが見づらい。APIは少なめだが、最低限必要な機能は揃っているので問題ない。
構造体の復元(アノテーション)機能:なし
性能と独自の中間言語(LLIL)とマルチプラットフォーム(Linux/Windows/macOS)を売りにしたデコンパイラ。有料で、一定期間後のバージョンアップにはお金がかかる形式。
グラフ表示がIDAよりも圧倒的に綺麗。グルーピング(アセンブリのブロックをひとまとめにする機能)が無いのでどっちもどっち感。
プラグインはPythonで書ける。APIのマニュアルはRead The Docsで書かれてて見やすい。API多め。
構造体に対応しており、この点はIDAライクに使える。
うーんってなるところ:
非常に高額(新車が買えるレベル)。選ばれし者にもたらされる快楽、至福、絶対的優位性。
結構良いのでは?デコンパイル画面で変数をリネーム可能。
先述のHopper。関数単位で変換することになるが、割と役立ちます。
32 bitのバイナリならそこそこ有能。64 bitの対応状況は筆者未確認。
元々はオンラインサービスで、ファイルのサイズ制限がきつかった。
https://retdec.com/decompilation/
2017年にオープンソース化した。
https://github.com/avast-tl/retdec
x64dbgにも入っているデコンパイラ。気休めにしかならん?【ろくに検証してないので鵜呑みにしないでね】
おなじみのやつ。使えて当然。CTFの問題を解きながら慣れるのがお手軽だと思う。ただ素の状態で使うのは苦行。
Ubuntu 14.04に入っているgdbがPythonに対応してないというトラップに注意(これは昔の話で今は使える可能性が微レ存)。
A hyper plugin to provide a flexible GDB GUI with the help of GEF, pwndbg or peda
ちなみに筆者はpedaを使っています。
本家にて32ビット版とx64ビット版のプレビルドが同時に配布されている。PEバイナリを動的解析可能(動かしながら解析可能)。少なくともx86dbgはCTFでは実用レベルのモダンなデバッガーで筆者のおすすめです。経験値ゼロでWindowsデバッガーを触りたいなら、x64dbgが最も良いでしょう。
// TODO: スクショ
プレビルドバイナリ:https://github.com/x64dbg/x64dbg/releases
※ベータ版的位置づけで、バージョン番号で管理というよりはスナップショットで管理されている
TODO:気が向いたら使い方動画(結月ゆかりちゃんボイス欲しいなぁ|д゚)チラッチラッ)
プラグイン:https://github.com/x64dbg/x64dbg/wiki/Plugins
便利ポイント:
32ビットのPEバイナリを動的解析できる。※64ビットPEバイナリ非対応
あの硬派な「WinDbg」がモダンなデザインに、プレビュー版が“ストア”公開へ - 窓の杜 (2017/8/29)
Windowsのプロセスのメモリダンプを取るときに必要になったりするので、なんだかんだインストールする必要がある。
FixMe:別のメモとして独立
資料:
使用例:
dt("_OBJECT_HEADER")
TODO:(今から使い始める理由が無い気もする)
https://gchq.github.io/CyberChef/
バイナリに各種処理を適用することができるツール。処理をチェーンさせることもできる。
ダウンロードしてスタンドアローンで動かすこともできる。
参考資料:
日本語では「バイナリ計装」といわれる。Binary Instrumentationは元のバイナリに対して機能を追加することをいい、追加機能として命令・コールトレース、関数書き換え、関数呼び出しのフックなどがある。
Binary Instrumentationには、Static Binary Instrumentation(SBI)とDynamic Binary Instrumentation(DBI)の2種類がある。前者は静的とある通り、バイナリに所定機能を計装したものをストレージに保存し永続化する。後者は動的とある通り、実行状態にあるバイナリに対して計装を施す。
SBIで有名なもの:
Quarkslab製。Pythonバインディングもあり便利。
計装例:
Pinはインテルの公式ソフトウェア。ホスト上でネイティブ実行するバイナリ解析フレームワークの一種(Dynamic Binary Instrumentation、略してDBIの文脈でも登場する)。対応アーキはIntel CPU限定。個人的にIntel Pinって呼んでるが、正式名はPin。ググラビリティが低い悪い名前。
Pin自体はクローズドソフトウェアのライブラリで、開発用にヘッダーファイルとAPIリファレンス(doxygen)が公開されている。Pin ToolはPinを使ったツールである。Pin ToolはC++で実装する。以下は筆者による実装例である。
K-atc/NaoPinTool: My original PinTool
Pinはマルウェア解析の話でちょこちょこ話題に上がるツールである。シンボリック実行エンジンの話でも出てくる(Mayhemとか)。動的解析系を希望する人は、まず先にPin Toolsを触っておくことをおすすめする。
計装にJavascriptを利用する異端児。
モバイルOSにも対応しており、In-memory Fuzzingを実施した例が報告されている。
andreafioraldi/frida-fuzzer: This experimetal fuzzer is meant to be used for API in-memory fuzzing.
TODO:
cf. qira
TODO: コード片の動作を確認するときに便利。IDA Proのプラグインのバックエンドとして使っているものも多い
QEMU 2.2.1ベースのマルチアーキCPUエミュレータ。QEMUではマシンの実行状態に干渉するには、gdbを叩く必要があったが、Unicornではレジスタやメモリの読み書きが用意な設計となっている。マシンコードをvmのメモリーに書き込んでから実行するので、自分がローダーにならないといけないのがネック(今後ローダーを搭載しないことも明言されている)。システムコールの発行はHookしてごにょごにょしないといけないのでがんばって。
cf. usercorn
公式のAPIリファレンスはDoxygenかinclude/unicorn/unicorn.hを見るしか無い。まだまだ発展途上のOSSなので、機能やサポートが少ないは仕方ないね。Undocumenedな動作がちょこちょこあるのでAPI呼び出しには細心の注意を払う。
↓筆者は仕方なく独特なリファレンスを書いた。
Unicorn Engine Reference - HackMD
https://remnux.org/
Ubuntu 14.04をベースにしたLinuxディストリビューションかつマルウェア解析環境。表層解析+αに特化した印象(まぁLinuxだしね)。WindowsでClamAVのセットアップするのは大変なので、これを使うと楽かも。
Googleドライブに置かれたVMイメージをダウンロードしてVirtualBoxにインポートするか、Ubuntu 14.04 (64bit)で環境構築スクリプトを実行するのどちらかを行うとREMnuxが手に入る。
普段使ってるWindowsが感染するとアカンので、別のWindowsが必要。趣味で解析する人はライセンスを買うことになる。
以下ライセンス上の注意点:
グレー:
よく分からない:
Windows 7以上のWindowsを想定した環境構築スクリプトが↑で配布されている。
実行すると解析に役立つツールがインストールされる。Chocolateyのラッパーコマンドも入るみたい。
劣化版VirusTotal(=旧式サイト):https://www.virustotal.com/ja/
バイナリとURLの検疫サイト。各位はこのサイトをブックマークに登録しておくこと。検体やWebサイトをオンラインで提出して、各アンチウイルスソフトでの検出結果を一覧できる。かなり便利。良性か悪性かどうかの投票機能もある。
検出結果だけを見て、そのアンチウイルスの検知性能は低いと決めつけるのは見当違い。実製品がそのままVTに入っているわけではないらしい。
有料版はVirusTotal Intelligence。有料版ではアップロードされたファイルが見れるので、無料版ユーザーは気をつけてね。有料版ライセンスはお高い。
2018年頃に、検体の結果ページにサンドボックス解析機能や関連項目検索機能?が追加されたので、自分の環境を汚さずに検体解析したい人はこの機能を使い倒すと良さそう。
Microsoftが配布しているSysinternals Suite(Windows用)のProcess Explorerに、実行中のプロセスをVirusTotalでチェックする機能が付いていて地味に便利。
[閑話休題]某検索エンジンが悪性のサイトであるかどうかを判断するために、VirusTotalの投票結果を当てにしていたため、いたずらにされたDown Voteのせいで、とあるまとめサイトが意図せずブロックされたことがあった。(そのサイトの名前を伏せる必要あるかな…)
[閑話休題]VirusTotalに「社外秘」のファイルが大量にアップロードされていたことが2016年に発覚した。第三者がファイルを取り寄せて開いた形跡も得られているため、アップロードするファイルには気をつけたほうがいい。セキュリティソフトには検疫機能があるのでまずそちらに目を向けてみては?(情報源:セキュリティ研究センターブログ: VirusTotalへアップロードされる機微情報)
機械学習マルウェア対策のCylance、オンライン検査のVirusTotalで利用可能に | IT Leaders (2017/7/10)
Google is your friend. わかんないことがあったらググれ。
c - '0'
で1文字のAsciiの数字を数値に変換するテクがあるのを覚えておくといいかもWindows Installer "msiexec.exe" を利用して「LokiBot」感染に誘導 | トレンドマイクロ セキュリティブログ (2017/2/19)
ひとつ言えるのは、マルウェア=Malicious Software、悪意のあるソフトウェア、だということ。
国内法では次のいずれかを満たすもの:
いわゆるコンピュータ・ウイルスに関する罪について [PDF]
法務省:情報処理の高度化等に対処するための刑法等の一部を改正する法律案
日本人マルウェア開発者インタビュー(前編) プログラムの「悪意」とは - THE ZERO/ONE
悪意の対極には善意があるはずでしょう? この当時、世の中ではマイナス・イオンなんて言葉が盛んにもてはやされていたのですが、仮にマイナス・イオンが機械から出て来るなら、プラス・イオンはどこにいったのかなと思いますよね。同様に「悪意のあるソフトウェア」があるとしたら、「善意のあるソフトウェア」も存在しないといけません。
このように、相対的な言葉の片方だけを、迷うことなく本気で使っている専門家という人たちは、頭が悪いなと思いました。自分が使っている言葉がわかってないのです。悪意のあるツールがあったとしたら、同時に存在しているはずの善意のあるツールがどこにいったのかまで、ちゃんと説明しなければいけないでしょう?
TODO
プログラムによる指令が「不正な」ものに当たるか否かは,その機能を踏まえ,社会的に許容し
得るものであるか否かという観点から判断することとなる。
『いわゆるコンピュータ・ウイルスに関する罪について』より
筆者的には、悪意とは「自分にとって都合の悪いもの」ですかねぇ…(でもこれは法律での定義に引っ張られてしまっていて本質でないかも)