TCPサーバの接続情報と、ファイル game.py
が与えられた。
game.py
の内容は、データを入力するとそれに基づくデータを出力するドアとランダムなデータを出力するドアがあるので、ランダムなデータを出力するドアを選ぶことを要求するというものであった。
ランダムでない方は、入力したデータをAESで暗号化した結果と、入力したデータをビット反転したものをAESで復号した結果を繋げたデータを出力する。
この仕様により、最初に適当なデータを入力し、次に得られたデータの後半を入力すると、ランダムでなければAESの復号と暗号化が相殺され、前半が最初に入力したデータをビット反転したものになる。
一方、ランダムであれば高確率で最初に入力したデータとは関係ないデータとなるため、高確率で識別が可能である。
この性質を利用した以下のプログラムにより、flagが得られた。
Information for connecting to a TCP server, and a file game.py
were given.
The contents of game.py
is a program where there are a door that emits data corresponding to an input data and a door that emits random data on input, and asks to choose a door that emits ramdom data.
The non-random data is created by concatenating input data encrypted via AES and bitwise-NOT of input data decrypted via AES.
With this spcificaton, we can get a bitwise-NOT of the input data by firstly entering some data and then entering the latter part of the first output because the decryption and encryption will be canceled.
On the other hand, the random data won't be related to the input data in the most case, so using this we can distinguish them at high probability.
Using this characteristics, I wrote this program to obtain the flag.