OMH 2021 CTF | Fiend

#OMH2021CTF

import base64
import hashlib
import os
import sys
from datetime import datetime

from Crypto.Cipher import AES


def encrypt(data, key, iv):
    encryptor = AES.new(key, AES.MODE_CBC, IV=iv)
    return encryptor.encrypt(data)


def pad(data):
    missing = 16 - len(data) % 16
    return data + (chr(missing) * missing).encode()


def printout(msg):
    sys.stdout.write(msg + '\n')
    sys.stdout.flush()


def main():
    flag = open("flag.txt", "rb").read()
    assert len(flag) == 16
    timestamp = str(datetime.now())
    IV = hashlib.md5(timestamp.encode('ascii')).digest()
    key = os.urandom(16)
    printout(timestamp)
    printout("Hello to FIEND encryption service!")
    try:
        while True:
            printout("Give me message (base64 encoded):")
            msg = input()
            msg = base64.b64decode(msg) + flag
            plaintext = pad(msg)
            ciphertext = encrypt(plaintext, key, IV)
            printout(base64.b64encode(ciphertext).decode("ascii"))
            IV = hashlib.md5(IV).digest()
    except Exception as e:
        sys.stderr.write(str(e) + "\n")
        printout("Phail :(")
    pass


main()

overview