Windows10だけでやってみたSECCON Beginners CTF 2020 Writeup

# 概要
2020/05/24にSECCON Beginners CTF 2020に挑戦しました。
いろいろあって、4時間しかできなかったのと、メモリが4GBしかないWindows10の端末しかなかったので、Linuxがない環境でどこまでできるかやってみました。

# 環境
・ハードウェア：CPU Intel COREi3(7th) / Memory 4GB
・OS：Windows10 home
・Python3.8.2インストール済み

# 結果
得点の低い(簡単そうな)問題から3問だけ回答。

## Misc:Welcome(50点)
![ctf4b2020_101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/f7d80875-2bf5-2d07-48bc-a8036ede15e1.png)
Discordのサーバにアクセスしたらよいらしい。

「ルール」リンク(https://score.beginners.seccon.jp/rules) を確認すると、Discordの招待リンクが記載されている。
(https://discord.gg/qG3JxFw)
![ctf4b2020_102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/fcda4bfe-8fae-c110-1ae5-c57633250c36.png)

まずは、Discordのサイトを確認。(https://discord.com/)
![ctf4b2020_103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/3591fee3-216e-4bdd-9b38-4832dd0357fc.png)
プログラムをインストールしなくても、ブラウザでアクセスできる模様。
[Discordをブラウザで開く]ボタンを押下。

ユーザ登録画面が開くので、任意のアカウントとメールアドレス、パスワードを入力。
(メールアドレスを頻繁に入力する必要があるので、CTF用のメールアカウントを1つ用意したほうがよいかも。)

アカウント登録が終わったら、先の招待用URLにアクセス。
https://discord.gg/qG3JxFw
![ctf4b2020_104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/f8a0214d-8409-bf09-52b5-0dc7f55d6658.png)
[招待を受ける]ボタンを押下。

![ctf4b2020_105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/7b779551-5056-8800-7c0c-3b7a059b3546.png)
SECCONのアイコンが追加された。

![ctf4b2020_106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/dc62bb08-4353-3cdc-1403-3a2b3eb40fd3.png)
[#announcement]を選択。
スクロールダウン。

![ctf4b2020_107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/f54c6162-cfb9-d0b9-1c44-c63bdec2b839.png)
フラグを見つけた！

```
ctf4b{sorry,  we lost the ownership of our irc channel so we decided to use discord}
```
→そういえば、去年は、IRCを使っていた。Discordに移行したから、操作説明をかねてWelcomeのフラグになっている様子。

![ctf4b2020_108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/e226f1fe-216c-a317-ec75-3a0c2b30a4c0.png)
フラグを入力して[Submit]

![ctf4b2020_109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/854713f2-ed52-4492-7f29-e5b25cac202e.png)
正答！


## Crypto:R&B(挑戦時：54点、最終52点)
![ctf4b2020_201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/3117d8bb-3c83-6fd8-bdd7-a0f460015b97.png)
[r_and_b.zip]リンクを押下。

ダウンロードした、r_and_b.zipファイルを展開。

以下の2ファイルが存在する。
encoded_flag
problem.py

とりあえず、テキストとして開いてみる。
![ctf4b2020_202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/89f279b3-14c3-4809-e83b-c7b804e99c56.png)
encoded_flagは、暗号化したデータのようである。
総文字数は、453文字。


``` python:problem.py
from os import getenv


FLAG = getenv("FLAG")
FORMAT = getenv("FORMAT")


def rot13(s):
    # snipped


def base64(s):
    # snipped


for t in FORMAT:
    if t == "R":
        FLAG = "R" + rot13(FLAG)
    if t == "B":
        FLAG = "B" + base64(FLAG)

print(FLAG)
```
problem.pyは、pythonのプログラムのようである。

・関数が2つ(rot13とbase64)ある。省略されているが、rot13(シーザ暗号)とbase64エンコードと思われる。
・forループで、何度も繰返し処理している。FORMATの指示ごとに、先頭にrot13ならR、base64ならBを付与している様子。

もとの、encoded_flagをみると、Bからはじまっているのでbase64っぽい。
base64の出力は4の倍数の文字数になる。先頭にBを付与して、453なので452文字。4の倍数なので、おそらく間違いない。末尾が==なのも、base64を示唆している。

一度、encode_flagの先頭一文字を除いて、base64デコード(復号)してみる。
結果・・・
![ctf4b2020_203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/fed06344-e805-3e20-77e2-1f7903a8d000.png)
また、Bからはじまるbase64のようである。

ploblem.pyから想像すると、base64とrot13を繰り返し実行しているようなので・・・

先頭がBかRか判定し、デコードするプログラムを作ってみる。

``` python:RandB_solve.py
# coding: utf-8
# 2020/05/24 @HirMtsd
# Code for 'SECCON Beginners CTF 2020'

import codecs
import base64

# シーザ暗号復号
def rot13_(s):
    return codecs.decode(s, 'rot13')

# Base64復号
def base64_(s):
    return (base64.b64decode(s.encode())).decode()

# 符号化データ
with open("r_and_b\encoded_flag") as f:
    enc = f.readline()

# ループ
while True:
    print(enc)
    if not (enc[0] == "B" or enc[0] == "R"):
        break
    else:
        if enc[0] == "B":
            enc = base64_(enc[1:])
        elif enc[0] == "R":
            enc = rot13_(enc[1:])

print("FLAG:")
print(enc)
```

https://github.com/HirMtsd/SECCON_Beginners_CTF_2020/tree/master/2Crypto_1RandB/

実行してみる。
![ctf4b2020_204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/ed06065b-83fd-0cc5-90ed-addaee1848fe.png)
それっぽい答が出た！

```
ctf4b{rot_base_rot_base_rot_base_base}
```
→rot13とbase64の暗号化順序がそのままフラグになっている！

![ctf4b2020_205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/d2d310d6-8fa4-d892-945a-17f5a871afc1.png)
フラグを入力して[Submit]

![ctf4b2020_206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/c0d8275a-2b8a-3121-6ff6-d00fc9a8ec96.png)
正答！


## Misc:emoemoencode(挑戦時：55点、最終53点)
![ctf4b2020_301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/d1eabeca-54a4-0fb2-6823-e271b4bfe96e.png)
[emoemoencode.txt]リンクを押下。

ダウンロードした、emoemoencode.txtファイルを開く。
![ctf4b2020_302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/45782f7c-3d18-a908-81df-b449e1668e41.png)
開くと絵文字が表示された。(絵文字のemo？「エモい」のemo？)
(Windows10でメモ帳を使用した場合の表示。OSやフォント、文字コードにより表示は異なる。)

これでは意味がわからないので、とりあえず、バイナリ表示して見る。
コマンドプロンプトを起動し、以下のバッチファイルを実行。

``` cmd:view_hex.bat
@echo off
rem coding: ascii
rem 2020/05/24 @HirMtsd
rem Code for 'SECCON Beginners CTF 2020'

pushd %~dp0

certutil -encodehex emoemoencode.txt hex 11 & type hex & del hex

pause
```
![ctf4b2020_303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/b675c92a-3ee6-fd7c-f619-9ea77209e8a9.png)
「F0 9F xx xx」で、1文字になっているように見える。

フラグは「ctf4b{…}」である(ルールに記載があった)ので、前から6文字は、こんな感じ？

|emoemo     |ASCII|ASCII コード(HEX)|emoemo – ASCII|
|-----------|:----|----------------:|--------------|
|F0 9F 8D A3|c    |               63|F0 9F 8D 40   |
|F0 9F 8D B4|t    |               74|F0 9F 8D 40   |
|F0 9F 8D A6|f    |               66|F0 9F 8D 40   |
|F0 9F 8C B4|4    |               34|F0 9F 8C 80   |
|F0 9F 8D A2|b    |               62|F0 9F 8D 40   |
|F0 9F 8D BB|{    |               7B|F0 9F 8D 40   |

数字だけ、引き算の値が違う・・・

3バイト目が、8Cか8Dかで有効範囲が違う？
とりあえず、8Cと8Dで分岐して、定数を引き算するようなコードを作ってみた。
さっき、pythonで書いたので、ひきつづきpythonでコーディング。

``` python:emoemo_solve.py
# coding: utf-8
# 2020/05/24 @HirMtsd
# Code for 'SECCON Beginners CTF 2020'

# 答えの準備
a = ""

# emoemoencode.txtをバイナリで読み込み
with open("emoemoencode.txt", "rb") as f:
    # 初回読み込み
    c = f.read(4)

    # ファイルの終わりまでループ
    while c[0] != b"" and c[0] != 0x0a:
        # 3バイト目が0x8Cの場合、4バイト目から0x80を引く
        if c[2] ==0x8c:
            a += chr(c[3] - 0x80)
        # 3バイト目が0x8Dの場合、4バイト目から0x40を引く
        elif c[2] == 0x8d:
            a += chr(c[3] - 0x40)

        # ループ読み込み
        c = f.read(4)

    # 答え出力
    print(a)
```

https://github.com/HirMtsd/SECCON_Beginners_CTF_2020/tree/master/0Misc_2emoemoencode/

実行してみる。

![ctf4b2020_304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/90008e8e-2f44-4575-73cf-1879672cf550.png)
それっぽい答が出た！

```
ctf4b{stegan0graphy_by_em000000ji}
```
→絵文字でステガノグラフィだそうです。

![ctf4b2020_305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/f294c855-c6ea-6a85-453f-05b05aa872f8.png)
フラグを入力して[Submit]

![ctf4b2020_306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321153/f67349f7-6a0e-8949-45fd-5eab17ec6ce5.png)
正答！

# 感想
CTF本来のReversingとか、全然できなかったけれども、楽しかったです。