セキュリティ技術メモブログ

日々の活動を記録する場所

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_flagproblem.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であれば、先頭にFLAGrot13エンコードした結果の先頭にRを付与し、Bであれば、先頭にFLAGbase64エンコードした結果の先頭に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}