EZ CTF 2022 Write up

5/7 - 5/8 に開催された[EZ CTF](https://ctftime.org/event/1655)にteam tarutaruとして参加しました。計2515 pointsで、156位でした。
私が解いた問題について、Write Upを残しておきます。眠いテンションで書いているので、読みにくいのは許してください。



# Forensics

## DigitalOcean (50 points)
Digital Oceanというクラウドコンピューティングの[説明スライド](https://docs.google.com/presentation/d/1Aapvk_kW5af4h_Ci_vLyJTYpIngtXFKB6f__ZA4KMug/edit?usp=sharing)が渡されました。スライドの2pと5pにフラグが記載されています。

# Crypto
## More Sense (60 points)

```More Sense.txt
BB BBBBB ABA AAA AAABB AABBAB BABB BBBBB AAB ABA AABBAB ABB AAAAB BABB AABBAB BBBBB AAB BBAAA AABBAB BBBBB AABA AABBAB AAAA AAABB ABA AAABB
```
上記のテキストファイルが渡されました。どうせモールス信号でしょう。[CyberChef](https://gchq.github.io/CyberChef/#recipe=Find_/_Replace(%7B'option':'Simple%20string','string':'A'%7D,'.',true,false,true,false)Find_/_Replace(%7B'option':'Simple%20string','string':'B'%7D,'_',true,false,true,false)From_Morse_Code('Space','Line%20feed')&input=QkIgQkJCQkIgQUJBIEFBQSBBQUFCQiBBQUJCQUIgQkFCQiBCQkJCQiBBQUIgQUJBIEFBQkJBQiBBQkIgQUFBQUIgQkFCQiBBQUJCQUIgQkJCQkIgQUFCIEJCQUFBIEFBQkJBQiBCQkJCQiBBQUJBIEFBQkJBQiBBQUFBIEFBQUJCIEFCQSBBQUFCQg)でデコードしたらできました。

## No Kidding (70 points)

```No Kidding.txt
8/44/444/7777\\\444/7777\\\8/44/33\\\555/2/6/33/7777/8\\\222/8/333\\\333/555/2/4\\\33/888/33/33/33/33/777
```

上記のテキストファイルが渡されます。なんとなくケータイ電話のキー入力に見えたので、そのとおりにデコードします。```\\\```の意味がいまいちわかりませんでしたが、```_```に置換したら正解になりました。

## OMG (80 points)
大量に```OMG```と記載されたテキストが渡されました。不自然に隙間が空いているので、ASCIIアートかなと思い、広めの画面で表示したらビンゴでした。![OMG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240237/8b286186-4992-6b2c-9a78-59cef8d1f62b.png)

# Steganography
## Bernie (125 points)
写真が配布されます。steghideで写真の中身を確認したところ```FlagHere.txt```というファイルがありました。この中身がフラグです。steghideのパスワードは空です。


## Nobody's perfect (210 points)
写真が配布されます。[Steganography Online](https://stylesuxx.github.io/steganography/)で分析したところ、フラグが隠されていました。![nobody.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240237/e25bd7d8-aedf-90f5-99fa-b68b5facb30a.png)

# Misc
## Grandma (350 points)
画像ファイル? が配布されています。拡張子はjpgですが、画像ビューアでは開けず、```file```コマンドで調べるとtextと言われるので中身を見てみます。

```shell
% cat Grandma.jpg
00000000  XX XX XX 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52  |.JPG........IHDR|
00000010  00 00 01 e7 00 00 01 6c 08 02 00 00 00 79 18 e6  |...?...l.....y.?|
00000020  18 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00  |.....sRGB.??.?..|
00000030  00 04 67 41 4d 41 00 00 b1 8f 0b fc 61 05 00 00  |..gAMA..?..?a...|
00000040  00 09 70 48 59 73 00 00 12 73 00 00 12 73 01 8c  |..pHYs...s...s..|
00000050  22 b9 07 00 00 ff a5 49 44 41 54 78 5e cc bd 07  |"?...??IDATx^̽.|
00000060  bc 65 57 59 f7 bf f7 39 67 9f 7e eb d4 4c 3a 69  |?eWY???9g.~??L:i|
00000070  34 05 12 13 20 74 94 a2 a8 28 60 c1 8a 8a 82 29  |4... t.??(`?...)|
00000080  f4 57 41 5f 91 a2 a2 20 4d 31 74 08 04 01 83 08  |?WA_.?? M1t.....|
00000090  08 2a dd 42 0b 25 40 80 14 12 d2 27 93 a9 77 e6  |.*?B.%@...?'.?w?|
....以下略
```

どうやら中身は何らかのファイルを```xxd```でダンプしたもののようです。ただし、先頭が```XX XX XX```となっていることから、ここだけ手動で改ざんされているようです。
調べたところ、```xxd```でダンプした内容は```xxd -r```で復元できるそうです。適当なスクリプトを書いて、ファイルを復元します。

```parse.py
with open("Grandma.jpg", "rb") as fp:
    for line in fp:
        for c in line.strip():
            if c == ord('X'):
                c = ord('0') # とりあえず0にしておく
            print(chr(c), end="")
        print()
```

```shell
% python parse.py | xxd -r > img.jpg
```

これで、先頭の```XX XX XX```以外は復元ができました。問題はMagic Numberです。元のファイルの拡張子がjpgであったことから、jpgにすれば動くだろうと、先頭を```FF D8 FF EE```や```FF D8 DD E0```に変えてみたのですが一向に画像ファイルとして認識されません。さらに、4文字目は```XX```ではなく```47```(G)で、これまで書き換えなければならないというのも違和感があります。
バイナリエディタでファイルとにらめっこしていたところ、ヘッダ相当と思われる部分に```IHDR```や```sRGB```という文字列を発見しました。検索したところ、これはPNGファイルのヘッダに存在するフィールドのようです。まさかと思い、Magic Numberをpngを意味する```89 50 4E 47```に書き換えてみたところ、画像ファイルとして認識されました。
この画像にフラグが記載されています。

# 感想
最近CTFに出るたびに「あまり解けなかった」と言っている気がします。今回のCTFは割とエスパーが多い気がしたのですが、これは単に僕の知識不足なのでしょうか?いずれにせよ、もっと精進せにゃ...