マルウェア解析に必要な素養~導入編~
====
:::success
親ページ:[マルウェア解析に必要な素養](https://hackmd.io/s/S1kLEr5x#)
:::
まずアセンブリ(正確にはELF/PEバイナリ)と英語を読めるようになろう
----
アセンブリを読むのに慣れない者がIDA Proをいきなり使うのは時期尚早と考える。objdumpでも分かるのはどこまでか、IDA Proが気を利かせて表示してくれる情報は、PE/ELFのどこを見たものなのかということをIDAを前にして察することができるくらいに、objdumpを使い倒して欲しい。IDAを使い始めるのはその後だ。
アセンブリが初めてで、本を読んで学びたい場合は以下の本が良いと思われる。リストの下にある本ほど内容が高度である。
* 『セキュリティコンテストチャレンジブック CTFで学ぼう!情報を守るための戦い方』
* 表面的にしか扱わない。CPUの命令の意味は分かるが、CPUアーキテクチャを理解することは難しそう。
* 『自作エミュレータで学ぶx86アーキテクチャ』
* x86を扱う。
* x64はx86とはだいぶ違うので注意。
* 『コンピュータの構成と設計 第5版 上』
* MIPSベースにCPUを含めたコンピュータのアーキテクチャを解説。
* 時間があればこの本でしっかり学ぶとGood
* 大学の情報系の専門科目で使われる本。通称パタヘネ。
* "[Intel® 64 and IA-32 Architectures Software Developer Manuals](https://software.intel.com/en-us/articles/intel-sdm)"
* Intel CPUの解説書の総本山。通称SDM。
* Vol. 1~3まである。筆者はCPUの命令を解説したVol. 2しか参照していない。
アセンブリというものが分かってきたら、デコンパイラを使わずにバイナリをリバーシングすることをおすすめする。題材はCTF(Capture The Flagの略。セキュリティの競技の1つ)のReversingカテゴリで出題されるような問題がやりやすい。次におすすめを示す。
* https://ctf.lse.epita.fr/ex/ (Crackme)
* http://reversing.kr/challenge.php
分からない命令があったら公式ドキュメントを読もう。Intel CPUの命令の仕様書は以下のサイトで配布されている。この資料はバイナリアン必携と言ってもいい。その命令の引数のパターンではなく、疑似命令を覚えておくことを勧める。
Intel® 64 and IA-32 Architectures Software Developer Manuals
https://software.intel.com/en-us/articles/intel-sdm
演繹的なやり方でなく、体系的に学びたい場合、以下の資料が参考になるかもしれない。
* ["Reverse Engineering for Beginners" free book](https://beginners.re/)
* [RE for Beginners | Reverse Engineering](https://www.begin.re/)
英語が読めない、読むのにすごく時間がかかってしまうのは致命的だ。レベルを抑えた英語の本やニュースサイト(gizmodeの本家とか?)が世の中にあるのでたくさん読むといいと思う。いつそれを始めるかは問題ではないと思う。筆者は中学・高校で読まされるOxfordの"薄い本"を多読することで英語を読むことの抵抗感が薄れた感じがする。
(余談だが、大学の英語の先生曰く、英語力の高さはその人の母国語の運用能力で抑えられてしまうらしい。日本語の上達も大事ということだ。)
英語はあまり読めない場合にどうするのかを考える。
* 案1)ツールに頼る
* [私たちはどうして公式ドキュメントが読めないのか? - Qiita](https://qiita.com/hiraike32/items/f0a211cceb0ecc516b6c#%E5%8E%9F%E5%9B%A02-%E8%8B%B1%E8%AA%9E%E3%81%8C%E8%AA%AD%E3%82%81%E3%81%AA%E3%81%84) (2019/2/19)
計算機アーキテクチャとOSの仕組みを知ろう
----
マルウェア解析の場面では以下の用語に出くわすだろう。
* カーネルモード、ユーザーモード
* ハイパーバイザー、モニター
* システムコール(syscall)
* コンパイル
* 動的リンクライブラリ(DLL)
* ローダー
* ヒープ領域、スタック領域
* 仮想アドレス、実アドレス ※PEの話ではない
これらの用語は、大学の学部で「計算機ハードウェア/アーキテクチャ」と「オペレーティングシステム」というような名前の講義で出てくるものである。未履修の方には次の本を推薦する。(ただ講義の"教科書"なので初学者が独習するのは大変すぎるかもしれない。←手っ取り早いのは大学に入ることですかね)マルウェア解析の世界を堪能するために、この辺の理解を期待する。
* コンピュータの構成と設計 第5版 上/下
* 大学の単位6単位相当のボリューム
* 前時代的な内容が出てくるが、基本的に網羅的に書かれている良い本
* [オぺレーティングシステム (IT Text) ](https://www.amazon.co.jp//dp/4274132501/)
* 小さくて薄い教科書だが、内容がしっかり詰まっている良書
* 大学の単位2単位相当のボリューム
マルウェア解析には非常に広範な深い知識が必要
----
「マルウェアが巧妙化している」と言われている通り、攻撃者はあの手この手を使います。解析する技術力(アセンブリやコードから直感を得る力など)も大事ですが、なんだかんだ全てに通ずる知性を求められます。
要求される知識・了見をレイヤー単位でレイヤーが低い順にまとめると以下のようになります。心を折るような分量ですみません。でも、それにめげず何年もかけて着実に学んでいくことをあなたに期待します。最初は、気になったレイヤーやキーワードから着手すると良いでしょう。
* CPU
* Intel x86/x86_64, ARM Cortex-A/M*, MIPS, ...
* 命令セット
* アセンブリ
* ファームウェア
* ブートローダー
* BIOS, UEFI
* ブートシーケンス
* ハイパーバイザー
* QEMU、Xenなど
* ファイルシステム
* FAT, NTFS
* プログラミング言語
* C、C++、JavaScript、PHP、PowerShell、VBScript、C#など
* 残念ながらポインタと構造体の理解が必須
* Pythonは解析ツールを書くときに必要になる。Pythonは、セキュリティエンジニアや研究者の間では共通言語と化している
* 暗号
* ブロック暗号(DES、AESなど)、ストリーム暗号(RC4など)、換字式暗号(ROT-nなど)、xor暗号
* エンコード
* Base64など
* 文字コード
* UTF-8、Unicode、BOM、Shift-JISなど
* ファイルフォーマット
* マジックナンバー
* 実行可能ファイル(ELF、PE、Mach-O)、画像ファイル(PNG、JPEGなど)、アーカイブ(zipなど)
* apkの中身を知っていますか?
* OS
* Windows, macOS, Linux, Android, iOS
* 各OSのAPIやシステムコールを把握していますか?
* Windowsだと特に
* レジストリ、WMI, COM, .NET Framework
* ネットワーク
* ネットワークプロトコル:TCP, UDP, IPv4/IPv6, SMB, DNS, HTTP, HTTPS, IMAP/SMTP, (IPoE), ...
* ネットワークサービス:ネットワークストレージ(Share Pointなど), Active Directory, …
* 仮想ネットワーク;VLAN、VPN
* 匿名化技術:Tor
* Webアプリケーション
* 攻撃先、攻撃サイトとして有望
* C2サーバーもWebアプリケーションを動かしてたりする
* Webアプリケーションがどのように作られているか知っていますか?
* WebフレームワークやCMS:Struts, Drupal, Wordpress
* クラウドサービス
* AWS, Azure, GCP, DigitalOcean, ...
* 法律
* 「知らなかった」は全く通用しない
* やっていることがグレーだったりするので注意
* 試しやすい攻撃方法をオープンな場所に書いたり、それをツール化して公開したりすると警察沙汰になりやすいのでお互い注意
* 不正アクセス禁止法、セキュリティ対策を目的とするリバースエンジニアリング合法化に向けた著作権法改正内容(2019年1月改正予定)は要チェック
* 倫理
* 攻撃自体は法律で禁止されていない。攻撃を試すときは「自分の所有物」またはそれが許可されたリソースに対して行うこと。これを絶対に守ること
* 人に迷惑をかける能力の発揮は、表の世界では一ミリも評価されません。逆に、使い所を間違えなければ人を幸せにすることができます。くれぐれも深淵に飲み込まれぬよう。
本やインターネットとうまく接しよう
----
逆アセンブラをうまく使えるように練習を重ねるのもいいが、本やインターネットで知識をため込んでいくことも大事だ。以下におすすめ(?)の資料を紹介する。簡単な書評も付けた。もちろんOSSのソースコードも資料扱いする。
個人的におすすめな本の付き合い方は、書かれていることを覚えはしないが理解しつつ、何がどこに書かれていたのかを覚えておくとよい。たくさん読んでも苦になりにくいし、読む速度が安定するので1週間以内に読み切れる。
最後まで読めずに積読してしまう人は、1週間で読み切ることを目標にするとよいでしょう。読みきれなかったら諦めて次の本を読むのが一番です。
うまく理解できない内容に直面したら、そこを読むのに時間をかけないほうがよいです。次の章はその内容とは関係ない話のはずなので飛ばしても問題ないです。自己研鑽なのでそれをしても誰も減点しないですよ。うまく理解できなかった内容は、同じことを説明している他の人の本・記事を何本か読むと理解できたりします。あなたが理解できないのは本やブログの書き方が悪いだけなので、そこは開き直っていきましょう。
[余談](工学部生向けの)数学書は、証明を自分でし直しながら読むことはしないと理解したつもりで終わってしまいますよ。単位を取れればいいや~の気持ちでは半人前です。
【高校生・大学生の方へ】お財布事情で本を買い込むことに抵抗があるかもしれませんが、読めば値段以上の価値のある知識を得られます。ためらわず読み進めていって欲しいと思います。(人によりますが、今はIPAの未踏や、サイボウズラボユースや、ラックのすごうでなどの若者支援プログラム的なもので簡単にペイできたりしますね。)。
1週間でさくっと読んでしまう速読派は、図書館に購入申請するとよいでしょう。好意的に対応してくれるはずです。
以下のリストにはExploitに関する資料が含まれている。Exploitはマルウェアの本質(=本当にしたいこと)ではないが、感染の原理を知るために必要になる知識なので遅くならないうちに理解して欲しい。ExploitはスタックBOFでさえも初学者には難解な内容であり、ブラウザエクスプロイトでも使われるようなUAFやROPまで実践していると長い学習時間が必要になる(筆者は思い出したときに勉強したので1年くらい要した)。
__資料名の前の記号の意味__:\* 特におすすめ(手元においておきたい or 要ブクマ)/\*\* 必読
### Baby
* [最短距離でマルウェア解析職人になる方法 - @IT](http://www.atmarkit.co.jp/fsecurity/column/ueno/61.html)
* セキュリティコンテストチャレンジブック CTFで学ぼう!情報を守るための戦い方
* Exploitの触りとして十分
* [CTFのだいたいジャンルはバイナリ解析らしい](https://twitter.com/oudon8101/status/649191923513626624)(あながち間違っていない)
* [技術基礎研修「クックパッドを支える仕組み」 / Introduction to the Internet - Speaker Deck](https://speakerdeck.com/osa/introduction-to-the-internet) (2018/5/9)
* ノンエンジニア向け。コンピュータからWebの仕組みまで
### Easy
* 『[サイバー攻撃 ネット世界の裏側で起きていること](https://www.amazon.co.jp/dp/406502045X)』 (中島明日香;2018/1)
* \* 『たのしいバイナリの歩き方』
* Exploitの説明が遠回しな感じがしたので「セキュリティコンテストチャレンジブック(以下略」を併読すると良さそう。アセンブリの知識はさほど必要でない。
* 第5章の「ツールを駆使してより深い世界へ」が他の本にない内容で自分好み
* \* [セキュア・プログラミング講座 > C/C\+\+言語編 > 総論 > C/C\+\+がもたらす問題](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/clanguage.html) の「著名な脆弱性対策」
* ○○脆弱性って何?となった時にここを見ると大体載っていたりする。説明が分かりやすく、例も載っている。初心者はここを一通り読んでおくことを求める。
* \*\* 『実践Metasploit』
* Metasploitについては[別章](#metasploit)を参照
* Metasploitはクセが強いソフトウェアなので、本で紹介されているコマンドを逐一試すことをおすすめする。
* マルウェアとは直接関係がないツールだが、マルウェアに関わらないセキュリティ従事者も知ってて損はない
* 本を買うのが億劫な人には、\*\* [Arch LinuxのWiki](https://wiki.archlinux.jp/index.php/Metasploit_Framework) が超おすすめ。筆者が知る限り、オンライン資料の中で最も入門を助けてくれる。
* \* [Ransomware - Defending Against Digital Extortion](http://shop.oreilly.com/product/0636920054290.do) (2016/11; O'Reilly Media)
* これから初めてランサムウェアに触れるよって人は、いろんな解析記事を読む前に読んだほうがいいかも。典型的な動きとか対策時の注意点が書かれている。
* 聞きなれない単語が多くて少し難しく感じる(※個人の感想です)。第1章はポエム気味。
* \*\* 『マスタリングTCP/IP』シリーズ
* 基礎編・応用編の内容は知っていたほうがよい
* 情報系の学部でもここまで教えないので、さっさと読んだほうが得かも?
* 元ネタはRFCなので実は購入する必要性がない
* [Mastering Reverse Engineering](https://www.packtpub.com/networking-and-servers/mastering-reverse-engineering) (2018/10)
* リバーシング入門者のための本。初級レベル。Linux, Windowsをカバーする。パッカー、難読化、他のファイル形式(MS Officeマクロ、PDF、SWF)の解析もカバー。
### Medium Easy
* \*\* Practical Malware Analysis
* 「リバースエンジニアリングバイブル」を先に読むと復習として読める。内容の重複は多いように見えるが、本書はWindowsのInternalに少し触れているので学びはある。セキュリティ系の研究室で、学部4年生の輪講で使用されることもある。Easy〜Medium Easyといった難易度。
* \*\* Learning Malware Analysis (2018/6)
* マルウェア解析者の教科書的な立ち位置。本書とコンセプトが近い。
* IDAやx64dbgの使い方、メモリフォレンジックも解説。
* \* [Practical Binary Analysis](https://nostarch.com/binaryanalysis)(2018/12)
* 目次を見て。トピックがナウくて良い。
* バイナリ解析を頑張りたい人はこの本の内容は把握しておきたいところ
* 『Haking: 美しき策謀(第二版)』
* 書式文字列攻撃(Format String Bug;FSB)にも重点を置いている
* FSBは「[fsbの資料](https://gist.github.com/hhc0null/08c43983b4551f506722)」をはじめとする他の資料でよく説明されており、必ずしも先んじて読むべき本とはいえない
* 攻撃を検知されないための工夫にもかなりのページ数を割いている
* 『[サイバーセキュリティプログラミング――Pythonで学ぶハッカーの思考](http://www.oreilly.co.jp/books/9784873117317/)』
* タイトルが本書の内容をかけ離れている印象(←日本での出版の都合でそうなったらしい)。付け直すならば「マルウェア開発に役立つ技術とPythonによる実装」かな
* 付録は日本語版のオリジナルで、原書Black Hat Pythonにはない。お得感が半端ない
* マルウェアがおこなう攻撃の要素技術がPythonで実装されている
* 本でされている実装は単純であり、必読ではない。マルウェアの仕組みを理解していればわざわざ読むものでもない気がする。
* サンドボックス検知の初心者には付録Bの「さまざまなサンドボックス検知」は興味深い内容で面白い。付録目当てで買ってもよいくらいである。実のところ、筆者はこの章を一番楽しみにしていた。
* \* [slide shareに上がっているbataさんの資料](http://www.slideshare.net/bata_24/)
* マルウェアでも用いられるExploitの手法の図解があり分かりやすい
* 時間があれば題材になっているCTFのpwn問題を解くと理解が進む
* ガチャピン先生の[\*\* malloc動画](https://www.youtube.com/watch?v=0-vWT-t0UHg)も見よう
* [urandom vol.1](http://urandom-ctf.github.io/post/c89-digital-book/)
* 日本語同人誌
* IDA ProのPythonプラグインの作成方法の言及あり
* TODO:IDAの節に移動
* \*\* [ももいろテクノロジー(ももテク)](http://inaz2.hatenablog.com/)
* 基本的なExploit手法を丁寧に試している。
* お勉強用というよりは、わからなくなったときのリファレンスとして読むとよい。
* \* [アナライジング・マルウェア](https://www.oreilly.co.jp/books/9784873114552/)(初版2010年)
* 翻訳本と見せかけて日本発の本。フリーツールでマルウェアを解析してみた、という内容。
* 32ビット時代の本なので、64ビットが主流の今どうすればよいのかという疑問には答えてくれないので注意
* [ブラウザハック](https://www.amazon.co.jp/dp/479814343X/)
* 不正通信の話あり
* \*\* [体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践](https://www.amazon.co.jp/dp/4797393165/) (2018年;通称、徳丸本)
* Webマルウェアと関連がある内容。マルウェアの感染原理(攻撃ベクター)の理解のために、ここに書かれていることは知っていることを求める
### Medium Hard
* \*\* リバースエンジニアリングバイブル
* 本当にReversingに特化した内容。文章が少し読みづらく感じたのは筆者の実力不足?(読み通すのに一週間かかってしまった)
* Anti-Debuggerやパッカーに関する記述もある。バイナリ初心者は必読
* [Return-oriented programming以後 | 一生あとで読んでろ](http://ntddk.github.io/2014/09/11/after-rop/)
* エクスプロイトの話。分かっている人向け
* The Art of Memory Forensics
* マルウェア感染したマシンのメモリダンプを効率的に解析するためのノウハウを書き溜めた本
* 量が多いのでvolatilityとWinDbgの逆引きとして使うと良さげ
* volatilityはかなり独特な操作感なので、一度動かしてみた後に読み進めると理解しやすい
* \* [Windows Internals, Part 1 (7th Edition)](https://www.amazon.co.jp/dp/0735684189) (2017/5)
* 日本語訳版:[インサイドWindows 第7版 上](https://www.amazon.co.jp/dp/4822253570/)(2018/4)
* Windows 10の話題は少なめ?(WSLは軽くしか書かれてない)
* Microsoft Press Storeで買うとPDF版が手に入る
* WSL→[Windows Subsystem for Linux Internals // Speaker Deck](https://speakerdeck.com/ntddk/windows-subsystem-for-linux-internals) (2016/10/8)
* \*\* [Windows Internals, Part 2 (7th Edition)](https://www.amazon.co.jp/dp/0135462401) (2019/12予定)
*
### Hard
* [phrack](http://phrack.org/)
* 2017年3月31日、FBIにサイトを遮断される事件が発生したが、しれっと同年5月に新しいIssueが発行された。2012年ぶり。
* [インシデントレスポンス 第3版](https://www.amazon.co.jp/dp/4822279871/) (2016/4)
* ガチで分厚くて項目が豊富。もはや辞典。
### 読んでいないため判定不能
* [Resource: Malware analysis - learning How To Reverse Malware: A collection of guides and tools by Claus Cramon Houmann - network, windows, malicious](https://www.peerlyst.com/posts/resource-learning-how-to-reverse-malware-a-guide)
* パット見、本記事と同じコンセプトの英語資料まとめ
* [Malware Data Science | No Starch Press](https://nostarch.com/malwaredatascience)(2018/9)
* \*\* [The Antivirus Hacker's Handbook (Wiley)](http://as.wiley.com/WileyCDA/WileyTitle/productCd-1119028752.html) (2015/9)
* \* [Machine Learning and Security: Protecting Systems with Data and Algorithms (O'REILLY)](https://mlsec.net/) (2018/3)
* [C/C++ セキュアコーディング 第2版](https://www.jpcert.or.jp/securecoding_book_2nd.html)
* Binary Hacks
* 読むと勉強になるセキュリティ関係のソフトウェアソースコードを推薦
* [YARA](http://virustotal.github.io/yara/)
* ファイルの特徴をルールベースで検出するOSSソフトウェア
* ルールファイルの文法定義ファイル(yファイル)は読むには地獄です。
* libyara/modulesの中のコードを読むのがおすすめです。かなり読みやすい部類のコードです。
* [ClamAV](https://github.com/vrtadmin/clamav-devel) - OSSのパターンファイルベースのマルウェア検知ソフト(精度がよろしくないように見える)。YARAルールでシグネチャを自作できるので勉強用としていいかも(詳細は『たのしいバイナリの歩き方』を参照されたし)。ドキュメントが充実している
* ヒューリスティック検出もしてるっぽい?(検出名から判断)
* **TODO**:読むと勉強になるAnti-Malware/Anti-anti-Malwareな論文
* **TODO**: Torが分かる何か →用語解説コーナーでまとめる
* ~~[未知ウイルス検出技術に関する調査(2004年;IPA)](https://www.ipa.go.jp/security/fy15/reports/uvd/documents/uvd_report.pdf)~~
* **TODO**: DNSのセキュリティに関する本なんかないかなー?
* DNSSECをキーワードに探すと見つかる?
* **TODO**:リストがごちゃごちゃしてきたので、一軍・二軍に分けたい。
* ブラウザエクスプロイトの資料も追加したい。
- - -
[閑話休題]現実世界で、脆弱性をどうエクスプロイトするのかに興味がある人は、以下の記事を読んでみるといいかもしれない。
* [[CRITICAL ALERT] CVE-2018-4990 Acrobat Reader DC Double-Free Vulnerability](http://blog.morphisec.com/critical-alert-cve-2018-4990-acrobat-reader-dc-double-free-vulnerability) (2018/6/18)
* キーワード:UAF、ROP
* 頑張って読まないと理解できない(Medium Hard~)
* [Exim Off-by-one RCE: Exploiting CVE-2018-6789 with Fully Mitigations Bypassing | DEVCORE](https://devco.re/blog/2018/03/06/exim-off-by-one-RCE-exploiting-CVE-2018-6789-en/) (2018/3/6)
* キーワード:Off-by-one Error
* 頑張って読まないと理解できない(Medium Hard~)
### Further Reading
併せて読むといいかもしれない文献リスト
[How to start? | hasherezade's 1001 nights](https://hshrzd.wordpress.com/how-to-start/)
> 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](https://github.com/rshipp/awesome-malware-analysis)(初出2015年;2019年現在まで更新あり)
マルウェア解析に役立つリソース集。本書の事例無し版と思って。
略語リスト
----
abbr|non-abbr
:-:|:-:
cf. | 関連。~を見よ。
see \*\*\* | \*\*\*を見よ。
e.g. | 例えば
AV|アンチウイルス
IE|Internet Explorer
MS|Microsoft
SPN|Substitution Permutation Network(構造)※ブロック暗号の構成法<br/>Service Principal Name ※Kerberos認証のくだり<br/>(Trend Micro Smart Protection Network)
Win|Windows
VM|仮想マシン(Virtual Machine)
VT|VirusTotal
アーキ|アーキテクチャ
バイナリ解析環境を整えよう
----
### objdump
各CPUアーキテクチャ向けのbinutilsで入る。より便利にするやつはあるのかな?
ディスアセンブラの出力が怪しいときの確認用に大変重宝するので、 __使えて当然__ のツールの一つ。
#### cf. radare2
読み:[らだれ](https://twitter.com/radareorg/status/936257744071426048)。
objdumpの類似として[radare](http://www.radare.org/)がある。個人的にはradareは組み込み機器の解析によく使われている印象が強いが、CTFのwriteupで2016年頃からちらほら見かけるようになった。
高機能objdumpと言うと語弊があるかも。ファイルシステムも解析できるらしい。TUIがメインで、GUIバージョンもリリースされている。Python向けのAPIもあり、radareの操作感に慣れるとPythonからのスクリプティングに大きな価値を感じられる。
[Digging into radare2 for fun and profit](http://radare.org/get/r2avtokyo-en.pdf) speaked at AVTOKYO 2017, by pancake (2017/11/11)
2017年11月にGitHubベースの日本語コミュニティーが発足した。
https://github.com/radareorg/r2jp
##### Cutter
radareのGUI版
https://github.com/radareorg/cutter
### IDA Pro
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](https://www.hex-rays.com/products/ida/educ.shtml)
> 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の脆弱性攻撃
[IDA text Execution – RISCY BUSINESS](http://riscy.business/2018/02/ida-remote-execution/) (2018/2/21)
IDA 6.5でstring中のリンクを開かれる機能のフィルタリング不備により、fileプロトコルでファイルを実行できるらしい。filEとスラッシュの数がみそなのかね。
### IDAもどきたち
趣味レベルの解析であればそんなに悪くはないと思いますよ。ただ、構造体の解析がIDAほどできるのがない?
#### Ghidra(無償)
https://ghidra-sre.org/
NSAから満を持して登場。2019年でRSAカンファレンスでお披露目した。
画面はIDAに近い。
ショートカットがIDAとだいぶ異なる。
ディスアセンブラが結構使えるのでお試しの価値あり。
##### 参考資料
* [Ghidra Pro Book](https://booth.pm/ja/items/1575255) by Allsafe (2019/9)
* Ghidraの使い方から実際のマルウェアの解析例までカバー
* Online Courses: http://ghidra.re/online-courses/
* [Ghidra Tutorial + CTF・脆弱性診断 超入門 Reversing① - 株式会社Ninjastars 技術研究部](https://www.ninjastars-net.com/entry/2019/03/07/210000) (2019/3/7)
* 1から5までのシリーズ(2019/04/30現在)
* [Reversing WannaCry Part 1 - Finding the killswitch and unpacking the malware in #Ghidra - YouTube](https://www.youtube.com/watch?v=Sv8yu12y5zM&app=desktop) (2019/3/27)
##### プラグイン
* [Ghidra Plugin Development for Vulnerability Research - Part-1 — Somerset Recon](https://www.somersetrecon.com/blog/2019/ghidra-plugin-development-for-vulnerability-research-part-1) (2019/4/5)
* [Talos Blog || Cisco Talos Intelligence Group - Comprehensive Threat Intelligence: GhIDA: Ghidra decompiler for IDA Pro](https://blog.talosintelligence.com/2019/09/ghida.html?m=1)(2019/09/05)
* Ghidraのデコンパイル機能をIDA Pluginとして利用できる
#### Hopper Disassembler(有償)
https://www.hopperapp.com/
貧乏人用IDAとも言われる。筆者はCTFで使っていたが、objdumpライクのUIで、これはこれで好き。グラフ表示はGraphvizっぽい表示してくれるが、スクロールせずに入る情報量が少ないので、筆者はあまり使用していない。Cライクなコードにデコンパイル可能。macOSとLinux(Ubuntu 14.04/REMnuxでは、依存パッケージのバージョンのせいでHopper v4をインストールできないので注意)向け。
プラグインをPythonで書ける。APIのマニュアルがあるにはあるが見づらい。APIは少なめだが、最低限必要な機能は揃っているので問題ない。
構造体の復元(アノテーション)機能:なし
#### Binary Ninja(有償)
https://binary.ninja/
性能と独自の中間言語(LLIL)とマルチプラットフォーム(Linux/Windows/macOS)を売りにしたデコンパイラ。有料で、一定期間後のバージョンアップにはお金がかかる形式。
グラフ表示がIDAよりも圧倒的に綺麗。グルーピング(アセンブリのブロックをひとまとめにする機能)が無いのでどっちもどっち感。
プラグインはPythonで書ける。APIのマニュアルはRead The Docsで書かれてて見やすい。API多め。
構造体に対応しており、この点はIDAライクに使える。
うーんってなるところ:
* スタック変数のリネームが出来ないっぽい
### デコンパイラ
#### 神:IDA Pro(有償)
非常に高額(新車が買えるレベル)。選ばれし者にもたらされる快楽、至福、絶対的優位性。
#### 使える:Ghidra(無償)
結構良いのでは?デコンパイル画面で変数をリネーム可能。
#### 割と使える:Hopper(有償)
先述のHopper。関数単位で変換することになるが、割と役立ちます。
#### ぼちぼち:RetDec(無償)
32 bitのバイナリならそこそこ有能。64 bitの対応状況は筆者未確認。
元々はオンラインサービスで、ファイルのサイズ制限がきつかった。
https://retdec.com/decompilation/
2017年にオープンソース化した。
https://github.com/avast-tl/retdec
#### 気休め?:snowman(無償)
https://derevenets.com/
x64dbgにも入っているデコンパイラ。気休めにしかならん?【ろくに検証してないので鵜呑みにしないでね】
#### 未検証
* radare系のデコンパイラ
* https://github.com/radareorg/radeco-lib
### デバッガー
#### gdb
おなじみのやつ。__使えて当然__。CTFの問題を解きながら慣れるのがお手軽だと思う。ただ素の状態で使うのは苦行。
##### 便利なgdbの補助スクリプト
Ubuntu 14.04に入っているgdbがPythonに対応してないというトラップに注意(これは昔の話で今は使える可能性が微レ存)。
* gdb-peda
* gef
* hyperpwn
* https://github.com/bet4it/hyperpwn
* > A hyper plugin to provide a flexible GDB GUI with the help of GEF, pwndbg or peda
ちなみに筆者はpedaを使っています。
#### [x64dbg](http://x64dbg.com/#start)
本家にて32ビット版とx64ビット版のプレビルドが同時に配布されている。PEバイナリを動的解析可能(動かしながら解析可能)。少なくともx86dbgはCTFでは実用レベルのモダンなデバッガーで筆者のおすすめです。経験値ゼロでWindowsデバッガーを触りたいなら、x64dbgが最も良いでしょう。
// TODO: スクショ
プレビルドバイナリ:https://github.com/x64dbg/x64dbg/releases
※ベータ版的位置づけで、バージョン番号で管理というよりはスナップショットで管理されている
TODO:気が向いたら使い方動画(結月ゆかりちゃんボイス欲しいなぁ|д゚)チラッチラッ)
プラグイン:https://github.com/x64dbg/x64dbg/wiki/Plugins
便利ポイント:
* 実行した命令時点の作用を受けたメモリの内容とレジスタの値を後から遡れる
* 実行中のコード周辺の基本ブロックのツリーを表示できる
* レジスタウインドウに出ているアドレスを左クリックして、ダンプウインドウにそのアドレス周辺の内容を表示できる
#### OllyDbg
32ビットのPEバイナリを動的解析できる。※64ビットPEバイナリ非対応
#### WinDbg
[あの硬派な「WinDbg」がモダンなデザインに、プレビュー版が“ストア”公開へ - 窓の杜](http://forest.watch.impress.co.jp/docs/news/1077790.html) (2017/8/29)
Windowsのプロセスのメモリダンプを取るときに必要になったりするので、なんだかんだインストールする必要がある。
**FixMe**:別のメモとして独立
資料:
* [1] The Art of Memory Forensics
使用例:
* 32/64ビットのPEバイナリの解析
* WindowsのObjectをいい感じに扱う([1])
* 型情報の表示:`dt("_OBJECT_HEADER")`
* Windowsのクラッシュダンプの解析([1])
* ページファイルの解析(integrationとして;[1] p.110)
#### Immunity Debugger
TODO:(今から使い始める理由が無い気もする)
### Windows便利ツール
#### SysinternalSuite
* autoruns
* システムで自動起動するように登録されたエントリを一覧できる
* FTK Imagerなどでマウントしたドライブを対象に解析することもできる
### バイナリ解析補助ツール
#### CyberChef
https://gchq.github.io/CyberChef/
バイナリに各種処理を適用することができるツール。処理をチェーンさせることもできる。
ダウンロードしてスタンドアローンで動かすこともできる。
参考資料:
* [CyberChefの使い方(HamaCTF2019 WriteUp編)](https://www.slideshare.net/Sh1n0g1/cyberchefhamactf2019-writeup) (2019/4/19)
* どうしていいかわからないときは「Magic」(スライド26ページ)
### Binary Instrumentation
日本語では「バイナリ計装」といわれる。Binary Instrumentationは元のバイナリに対して機能を追加することをいい、追加機能として命令・コールトレース、関数書き換え、関数呼び出しのフックなどがある。
Binary Instrumentationには、Static Binary Instrumentation(SBI)とDynamic Binary Instrumentation(DBI)の2種類がある。前者は静的とある通り、バイナリに所定機能を計装したものをストレージに保存し永続化する。後者は動的とある通り、実行状態にあるバイナリに対して計装を施す。
#### Static Binary Instrumentation
SBIで有名なもの:
* [LIEF](https://lief.quarkslab.com/)
* [Dyninst](https://github.com/dyninst/dyninst)
##### LIEF
Quarkslab製。Pythonバインディングもあり便利。
計装例:
* シンボル情報の付加
#### Dynamic Binary Instrumentaion
##### Pin (Intel Pin)
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](https://github.com/K-atc/NaoPinTool)
Pinはマルウェア解析の話でちょこちょこ話題に上がるツールである。シンボリック実行エンジンの話でも出てくる([Mayhem](https://www.semanticscholar.org/paper/Unleashing-Mayhem-on-Binary-Code-Cha-Avgerinos/32c9b3a4990fdb26da19a4e0817936369a5e91bc)とか)。動的解析系を希望する人は、まず先にPin Toolsを触っておくことをおすすめする。
##### Frida
[Frida • A world-class dynamic instrumentation framework | Inject JavaScript to explore native apps on Windows, macOS, GNU/Linux, iOS, Android, and QNX](https://frida.re/)
計装にJavascriptを利用する異端児。
モバイルOSにも対応しており、In-memory Fuzzingを実施した例が報告されている。
[andreafioraldi/frida-fuzzer: This experimetal fuzzer is meant to be used for API in-memory fuzzing.](https://github.com/andreafioraldi/frida-fuzzer)
### エミュレータ
#### QEMU
TODO:
cf. qira
#### Unicorn Engine
TODO: コード片の動作を確認するときに便利。IDA Proのプラグインのバックエンドとして使っているものも多い
[QEMU 2.2.1](https://github.com/unicorn-engine/unicorn/blob/master/qemu/VERSION)ベースのマルチアーキCPUエミュレータ。QEMUではマシンの実行状態に干渉するには、gdbを叩く必要があったが、Unicornではレジスタやメモリの読み書きが用意な設計となっている。マシンコードをvmのメモリーに書き込んでから実行するので、自分がローダーにならないといけないのがネック(今後ローダーを搭載しないことも[明言されている](https://www.freelists.org/post/unicorn-engine/Does-Unicorn-contain-an-elf-parser-to-load-codesAnd-various-questions,2))。システムコールの発行はHookしてごにょごにょしないといけないのでがんばって。
cf. [usercorn](https://github.com/lunixbochs/usercorn)
公式のAPIリファレンスはDoxygenかinclude/unicorn/unicorn.hを見るしか無い。まだまだ発展途上のOSSなので、機能やサポートが少ないは仕方ないね。Undocumenedな動作がちょこちょこあるのでAPI呼び出しには細心の注意を払う。
↓筆者は仕方なく独特なリファレンスを書いた。
[Unicorn Engine Reference - HackMD](https://hackmd.io/s/rJTUtGwuW)
### 解析用VM
#### REMnux
https://remnux.org/
Ubuntu 14.04をベースにしたLinuxディストリビューションかつマルウェア解析環境。表層解析+αに特化した印象(まぁLinuxだしね)。WindowsでClamAVのセットアップするのは大変なので、これを使うと楽かも。
[Googleドライブに置かれたVMイメージをダウンロード](https://docs.google.com/uc?id=0B6fULLT_NpxMampUWlBCQXVJZzA&export=download)してVirtualBoxにインポートするか、[Ubuntu 14.04 (64bit)で環境構築スクリプトを実行する](https://remnux.org/docs/distro/get/#install-remnux-on-an-existing-system)のどちらかを行うとREMnuxが手に入る。
#### Windows
普段使ってるWindowsが感染するとアカンので、別のWindowsが必要。趣味で解析する人はライセンスを買うことになる。
以下ライセンス上の注意点:
* PCにプリインストールされていたWindowsはたいていOEM版のWindows。これはそのPCで使うことしか許されない。例えばVMで動くように移植させるのはエンドユーザーライセンス(EULA)違反。
* 学校が契約しているMicrosoft Imagine(旧DreamSpark)にWindowsが置いてあるが、これは学校が所有するPCにインストールすることを前提にしているため、個人所有のPC・VMにインストールするのはNG。
グレー:
* 評価版
* Modern IEに置かれている、IEの動作確認用VM
よく分からない:
* 鍵屋が売っている格安ライセンスキー
#### FLARE VM
[FLARE VM: The Windows Malware Analysis Distribution You’ve Always Needed! « Threat Research Blog | FireEye Inc](https://www.fireeye.com/blog/threat-research/2017/07/flare-vm-the-windows-malware.html) (2017/7/26)
Windows 7以上のWindowsを想定した環境構築スクリプトが↑で配布されている。
実行すると解析に役立つツールがインストールされる。Chocolateyのラッパーコマンドも入るみたい。
### [VirusTotal](https://virustotal.com/)(オンラインサービス)
劣化版VirusTotal(=旧式サイト):https://www.virustotal.com/ja/
バイナリとURLの検疫サイト。各位はこのサイトをブックマークに登録しておくこと。検体やWebサイトをオンラインで提出して、各アンチウイルスソフトでの検出結果を一覧できる。かなり便利。良性か悪性かどうかの投票機能もある。
検出結果だけを見て、そのアンチウイルスの検知性能は低いと決めつけるのは見当違い。実製品がそのままVTに入っているわけではないらしい。
有料版はVirusTotal Intelligence。**有料版ではアップロードされたファイルが見れる**ので、無料版ユーザーは気をつけてね。有料版ライセンスはお高い。
2018年頃に、検体の結果ページにサンドボックス解析機能や関連項目検索機能?が追加されたので、自分の環境を汚さずに検体解析したい人はこの機能を使い倒すと良さそう。
Microsoftが配布している[Sysinternals Suite](https://technet.microsoft.com/ja-jp/sysinternals/bb842062)(Windows用)のProcess Explorerに、実行中のプロセスをVirusTotalでチェックする機能が付いていて地味に便利。
[閑話休題]某検索エンジンが悪性のサイトであるかどうかを判断するために、VirusTotalの投票結果を当てにしていたため、いたずらにされたDown Voteのせいで、とあるまとめサイトが意図せずブロックされたことがあった。(そのサイトの名前を伏せる必要あるかな…)
[閑話休題]VirusTotalに「社外秘」のファイルが大量にアップロードされていたことが2016年に発覚した。第三者がファイルを取り寄せて開いた形跡も得られているため、アップロードするファイルには気をつけたほうがいい。セキュリティソフトには検疫機能があるのでまずそちらに目を向けてみては?(情報源:[セキュリティ研究センターブログ: VirusTotalへアップロードされる機微情報](http://blog.macnica.net/blog/2016/03/virustotal-7ab2.html))
[機械学習マルウェア対策のCylance、オンライン検査のVirusTotalで利用可能に | IT Leaders](http://it.impressbm.co.jp/articles/-/14708) (2017/7/10)
* 検出しても "Unsafe" としかでない…
* elfファイルは無視されるっぽい(2017/7/11現在)
### Google検索
Google is your friend. わかんないことがあったらググれ。
### その他、表層解析系
* mutexを使い出すのはマルウェアに特徴的
* mutexは多重起動防止に利用される
### その他お役立ちツール
* Chocolatey
* Windows用のパッケージマネージャー。コマンドプロンプトでアプリケーションのインストールがとても容易になる
* [Compiler Explorer - C++](https://godbolt.org/)
* オンラインコンパイラーがアセンブリを表示してくれる感じのWebアプリケーション
* [glogg](http://glogg.bonnefon.org/index.html)
* ログビューアー。grepとパイプができて便利
### ほかプラグイン
* [Awesome IDA, x64DBG & OllyDBG plugins](https://github.com/fr0gger/awesome-ida-x64-olly-plugin)
Reverse Engineeringお役立ち情報
----
[alphaSeclab/awesome-reverse-engineering: Reverse Engineering Resources About All Platforms(Windows/Linux/macOS/Android/iOS/IoT) And Every Aspect!](https://github.com/alphaSeclab/awesome-reverse-engineering)
他に必要なスキル
----
* 言語(書けないといけないわけではない)
* PowerShell
* 関連ライブラリ(?):WMI
* C# ※PowerShellで使える
* VBA
* C/C++
* Python
* 解析ツールの開発で必要になることが多いので書けた方がよい
* PHP
* HTML
* JavaScript
* 関連ライブラリ:jQuery
* Flash
* WebAssembly (wasm)
* Java ※Android
* Go
* 16進数の脳内演算
* エクスプロイトにおいて重要なスキル
* アセンブリに潜む16進数を意識的に追っていれば慣れてきます。
* Asciiコード
* 0x0a = '\n', 0x20 = ' ', 0x30 = '0', 0x41 = 'A', 0x61 = 'a' は最低限覚える
* 0xa, 0x20をアセンブリで見かけたら、文字列をパースしてるのかなと思うといいかも
* `c - '0'`で1文字のAsciiの数字を数値に変換するテクがあるのを覚えておくといいかも
### 面白そうなやつ
#### Microsoft Intermediate Language(MSIL)
[Windows Installer "msiexec.exe" を利用して「LokiBot」感染に誘導 | トレンドマイクロ セキュリティブログ](http://blog.trendmicro.co.jp/archives/16998) (2017/2/19)
マルウェアとは何なのか?
----
ひとつ言えるのは、マルウェア=Malicious Software、悪意のあるソフトウェア、だということ。
国内法では次のいずれかを満たすもの:
* 人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、又はその意図に反する動作をさせるべき不正な指令を与える電磁的記録
* 不正な指令を記述した電磁的記録その他の記録
### 立案担当者より補足?
[いわゆるコンピュータ・ウイルスに関する罪について](http://www.moj.go.jp/content/000076666.pdf) [PDF]
[法務省:情報処理の高度化等に対処するための刑法等の一部を改正する法律案](http://www.moj.go.jp/keiji1/keiji12_00025.html)
### 開発者より反論
[日本人マルウェア開発者インタビュー(前編) プログラムの「悪意」とは - THE ZERO/ONE](https://the01.jp/p0005947/)
> 悪意の対極には善意があるはずでしょう? この当時、世の中ではマイナス・イオンなんて言葉が盛んにもてはやされていたのですが、仮にマイナス・イオンが機械から出て来るなら、プラス・イオンはどこにいったのかなと思いますよね。同様に「悪意のあるソフトウェア」があるとしたら、「善意のあるソフトウェア」も存在しないといけません。
> このように、相対的な言葉の片方だけを、迷うことなく本気で使っている専門家という人たちは、頭が悪いなと思いました。自分が使っている言葉がわかってないのです。悪意のあるツールがあったとしたら、同時に存在しているはずの善意のあるツールがどこにいったのかまで、ちゃんと説明しなければいけないでしょう?
### 「不正」「悪意」とは?
TODO
> プログラムによる指令が「不正な」ものに当たるか否かは,その機能を踏まえ,社会的に許容し
得るものであるか否かという観点から判断することとなる。
> 『いわゆるコンピュータ・ウイルスに関する罪について』より
筆者的には、悪意とは「自分にとって都合の悪いもの」ですかねぇ…(でもこれは法律での定義に引っ張られてしまっていて本質でないかも)