SECCON beginners 2020 Writeup(Crypto:R&B)
はじめに
SECCON beginners 2020に個人で参加。
解けたのはBeginne問題のみ。
Miscジャンルの記事は以下。 paichan-it.hatenablog.com
[Crypto] R&B(Beginner)
問題
Do you like rhythm and blues?
添付されているzipからはencoded_flag
とproblem.py
が解凍された。
BQlVrOUllRGxXY2xGNVJuQjRkVFZ5U0VVMGNVZEpiRVpTZVZadmQwOWhTVEIxTkhKTFNWSkdWRUZIUlRGWFUwRklUVlpJTVhGc1NFaDFaVVY1Ukd0Rk1qbDFSM3BuVjFwNGVXVkdWWEZYU0RCTldFZ3dRVmR5VVZOTGNGSjFTMjR6VjBWSE1rMVRXak5KV1hCTGVYZEplR3BzY0VsamJFaGhlV0pGUjFOUFNEQk5Wa1pIVFZaYVVqRm9TbUZqWVhKU2NVaElNM0ZTY25kSU1VWlJUMkZJVWsxV1NESjFhVnBVY0d0R1NIVXhUVEJ4TmsweFYyeEdNVUUxUlRCNVIwa3djVmRNYlVGclJUQXhURVZIVGpWR1ZVOVpja2x4UVZwVVFURkZVblZYYmxOaWFrRktTVlJJWVhsTFJFbFhRVUY0UlZkSk1YRlRiMGcwTlE9PQ==
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
を確認する。FORMAT
という環境変数の中を一文字ずつ確認していて、R
であれば、先頭にFLAG
をrot13
エンコードした結果の先頭にR
を付与し、B
であれば、先頭にFLAG
をbase64
エンコードした結果の先頭にB
を付与するという流れ。 デコードはこれと逆のことをやれば良い。
先頭文字がR
であればR
を取り除いたうえでrot13
デコード、先頭文字がB
であればB
を取り除いたうえで`base64デコード。
以下のスクリプトを実行し、フラグゲット。
import codecs import base64 with open("encoded_flag", "r") as f: data = f.read() while True: if (data[0] == "R"): data = codecs.decode(data[1:], "rot13") elif (data[0] == "B"): data = base64.b64decode(data[1:]).decode("utf-8") else: print(data) break
ctf4b{rot_base_rot_base_rot_base_base}