ångstromCTF Crypto Classy Cipher

Classy Cipher

Every CTF starts off with a Caesar cipher, but we're more classy.

pythonソースコードが与えられる。

from secret import flag, shift

def encrypt(d, s):
    e = ''
    for c in d:
        e += chr((ord(c)+s) % 0xff)
    return e

assert encrypt(flag, shift) == ':<M?TLH8<A:KFBG@V'

一つずつ見ていく。 encrypt(flag, shift)に結果が:<M?TLH8<A:KFBG@V'

encryptでは引数を2つ(d, s)を受け取り一文字ずつshiftを足したのものを% 0xffしてchrになおして returnしている。

少しわかりやすく書き直す。

def encrypt(flag, shift):
    e = ''
    for c in flag:
        e += chr((ord(c)+shift) % 0xff)
    return e

フラグの文字列を一文字ずつシフトして0xffとのあまりをchrにする。 これを逆にする。

def decrypt(e, shift):
    flag = ''
    for c in e:
        flag += chr((ord(c)+shift) % 0xff)
    return flag

e(おそらくencrypt)を受け取りshiftしたものと% 0xffを取りflagとして返す。 shiftの文字数はわからないのでブルートフォースを行う。

solve.py

# from secret import flag, shift

def encrypt(flag, shift):
    e = ''
    for c in flag:
        e += chr((ord(c)+shift) % 0xff)
    return e

def decrypt(e, shift):
    flag = ''
    for c in e:
        flag += chr((ord(c)+shift) % 0xff)
    return flag

# assert encrypt(flag, shift) == ':<M?TLH8<A:KFBG@V'
for i in range(100):
    print decrypt(':<M?TLH8<A:KFBG@V', i)
~/Desktop/ångstromCTF/Crypto/Classy Cipher ᐅ python classy_cipher_decrypt.py | grep actf
actf{so_charming}

FLAG : actf{so_charming}