TCPサーバの接続情報と、サーバのプログラムserver.py
が与えられた。
server.py
は、以下の処理をするものだった。
p
とする。p
の乱数を生成し、g
とする。x
とする。g
、p
、「g
をx
乗してp
で割った余り」を出力する。div
の入力を受け付ける。g
を「x
をdiv
で割って整数に切り捨てたもの」乗してp
で割った余りを出力する。
「g
のx
÷div
乗」をdiv
乗すると、
g
のx
乗に比べてx
÷div
の余りの数だけg
を掛ける回数が少ない数になるはずである。
したがって、この数にg
を何回掛けるとg
のx
乗になるかを探索することで、
x
÷div
の余りを求めることができる。
この余りの情報を集めることで、中国剰余定理によりx
を求めることができそうである。
これを実行するため、指定した数以上の素数を64個出力するプログラムprime_gen.pl
と、
サーバの出力からflagを求めるプログラムsolve.py
を用意した。
Information to connect to a TCP server and a serve program server.py
were given.
What server.py
does is:
p
.p
, and store it to g
.x
.g
, p
, and "g
to the x
-th power modulo p
".div
.g
to the "x
divided by div
and truncated to an integer"-th power modulo p
.
"g
to the (x
divided by div
)-th power" to the div
-th power will be a value
generated by multiplying g
(x
modulo div
) times lesser than g
to the x
-th power.
Therefore, we can obtain the x
modulo div
by searching for the number of g
to multiply
to make the value g
to the x
-th power.
Correcting the modulo information, x
should be able to be calculated via the Chinese remainder theorem.
To realize this, I created a program prime_gen.pl
to output 64 prime number that are not less than the specified value
and solve.py
to obtain the flag from the output of the server.
以下の手順によりflagが得られた。100以上という設定では上手くflagが得られなかったので、10000以上に設定した。
prime_gen.pl
を用い、10000以上の素数を生成する。solve.py
に入力する。このときコマンドライン引数で10000を指定する。I obtained the flag by the following process. Using prime numbers from 100 didn't work well, so I used prime numbers from 10000.
prime_gen.pl
.solve.py
. Specify "10000" as the command-line argument to do this.