ksnctf 21問
zipファイルを解凍すると
- encrypt.cpp
- encrypt.enc
- flag.enc
- mt19937ar.cpp
- mt19937ar.h
ができる。encrypt.cppを覗いてみると、名前の通り暗号化するプログラムだった。どうやらencrypt.encはencrypt.cppを暗号化したもの、flag.encはflag.jpgを暗号化したものらしい。
ふむふむ、このflag.encを解読しろってことね。
暗号化のアルゴリズムを詳しく見ていくと、mt19937ar.cppで定義されている擬似乱数発生器を未知の"seed"っていうファイルで初期化した後、生成される擬似乱数を使ってencrypt.cppとflag.jpgに対して続けてXOR暗号をかけているらしい。
XOR暗号は2度かけると元に戻るという性質があり、encrypt.encとencrypt.cppは与えられているので、encrypt.cppの暗号化時に生成された乱数列は求めることができる。
ここで、求めた乱数列からseedを逆算できないかと思いググってみると、seedは逆算できないものの、後続の乱数列を予測できるらしい。
ふむふむ。メルセンヌツイスターって聞いたことはあったけど、こういう仕組みになってるのね。
このページを参考に、flag.encを解読。勉強になりました。