ＣＴＦを始めるときにおすすめな本とか

CTFは分野も幅広いし分かりやすいステップもないので、やり始めるときどうするか結構迷いやすいと思います。
なので自分にとって役に立ったものをまとめてみました。書籍がメインだけどサイトへのリンクも増やしていきたい。

# 紹介している本(とamazonへのリンク)
+ CTF全般
    - [セキュリティコンテストチャレンジブック CTFで学ぼう！情報を守るための戦い方](https://amazon.co.jp/dp/B017X3D3GE/)
    - [セキュリティコンテストのためのCTF問題集](https://amazon.co.jp/dp/4839962138/)
+ Rev
    - [デバッガによるx86プログラム解析入門](https://amazon.co.jp/dp/4798042056/)
    - [リバースエンジニアリングバイブル](https://amazon.co.jp/dp/4844334794)
    - [大熱血アセンブラ入門](https://amazon.co.jp/dp/4798051543/)
    - [楽しいバイナリの歩き方](https://amazon.co.jp/dp/4774159182)
    - [Reverse Engineering for Beginners](https://beginners.re/)
+ Pwn
    - [HACKING: 美しき策謀](https://amazon.co.jp/dp/4873115140/)
+ Crypto
    - [秘密の国のアリス](https://amazon.co.jp/dp/B015643CPE/)
    - [暗号解読](https://amazon.co.jp/dp/B01MRZVRM5/)
+ Web
    - [安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 第2版](https://amazon.co.jp/dp/4797393165)

# 前提
__簡単なプログラムが書ける、読めること__

コードの読み書きがある程度できないと流石にどうにもならないです。ツールを使うだけで解ける問題も多いですが、そういった問題はあまり多くありませんし、何よりレベルが上がりません。何かしらの言語でちょっとしたコードを書ける位の経験は必要です。

でも世の中にはコード書いたことないけどCTFしたい!という人もいるかもしれません。
そんな人におすすめなのはPythonです。海外で教育用のプログラミング言語として使ってるところが多いせいか、CTFでもみんなPython使っています。使えるとなにかと便利です。
プログラミングすらやったことないって人でもPythonの入門書か入門サイト読めばとりあえずやり始めることはできるでしょう(多分)。
最近ではProgateというサービスが良いらしいので初心者にはおすすめです。
Python自体に問題がないわけではないですが、インタープリターで実行できるので結果を確認しながら試行錯誤できるという点がCTFでは便利です。
RubyやPerlでも似たようなことはできますが、CTFで使えるツールなんかもPythonのライブラリだったりすることが多い気がするのでそういった点でも有利かもしれません。初心者ならなおさらライブラリが豊富な方が良いでしょう。

他の言語使ってる方は無理にPythonを学ばなくても、有名なツールなら代替品があったりするので十分でしょう。
Pythonの方が情報が多いのは確かですがPython以外では解けない問題はめったにないので、積極的な理由がないなら切り換える必要はないと思います。
とはいえ流石にコンパイル系の言語だけだと辛いので、インタープリターのある言語も使えるようになっておいた方がいいです。
まあ言語の勉強してCTFしないのも本末転倒な気がするので言語を学びつつCTFやればいいと思います。

ここからおすすめなリソース紹介です。
追加で特定のドメインごとに持っていると役立つ知識の項目を追加しました。

---
# CTF全般
特定の分野でなく、CTF全体で役に立ったもの。

## セキュリティコンテストチャレンジブック
[amazon](https://amazon.co.jp/dp/B017X3D3GE/)

いわずと知れたハリネズミ本。
これ一冊でCTF全体を俯瞰することができるので、始めてみようかなーって人に丁度いいと思います。
分野としてはリバースエンジニアリング(rev)、pwn、ネットワーク解析(foren)、web系の基本的なテクニックなどが書かれています。
これだけで簡単な問題なら解き始められるようになると思います。

最初からrev、pwnと進むので少しハードルが高いかもしれません。C言語とかやったことないしプログラムがどうやって実行されるかまったく知らないって人には若干厳しいような気がします。そういう人がどう感じたのか感想が欲しいところ。
最初は飛ばしてネットワークのパケット解析とかからやっても問題ないので、Cがキツい人とかはそこから始めるといいかもしれません。

__注意__
ハリネズミ本で紹介されているgdb-pedaはメンテされておらずバグってて、codeとかstackが表示されません。どうも内部で整数であるべき変数にfloatの値が入っているようです。
Python3の対応も進んだっぽいので本家のlongld/pedaの方を使いましょう。

## セキュリティコンテストのためのCTF問題集
[amazon](https://amazon.co.jp/dp/4839962138/)

新しい方のハリネズミ本、動物を被せるのは名前を付けにくいのでやめていただきたい。
チャレンジブックが系統立てて理論的な解説を多く掲載しているのに対し、こちらは実際の問題を解くプロセスを掲載するようになってます。
分野は相変らずリバースエンジニアリング、pwn、ネットワーク、webです。
実際の問題をダウンロードできるようになっていて、一緒に解きながら読み進めることができます。
実際にCTFをやるときに使える便利ツールとかいっぱいでてくるのも魅力的。

この本はコンテストチャレンジブックの方で出てきた知識を使って問題を解くような形になっているので、最初にこの本を買うのはおすすめできないです。
また、完全に別の問題をそれぞれ解説しているので内容的に何となくバラつきや重複があるような感じがします。

チャレンジブック読んだけど、実際にどうやってやればいいのか分からない！って人に是非。

# Rev
リバーシング、リバースエンジニアリング。
いわゆるバイナリ解析。

あまり解かないので詳しくないです。とりあえずはチャレンジブックで十分なのではと思ったりも。
個人的にはPractical Malware Analysisで勉強しました。英語なのでおすすめしない方法ですが、詳細かつ網羅的にリバーシングのテクニックやアンチリバーシングの回避方法などが解説されているのでチャレンジする価値はあると思います。最近これを翻訳している人を見つけたので、もしかすると訳書がでるかもしれません。

誰かいい本教えて下さい。

## 持っていると役立つ知識
Rev問を解く上で役に立つであろう分野、技術を挙げていきます。

### x86, x86_64のアセンブリ言語
アセンブリ言語、特にx86の知識がないとRevに取り組むこともままなりません。
まずはx86のプログラムをある程度読めるぐらいを目指しましょう。
アセンブリ言語というと難しく感じるかもしれませんが、C言語がある程度読めるくらいの人なら割と簡単に読めるようになります。
基本的な計算機の実行モデルとアセンブリの命令10個くらい憶えれば、大抵のプログラムの7割くらいは理解できます。
紹介している本を読めばだいたいのことは書いてあるので心配ないでしょう。

### C言語
Rev問ではたいていC言語、もしくはC++で書かれたプログラムが降ってくるので、C言語を知っていると解析しやすくなります。
プログラムの挙動を確認するときに、Cプログラムを自分で書いてコンパイルして逆アセンブルするみたいなことをするので書けた方がいいです。
プログラミング経験者ならC言語はそんなに難しくもないでしょう。

### ありとあらゆる言語
冗談ですが。
でもときどき.NETとかGoとか降ってくるので、C言語以外でも読む根性とググラビリティがときどき必要になります。
熱血本やれば身に付きそう。

## デバッガによるx86プログラム解析入門
[amazon](https://amazon.co.jp/dp/4798042056/)

タイトル通り対象はx86のバイナリ解析になります。
デバッガでプログラムを解析するのがメインですが、アセンブリやコンパイルされたプログラムがどのように実行されるのかも解説されているので、revの入門に良いと思います。
改訂してx64のことも掲載されるようになってます。

## リバースエンジニアリングバイブル コード再創造の美学
[amazon](https://amazon.co.jp/dp/4844334794)

この本もx86の解析で、特にWindowsのバイナリについて詳しく解説されています。CTFというよりは実践的なリバースエンジニアリングのための本で、どちらかというとマルウェア解析あたりの話題が多いです。
ハリネズミ本などではCで書かれたプログラムのバイナリしか解説してないことが多いですが、この本ではC++のバイナリについても簡単に解説されているのが嬉しいところです。
前提とする知識のハードルは高めだと思いますが、ハリネズミ本読了くらいの知識でついていけると思います。

CTFではLinuxの実行ファイルであるELF形式のバイナリが多いような気がしますが、この本ではWindowsのPE形式について詳しく解説されています。なので、CTFやろうとしてこの本買うとちょっと寄り道が多いかもしれません。Windowsのバイナリの解析をやってみたいなら良い入門書になると思います。

若干ですがアンチリバーシングの話もあるので、そういった技術に興味のある方にもおすすめです。

## 熱血!アセンブラ入門
[amazon](https://amazon.co.jp/dp/4798051543/)

大熱血は内容が追加されているので今から買うならそっちの方がいいと思います、リンクは大熱血の方。
内容は様々なアーキテクチャのアセンブリをとにかく何となくで読んでみようという感じで進んでいきます。なので、x86系以外にもMIPSとかの命令がでてきます。

revでときどき降ってくる変なアーキテクチャのバイナリ読むときとかこの本のやり方が役に立つかもしれません。ただし、バイナリを前後の文脈やパッチ当てたときの挙動の変化から読み解いていくようになっていて、解析するアーキテクチャもころころ変わるので特定のアーキテクチャの体系的な知識は身に付かないような気がします。
とはいえレジスタなんか解説とかは載っているので、事前知識はあまり必要とされずハードルは低めだと思います。解説の仕方も教科書的な情報の羅列ではなくとりあえずやってみよう形式で、重要でない難しいところは後回しにして話が進むので読みやすいと思います。
また様々なアーキテクチャに触れているので、共通する特徴というかよくあるパターンみたいなものが分かるようになります。

CTF的には最初に読む本としては長過ぎてオススメできません、CTFを何回かやってみてrev楽しー！って人にオススメです。
人によって合う合わないの差が大きい本だと思うので、買うなら立ち読みしてからをオススメします。

## 楽しいバイナリの歩き方
[amazon](https://amazon.co.jp/dp/4774159182)

低レイヤーへの入門書みたいな位置付けです。
基本的にはWindows環境での話ですがLinux環境で脆弱性を攻撃したりもしているので、VMWareかVirtualBoxなどで環境を作れる方向けです。
話題もリバーシングからコードインジェクション、簡単なデバッガの自作、MetaSploitを用いた脆弱性のエクスプロイト、さらにはマルウェア解析環境の簡単な紹介など多岐に渡ります。
逆に言えばそれぞれの話題について深く掘り下げてはいないので全体的に物足りないかもしれません。

CTF的には内容がやや薄いですが、マルウェア解析などに興味がある人には良い入門書になると思います。ただ、若干古い(4年くらい前)ので注意する必要があります。
一応サンプルのバイナリは32bit版の再頒布パッケージを入れたら動きました。

## Reverse Engineering for Beginners
[PDF](https://beginners.re/)

フリーのPDFです。
x86, x86_64, ARM, MIPSの4種類のアーキテクチャについて同時に解説されているので、結構重めです。
解空の関数や返り値のような簡単な例から解説されていて網羅的なので、これを通して読むだけでかなり成長できると思います。
Cプログラムが掲載されてるけどC言語自体はあまり解説されていないので、ある程度C言語が使えるくらいでないと読みすすめるのが厳しいです。
原書は英語だけど一部日本語に翻訳されたものがあるので、英語が読めなくても大丈夫でしょう。

全部で1000ページ以上あるので重めですが、初心者でも始められるのでおすすめです。

## バイナリ
自分でコンパイルして自分で読もう。
実際、CTFで出るようなバイナリはgccでコンパイルしたC言語プログラムが大半なのでとりあえずそれを読んでみるのがいいと思います。
if文やfor文がどうなるのかや関数に引数を渡すのはどうやるのかなどを調べましょう。
x86とx86_64を最初にやるのがおすすめです。ときどきARMとかのバイナリが降ってきますが、慣れてれば何となく読めたりもするので気になったものをやればいいでしょう。
gccでx86バイナリにコンパイルするには`-m32`オプションを付けましょう。
だいたいの人は普通にコンパイルするとx86_64バイナリになると思います。

コツは何となくで読むことです。よく出てくる命令10個くらい分かってればだいたいは何となしに分かるようになってきます。知らない命令はググりましょう。

# pwn
元ネタはownのタイポだとかなんとか。
プログラムの脆弱性なんかを利用してフラグを手に入れるジャンルです。
~~一番ハッカーっぽい~~

## 持っていると役立つ知識
### Linux
基本的にLinux系OSのサーバや実行ファイルを攻撃することになるため、Linux関連の知識が必要になります。
具体的な攻撃方法とかwriteupはだいたいLinux依存の方法だったりします(gotとかpltとかheapとか)。
また、解析や攻撃スクリプトの作成もLinuxでやった方がトラブルが少ないです。
というか、明確にWindowsが必要でない限りほとんどの問題はLinuxでやった方が便利な気が...

### Revの知識
脆弱性を探すために解析する必要があるので、基本的にRevの知識が必要になります。
ガチReverserほどではなくともアセンブリの意味が分かるくらいにはならないと難しいです。

## Hacking: 美しき策謀
[amazon](https://amazon.co.jp/dp/4873115140/)

いわゆる策謀本。
wikiに目次が書いてあるのでそっちみるとイメージが掴みやすいかもしれません。
C言語入門やローカルでの脆弱性への攻撃(攻撃自体はチャレンジブックにも載っているもの)だけでなく、ネットワークへの攻撃の話などもある。
特に良かったのはシェルコードに関する部分で、入門には最適なステップバイステップの解説が載ってます。
ちらっと暗号の話なんかものってたりします。

全体的にチャレンジブックよりも要求するレベルが高い気がします。
その分ためになる部分も多いのでpwnやりたいならこの本がおすすめです。
結構高いので図書館とかを利用したいところです。
~~でも購入の要望出したら公安とかにマークされそうだよね~~

チャレンジブックと策謀本読めばスタックへの攻撃は十分できるくらいになっていると思います。あとは実際の問題に挑戦してみて、経験を積みましょう。

さりげなくシリコンバレーに出てた。

## オンラインリソース
katagaitai CTF勉強会のスライドがおすすめです。

やるとしたら、スタック系の攻撃からヒープ系の攻撃をやるとだいたい難易度順になりそうです。

# foren
Forensics、元は法科学みたいな意味でコンピュータから証拠を探し出すような感じ。
詳しく知らないのでスクリプトキディと化している。

qiitaにある入門記事がいいんじゃないでしょうか？
https://qiita.com/knqyf263/items/6ebf06e27be7c48aab2e

ちょっと前に日本語の入門書みたいな本も発売されていたので、それらもいいのかもしれません。

おすすめのツールはbinwalkとforemostです。

## 持っていると役立つ知識
### TCP/IP
ネットワーク系Forenでは必須の知識になります。
wiresharkでパケットを見て嫌悪感を抱かない程度の知識は必要です。
個別のプロトコルは流石に厳しいので、問題を解きながら学んでいくのが無難です。

### ファイルシステム、ストレージの知識
ディスクイメージ系Forenでは必要になるかもしれません。
要は、ファイル管理がどんな感じでディスク上にどのように保存されているか、みたいな知識があればとりあえずは大丈夫だと思います。

### ステガノグラフィの知識
知識というか、存在を知っておく必要があります。
ステガノグラフィとは、情報が存在していることを隠すことによる秘匿技術、みたいな感じでしょうか。
簡単に言えば画像の中にテキストファイルを隠したり、pngに見せかけてzipだったりみたいな感じの技術になります。
こういった技術の存在を知らないと流石に手も足も出ないんじゃないでしょうか。

# crypto
暗号系。

古典的な暗号文からRSAまで様々なものが対象になります。
解き方も暗号アルゴリズムの脆弱性見つけたり、運用上のミスを突いたり、ブルートフォースかけたり色々です。

## 持っておくと役立つ知識
### 各種暗号、符号化技術の知識
ぱっと見で判別できるくらいの知識があると解析が捗ります。
経験で補えるので必須というほどでもないと思います。

### 数学、特に離散数学系の知識
現代暗号には数学的なバックグラウンドがあったりするので、それが理解できるくらいの数学の知識があると良いでしょう。
乱数列の逆算などでは演算を逆算できる必要があるので、基本的な数学の知識は必須です。
特にRSAはよく出るので、離散数学は知っておくと理解に役立ちます。

## 秘密の国のアリス
[amazon](https://amazon.co.jp/dp/B015643CPE/)

これ一冊で暗号に関する技術的なことや理論的なことを広く浅く知ることができます。
とっかかりになるでしょう。僕はRSAに進みました。

## 暗号解読
[amazon](https://amazon.co.jp/dp/B01MRZVRM5/)

サイモン・シンさんの著作。暗号の技術的側面ではなく歴史的側面に主眼を置いて書かれています。
読み物として純粋におもしろいと思うのでCTFやってなくてもおすすめです。
ガチガチの数学ではなく何となくの理解に十分なくらいの数式しか出てこないところもとっつきやすくていい感じです。

解読法の話もちょこちょこ出てくるので何気にCTFにも役立ちます。ヒエログリフの話があったおかげで問題解けたしね。


基本的には有名な暗号の解読方法を調べていったりすればいいと思います。

# web
web系の問題。
SQL、PHP、javascript、html、ブラウザと結構何でもありな感じのあるジャンル。
まったく手を付けていないので役に立つ情報はあまりないです。
~~徳丸さんの本がいいと聞きました。~~徳丸本第2版は最高です。

SQLインジェクション、OSコマンドインジェクション、ディレクトリトラバーサル、XSSあたりを検索すればいいと思います。

## 持っていると役立つ知識
JavaScript, PHP, DB, HTML/CSS辺りはまあ当然役に立ちます。
最初のうちはググラビリティが一番役立つんじゃないでしょうか？

## 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践 第2版
[amazon](https://amazon.co.jp/dp/4797393165)

お値段が変わらないので第2版を買おう。

脆弱なWebアプリケーションが動作する仮想マシンが配布されているので実際にどんな風に攻撃ができるのか試すことができます。それだけでもう買う価値アリ。
技術的な話や対策だけでなく、脆弱性や品質管理などの基本的な話もあってとてもタメになります。CTFに限らずWeb開発の人は読むべき本のリストに入れておくべきでしょう。
脆弱性の原因からその具体的な対策方法、対策のための全体的な方針まで示されていて至れり尽くせりといった感じです。この一冊で基本的なことはマスターできるんじゃないでしょうか(まだ4章の途中だけど)。

CTF的には、Web系の基本的な脆弱性の原理や攻撃手法を俯瞰することができるので入門書には最適です。また、攻撃や脆弱性、対策だけでなくWebに関する基本から説明されているので、Webまったく知らないマンでもこれから読み始められます、私はできました。
書籍の中ではOWASP ZAPを使って通信を操作したりするので、ツールの使い方もある程度憶えられるかもしれません。インストールするようにと書かれていますが、Kaliの仮想マシンで問題ないです。ただし、それだとバージョンの互換性の問題でFoxyProxyだけ手動で設定する必要があるのが難点です。

脆弱性診断してる人の話だと、OWASP ZAPよりBurp Suiteの方が人気ですね。

# その他
まとめにくいものとか。

## 常設CTFサイト
オンラインでやってる、いつでも解くことができる常設型のCTF。
CTFのイベントにいきなり参加するのが躊躇われるときはこっちから始めてみると雰囲気も掴めるしおすすめです。

初心者が一番最初にやるなら[CpawCTF](http://www.cpaw.site/)がおすすめです。2じゃないほうです。
かなり親切設計で、チュートリアル的な問題から始まるので初心者でも大丈夫です。なんならチャレンジブックより先にこっちをやった方が楽しみながらCTFが自分に合うかどうか判断できるのでかなりおすすめです。
他に有名なものだと[ksnctf](http://ksnctf.sweetduet.info/)があります、こっちはCpawCTFより難易度は高いです。

## 色んなwebサイト
情報発信してくれている優しい人がいっぱいなので分からないことがあったらどんどん検索しましょう。
強い人はコンスタントに色々やってるのでフォローすると最新の動向が分かったりするかもしれません。

## 英語
英語はできた方がいいかみたいな話が多いので追加で。

まあ、できるかできないかならできた方が良いに決まってるんですけどね。
最初のうちは日本語での解説なんかがたくさん検索で出てきますが、レベルが上がるにつれ少なくなっていきます。だんだん日本語だけだと限界を感じ始めるので英語は読めた方がいいです。CTFに限らずコンピュータの世界の公用語は英語ですしね。
最近ではGoogle翻訳がかなり優秀なのでわりと読めます、何なら中国語の脆弱性情報だって余裕で分かります。Google翻訳すげえ。
まとめると、英語を極めてからCTFを始める必要はぜんぜんないです、Google翻訳でいけます。でも読めた方が圧倒的に得です、勉強しましょう。

英語の勉強方法は他を当たってください。むしろ教えて欲しい。

## セキュリティ関連のニュース
最近流行った脆弱性とかに関する問題が出たりすることがあるので見ておくといいかもしれません。実生活にも役立つと思います。

# まとめ
雑多な感じになってしまった感がある。
僕もまだ初心者なので、他にもこれがいいとかここ直せとかあったらコメントとかで教えて下さい。

CTF初心者の役に立てたら幸いです。