Classy Cipher
Every CTF starts off with a Caesar cipher, but we're more classy.
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}