picoCTF 2018 write up

picoCTF という2週間の CTF のコンテストがあると聞き、今まで CTF のコンテストに出たことがなかったのでやってみた。
簡単なところから始まり、どんどんと解けるので楽しかった。
解けた問題の write up をする。
###Forensics Warmup 1
リンクをクリックすると zip ファイルがダウンロードされ、開くと jpg ファイルが出てくる。
それを開くと Flag が書かれた画像が出てくる。
###Forensics Warmup 2
リンクをクリックすると png ファイルがダウンロードされ、開くと Forensics Warmup 1　と同じように Flag が出てくる。
###General Warmup 1
16進数で 0x41 は ASCII コードだと何かという問題。
0x41 は A
###General Warmup 2
27 を2進数で表す問題。
手計算でやってもコードを書いても google 検索でヒットした web ツールを使ってもできる。
答えは 11011
###General Warmup 3
16進数の 0x3D を10進数に直す問題。
暗算でやるのが一番早い。答えは 61 になる。
###Resources
リンク先のページへ飛ぶと下の方に
` Thanks for reading the resources page! Here’s a flag for your time: picoCTF{xiexie_ni_lai_zheli} `
とある。
###Reversing Warmup 1
picoCTF の shell server 上で移動してコードを実行せよとあるので、とりあえず shell server に行く。
説明欄を読むとログインには自分のアカウントのユーザーIDとパスワードを入れればよさそうなので入れるとログインできる。
問題文中にファイルが置かれているディレクトリが書いてあるので `cd` コマンドを用いてそこへ移動し、ファイルを実行すると　Flag　が出てくる。
###Reversing Warmup 2
base64 フォーマットの `dGg0dF93NHNfczFtcEwz`　を ASCII にする問題。
google 検索で「Base64 ASCII 変換」などとすればデコードツールが出てくる。
###Crypto Warmup 1
キー `thisisalilkey` と下の変換表を用いて作られた暗号文 `llkjmlmpadkkc` を復号する問題。

```txt:table.txt
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
   +----------------------------------------------------
A | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B | B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C | C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D | D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E | E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F | F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G | G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H | H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I | I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J | J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K | K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L | L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M | M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N | N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O | O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P | P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q | Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R | R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S | S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T | T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U | U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V | V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W | W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X | X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y | Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z | Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
```

例えば次のようなコードを書いて実行すれば答えが出てくる。

```cpp:main.cpp
#include <iostream>

int main(){
    std::string key = "thisisalilkey", c = "llkjmlmpadkkc";
    std::string ans(13, ' ');
    int sz = 13;
    for(int i = 0; i < sz; i++){
        ans[i] = ((c[i] - 'a') - (key[i] - 'a') + 26) % 26 + 'a';
    }
    std::cout << ans << std::endl;
}
```
###Crypto Warmup 2
[rot13](https://ja.wikipedia.org/wiki/ROT13) というもの。google 検索すれば変換サイトはすぐに見つかる。また、自分でコードを書くこともできる。
###grep 1
与えられたテキストファイルを開き、何も考えずに Ctrl+F を押して picoCTF と入力すると Flag が見つかる。
###net cat 
Linux コマンドの `nc` を使う。
`nc 2018shell2.picoctf.com 10854` というコマンドを実行すると Flag が出てくる。
###pipe
`nc 2018shell2.picoctf.com 48696` とコマンドを打って `2018shell2.picoctf.com 48696` に接続すると何やらメッセージの羅列らしきものが出てきた。
それを読むとフラグを探しているようなので、出てきたメッセージの羅列らしきものに Ctrl+F か何かで picoCTF という文字列を探せば Flag が見つかる。
###Inspect Me
リンク先のページにアクセスしてページのソースを見ると Flag の断片が見つかる。
とりあえず css と js に移動するとそれぞれにも Flag の断片があり、これらを繋げると答えになる。
###grep 2
まずは shell server に移動する。
複数のファイルに対して grep をしたいが、手動でやると流石に時間がかかりすぎるので Linux コマンドの `grep` に `-r` のオプション (ディレクトリ内も検索対象とする) をつけて探すと見つかる。
###Aca-Shell-A
Linux コマンドの知識を試すゲーム。
次の順番で行えば良い。
1. `nc 2018shell2.picoctf.com 33158` に接続する。
2. ( `ls` でディレクトリを確認して ) `cd secret` で secret ディレクトリに移動する。
3. 見つけたものを教えてと言われるので、 `ls` を実行する。
4. `intel` で始まるファイルを消してと言われるので `rm intel*` を実行する。
5. `echo 'Drop it in!'` を実行してと言われるのでその通りにする。
6. executables ディレクトリに行ってファイルを実行してと言われるので、 `cd` コマンドで移動して、そこにある dontLookHere というファイルを実行する。
7. ユーザー名を画面に出力してと言われるので `whoami` を実行する。
8. tmp ディレクトリの TopSecret ファイルを passwords ディレクトリにコピーしてと言われるので `cd` コマンドでホームディレクトリに移動して `cp /tmp/TopSecret passwords` を実行する。
9. 移動したファイルを読んでと言われるので `cd passwords` でディレクトリへ移動して `cat TopSecret` でファイルの中身を出力する。
10. Flag が出てくる。
###Client Side is Still Bad
リンク先の web ページのソースを見ると下のような繋げて読めば良さそうな複数の文字列が出てくるので繋げて `picoCTF{client_is_bad_9117e9}` とすればよい。

```js:main.js
if (checkpass.substring(split*7, split*8) == '}') {
  if (checkpass.substring(split*6, split*7) == '17e9') {
    if (checkpass.substring(split*5, split*6) == 'd_91') {
     if (checkpass.substring(split*4, split*5) == 's_ba') {
      if (checkpass.substring(split*3, split*4) == 'nt_i') {
        if (checkpass.substring(split*2, split*3) == 'clie') {
          if (checkpass.substring(split, split*2) == 'CTF{') {
            if (checkpass.substring(0,split) == 'pico') {
              alert("You got the flag!")
              }
            }
          }

        }
      }
    }
  }
}
```
###Desrouleaux
`nc 2018shell2.picoctf.com 54782` に接続し、与えられた json ファイルを見ながら問いに答えよう。問いは難しくない。
###caesar cipher 1
Crypto Warmup 2 と同じように google 検索で探すか自分でコードを書くかすれば良い。
###environ
まずは shell server に移動する。
`printenv` コマンドで環境変数の一覧を表示すると、 `SECRET_FLAG=picoCTF{eNv1r0nM3nT_v4r14Bl3_fL4g_3758492}` というのが出てくる。
###blaise's cipher
[ヴィジュネル暗号](https://ja.wikipedia.org/wiki/%E3%83%B4%E3%82%A3%E3%82%B8%E3%83%A5%E3%83%8D%E3%83%AB%E6%9A%97%E5%8F%B7)
`nc 2018shell2.picoctf.com 18981` に接続すると暗号文が出てくる。
`pohzCZK{g1gt3w3_n1pn3wd_ax3s7_maj_095glcih}` という部分がそれっぽいので `pohzCZK` は `picoCTF` だったと推測ができる。
すると、この部分の鍵は `agflagf` なので、この暗号文全体の鍵は `flag` だと予想ができ、google にあるデコードツールでデコードしてみると全体が正しい英語の文になっていることが確認できる。
###now you don't 
与えられた画像を開くと一見何もないようだが、塗りつぶしをすると文字が浮き上がってくる。
###what base is this?
2進数、16進数、8進数をそれぞれASCIIに直すだけ、制限時間は30秒。コードを書くか google 検索でツールを探すかして短い時間で変換できるようにしておこう。
###you can't see me
まずは shell server に移動する。
目的のディレクトリに移動して `ls` を実行しても何も出力されないのでファイルはないように見えるが、ドットファイルがある。`ls -l` とすればドットファイルがあることが確認できる。
そんなことは全く気にせずに `grep picoCTF -r` を実行すれば Flag が出てくる。
###Safe RSA
[RSA暗号](https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7) は $m$ (平文) の $e$ (今回は3) 乗が $n$ 以下のときは、平文が暗号文 $c$ の $e$ 乗根になる。
多倍長整数が扱えるプログラミング言語を使えると便利。
###rsa-madlibs
RSA暗号の問題をひたすら解いていく。
問題は固定なので、[ここ](https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7) に書いてある内容を参照しながらゆっくり解けば良い。
多倍長整数が扱えるプログラミング言語を使えると便利。
私は Python を用いて、[拡張ユークリッドの互除法を用いてモジュラ逆数を求めたり](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%A9%E9%80%86%E6%95%B0#%E6%8B%A1%E5%BC%B5%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E4%BA%92%E9%99%A4%E6%B3%95)、繰り返し二乗法を使ったりして解いた。
###store
コスト 1000 の旗を 3000000 個買うと支払い金額がオーバーフローして負の値になり、所持金が大きく増える。