ファイル print_flag.py.enc
および jumble.py
が与えられた。
jumble.py
には、ランダムな対応関係を生成し、入力の文字をそれぞれ対応する文字に置換して出力する処理が書かれていた。
print_flag.py.enc
には、1行目に平文の一部、2行目以降に暗号文が書かれているようだった。
まず、平文の _quick_brown_fox_jumps_
の部分に対応する暗号文を探すため、(.).....\1.....\1...\1.....\1
を検索した。
その結果に基づき、
Files print_flag.py.enc
and jumble.py
were given.
jumble.py
had a program to generate a random set of substitution rules and output the input with each characters replaced according to the rules.
In print_flag.py.enc
, the first line looked like some part of the plaintext and the other lines looked like a ciphertext.
To begin with, I searched for a regular expression (.).....\1.....\1...\1.....\1
using _quick_brown_fox_jumps_
in the plaintext.
Using the result, I created this rule for "Substitute" in
Plaintext: y8Pp X\t%DSlXGEU\x0beX@U$Xz%Mo\XUa EXPp XWtk\x0cXYU{
Ciphertext: {'the_quick_brown_fox_jumps_over_the_lazy_dog
さらに、復号結果がPythonのプログラムとして成り立つように対応関係を加えていくと、以下のようになった。
Then, I added rules to make the decryption result be a valid Python program. This is the result.
Plaintext: y8Pp X\t%DSlXGEU\x0beX@U$Xz%Mo\XUa EXPp XWtk\x0cXYU{4bZ.=Aw^g/J]>Rm:h~_63j?V,
Ciphertext: {'the_quick_brown_fox_jumps_over_the_lazy_dog/\n #!64():=".12357809[]}N
この時点で、復号結果は以下のようになった。
This is the result of decryption using this rule.
この復号結果から、関数 check
の冒頭部分に the_quick_brown_fox_jumps_over_the_lazy_dog
を反転させて大文字にしたものが入るはずであることが読み取れる。
これを用いて対応関係を加えると、以下のようになった。
This result is suggesting that the first part of the function check
should contain what can be obtained by reversing the_quick_brown_fox_jumps_over_the_lazy_dog
and converting to upper-case letters.
I added rules based on this. This is the result.
Plaintext: y8Pp X\t%DSlXGEU\x0beX@U$Xz%Mo\XUa EXPp XWtk\x0cXYU{4bZ.=Aw^g/J]>Rm:h~_63j?V,F+\nf5}I7|01sOB&N)Kn(OqCQ*`
Ciphertext: {'the_quick_brown_fox_jumps_over_the_lazy_dog/\n #!64():=".12357809[]}NGODYZALEHTRVOSPMUJXFWBKCIQ
復号結果は以下のようになった。
This is the result of decryption.
ここに現れた文字列 c2RjdGZ7VV91blJhdjNsZWRfdEgzX3NuM2shfQ==
をBase64デコードすることで、flagが得られた。
I obtained the flag by Base64-decoding the string appeared here: c2RjdGZ7VV91blJhdjNsZWRfdEgzX3NuM2shfQ==
.