the luck 2

TCPサーバの接続情報と、プログラム main.py が与えられた。
main.py の処理内容は、以下のものだった。

  1. random.getrandbits(32) により、正解の値を生成する。
  2. 数値を読み込む。
  3. 読み込んだ数値が正解なら、flagを出力する。正解でなければ、正解の値を出力し、最初に戻る選択肢を与える。

random.getrandbits(32) はメルセンヌ・ツイスタの genrand_int32() の返り値を返すはずである。
さらに、メルセンヌ・ツイスタは、十分な数の出力を集めれば次の値を予測できることが知られている。
そこで、Zh3r0 CTF V2 の Twist and Shout で用いたコードを利用し、Z3を用いて次の値を予測して送信する以下のプログラムを作成した。

Information for connecting to a TCP server and a program main.py were given.
What main.py does is:

  1. Choose the answer value via random.getrandbits(32).
  2. Read an integer.
  3. If the integer read is the answer, print the flag. Otherwise, print the answer and let the user to perform this process again.

random.getrandbits(32) should return what is returned from genrand_int32() of Mersenne Twister.
Also, it is known that we can predict the next output of Mersenne Twister from enough number of output values.
Using a program I wrote for "Twist and Shout" in Zh3r0 CTF V2, I created this program to predict the next value via Z3 and send the value.

solve.py

メルセンヌ・ツイスタ (移植元) のライセンス License of Mersenne Twister (original for porting)

mt_license.txt

このプログラムに指定のサーバとの通信をさせることで、flagが得られた。

I obtained the flag by having this program communicate with the specified server.

CPCTF{y0u_4r3_a_1ucky_6uy}

CPCTF22