CTFを始めて憧れのハッカーになろう

# はじめに
みなさんCTFをご存知でしょうか？
CTFとはCapture The Flagの略で、かなり雑に説明すると、問題からFlagという答えを見つけ出す競技です。
これだけ聞くと「ちょっと難しそう」だったり「知識がないとできないんでしょ？」などの感想を持ってしまう方も多いでしょう。
僕もそうでした。

ですが実際にやってみた感想はこれ
**CTFって…かっこいい…！**

これなんです。
確かに難しい。確かに覚えることも多い。**でも楽しい！**
なんだろうこの感覚…
競技プログラミングやデータ分析なども、もちろん楽しいんです。
でも違うんです。例えるならこれは、
**映画に出てくるハッカー！！**
誰もが一度は憧れたことがあるでしょう、あのパソコン一つで世界を思いのままに操れる、そんな気持ちにさせてくれるんです！
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403394/62bbc427-f0f1-2745-f34d-62358629a81e.png">

こうやって書いてあるだけでは伝わらないでしょう。
これから触りだけ説明していきます。
興味を持てた方はすぐにはじめてみましょう。
やればやるほどハマってしまいますよ。

# CpawCTF
それではCTFの説明をはじめていきます。
この記事では[CpawCTF](http://ctf.cpaw.site/)というサイトを元に、説明をします。
CTFができるサイトはいくつかあるのですが、はじめて触る方には圧倒的にオススメなのがこちらのサイトです。
こちらではジャンルと難易度別に問題があり、レベル1から順に問題を解いていきます。

それぞれの**ジャンルがどういうものか**、**具体的にどのような問題があるのか**、このあたりを中心に解説していこうと思います。
載せている例題については、実際に出題されているものを、少し文面や内容を修正して書き直しました。

## Crypto
_A「これは…暗号か…？」_
_B「くそ！なんて書いてあるんだ！」_
_ハッカー「これはシーザー暗号だ。俺に任せてくれ」_

Crypto(Cryptography)のジャンルでは、暗号の問題が出されます。
出題された文字列が暗号になっていて、それを解くことで答えのFlagを手に入れることができます。

例題を見てみましょう。
> シーザー暗号をご存知でしょうか？これは3文字分アルファベットをずらすという単一換字式暗号の一つです。
> 次の暗号文は、このシーザー暗号を用いて暗号化しました。
> 暗号文を解読してフラグを手にいれましょう。
> 暗号文：iodj{l_dp_vxshu_kdfnhu}

こちらは問題文に載っている通り、3文字文アルファベットをズラすという一般的なシーザー暗号です。
暗号を解いているときって、なんだかワクワクしますよね。

## Network
_A「どうにかして、あいつらの秘密を知ることはできないか…」_
_B「おい！通信を傍受できたぞ！」_
_ハッカー「あいつらの通信から情報を抜き取れる。俺に任せてくれ」_

Networkのジャンルでは、パケットと呼ばれるデータの解析などを行います。
パケ・ホーダイとかのパケットと一緒です。
暗号化されていない通信からFlagを手にれましょう。

例題を見てみましょう。
> ネットワークを流れているデータはパケットというデータの塊です。
> それを保存したのがpcapファイルです。
> pcapファイルを開いて、ネットワークにふれてみましょう！

これは、パケットから情報を探し、Flagを手に入れるという一番初歩的な問題です。
簡単に情報を抜き取られてしまう可能性があるというのは怖いですね。

## Reversing
_A「なんなんだ、このウイルスは？」_
_B「ちくしょう！どんな動きをしているかわからん」_
_ハッカー「リバースエンジニアリングで解析しよう。俺に任せてくれ」_

Reversingとはリバースエンジニアリングでアプリやプログラムを解析し、Flagを見つけるという分野です。
またリバースエンジニアリングとは、ソフトウェアの動きから中身のプログラムを作ることです。
CTFで言うと、与えられたファイルを解析し、正しいFlagを見つけ出すことですね。

例題を見てみましょう。
>拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。
>この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが…

これはリバースエンジニアリングとは少し違いますが、このようなバイナリファイルを解析する問題も多いです。
幅広い知識が求められます。

## Web
_A「どこかに暗号を解く鍵はないか？」_
_B「おい！このホームページに情報はないか？」_
_ハッカー「ホームページのHTMLにそれらしい情報を発見した。俺に任せてくれ」_

こちらは名前通りWebセキュリティに関する問題が出題されます。
Webに関わる様々なジャンルから問題が出るので、幅広い言語に関する知識が求められます。
個人的に、私が好きな分野です。

例題をみてみましょう。
>HTML(Hyper Text Markup Language)は、Webサイトを記述するための言語です。
>ページに表示されている部分以外にも、ページをより良くみせるためのデータが含まれています。
>次のWebサイトからフラグを探して下さい。

こちらはHTMLのコードを見て、中からFlagを見つけるという問題ですね。
このジャンルを解いているとWebアプリケーションに詳しくなれます。

## Pwn
_A「これでラストか…」_
_B「よし！このプログラムさえ止められれば！」_
_C「このプログラムには脆弱性がある。俺に任せてくれ」_

最後はPwnです。こちらは一番カッコよく、一番難しい分野です。（個人の見解）
Pwnは簡単に説明するとプログラムの脆弱性を突く問題であり、一番ハッカーぽいと言えるでしょう。
解けるとめちゃくちゃにかっこいいですが、幅広い知識が求められめちゃくちゃに難しい問題となっています。

今回は例題はありません。
実際に解いてみたい！と言う人は、[こちら](https://gist.github.com/matsubara0507/72dc50c89200a09f7c61)の問題を見てみると良いと思います。Pwnの入門について書かれています。
問題の形式としては、与えられたソースコードの脆弱性を見つけ、そこを攻撃することでFlagをゲットするというものです。
Pwnの問題が解けるようになるまで、CTFを頑張ってみてください！

# おわりに
CTFの面白さとカッコよさを伝えたく、この記事を書きました。
これを読んでくれた皆さんは、おそらくハッカーに熱い憧れがあると思います。
ぜひCTFをはじめて、ハッカー気分を味わってください！！

# 参考情報
- [CpawCTF](https://ctf.cpaw.site/)
- [CTF初心者が考えるCTF入門](https://kinako-mochimochi.hatenablog.com/entry/2019/02/20/131937)
- [楽しいPwn入門](https://gist.github.com/matsubara0507/72dc50c89200a09f7c61)