Random ECB [Crypto]

Random ECB

Random ECB

We are provided server.py and a server:

  • URL: nc crypto.utctf.live 9003
  • File: server.py

Recon

Server prepends the plaintext with a 50% chance of 'A', followed by the chosen plaintext and then the flag. After encrypting it, it returns the ciphertext. It uses AES in ECB mode, so it's therefore vulnerable to a Chosen Plaintext Attack.

Code

import pwn
import string

conn = pwn.remote('crypto.utctf.live', 9003)
conn.recvuntil(b'Input a string to encrypt (input \'q\' to quit):\n')

def sr(msg):
    conn.send(msg + b'\n')
    conn.recvuntil(b'Here is your encrypted string, have a nice day :)\n')
    res = conn.recv().split(b'\n')[0]
    res = bytes.fromhex(res.decode())
    return res

def srb(msg):
    m1, m2 = sr(msg), sr(msg)
    while m1 == m2:
        m2 = sr(msg)
    smsg = bytearray(b'A') + msg
    sm = sr(smsg)
    while sm != m1 and sm != m2:
        sm = sr(smsg)
    if sm == m1:
        return m2
    return m1

text = ""
plain = [ord(c) for c in text]
for block in range(1, 3):
    for i in range(15, -1, -1):
        p = bytearray(i * b'A')
        res = srb(p)
        b = res[block * 16 - 1]
        print(f'Byte {i}, looking for {b}')
        for c in string.printable:
            print(f'Checking {c}')
            ib = ord(c)
            res = srb(p + bytearray(plain) + bytearray([ib]))
            if res[block * 16 - 1] == b:
                plain.append(ib)
                text += c
                print(text)
                break
print(f'Flag is: [{text}]')
conn.close()

Flag

utflag{3cb_w17h_r4nd0m_pr3f1x}