Break Me!

TCPサーバの接続情報と、サーバのプログラム aes-ecb.py が与えられた。
プログラムは、入力を読み取り、「flag、入力、暗号鍵」をこの順番で結合したデータを AES.MODE_ECB で暗号化し、結果を出力する、ということを繰り返すものだった。

AES.MODE_ECB は各ブロックを独立に暗号化する方式なので、以下のことがわかる。

これらに基づき、以下のプログラムで暗号鍵を取得できた。
5文字程度取得するごとになぜか通信が切れたので、これまでに取得したデータを指定して続きを取得出来るようにした。

Information to connect to a TCP server and a server program aes-ecb.py were given.
The program repeatedly reads some input, encrypts "the flag, input data, the key" concatenated in this order using AES.MODE_ECB, and prints the ciphertext.

AES.MODE_ECB encrypts each blocks independently, so these things can be said:

Based on these facts, I succeeded to obtain the key using this program.
The connection closed after obtaining around 5 characters for some reason, so I enabled it to accept known data and obtain the data after that.

solve.pl

暗号鍵を取得できたのでflagを含むデータを復号できるはずだが、 現在のCyberChefでは指定の形式のパディングが入ったデータを暗号化したものでないと復号できないため、そのままでは復号できない。
そこで、各ブロックを独立に暗号化していることを利用し、まず空文字列を暗号化したデータを作成した。

Now the data that contains the flag can be decrypted with the obtained key.
However, current CyberChef only supports decrypting of ciphertext whose plaintext has a padding with the specified format, and therefore it cannot be directly used to decrypt in this case.
To overcome this, I encrypted an empty string to exploit the fact that each blocks are encrypted independently.

AES Encrypt - CyberChef

復号したい暗号文の後ろに、この空文字列に対応する暗号文ブロックを結合して復号することで、flagが得られた。

I obtained the flag by decrypting the ciphertext to decrypt with the encrypted block of an empty string concatenated after that.

AES Decrypt - CyberChef

DUCTF{ECB_M0DE_K3YP4D_D474_L34k}

DownUnderCTF 2021