Substitution Cipher I

プログラム substitution-cipher-i.sage と、その出力 output.txt が与えられた。
プログラムは、./flag.txt の各文字を f.substitute を用いて変換し、その結果を出力するものだった。

変換元のデータを b"DDDUCTF{}" に差し替え、f.substitute の結果を16進数で出力するようにしてみたところ、

A program substitution-cipher-i.sage and its output output.txt were given.
The program converts each characters in ./flag.txt using f.substitute and outputs the result.

I tried changing the data to convert to b"DDDUCTF{}" and having it output the results of f.substitute in hexadecimal numbers. The result was:

0xeba3 0xeba3 0xeba3 0x16feb 0xe4c5 0x16753 0xf9ad 0x301bd 0x31af3

となった。このことから、同じ入力の文字は同じ出力データに変換されそうだということが読み取れた。
さらに、output.txt の各文字をサクラエディタで見ると、 各文字のコード(U+xxxx)が出力の16進数と一致することがわかった。

そこで、0x20~0x7eの各入力について出力の値を求めて逆引き用のテーブルを作ることにした。
さらに、output.txt の各文字のコードをサクラエディタで読み取り、 そこからテーブルを参照して入力の文字を求めることにした。

最終的に、以下のプログラムをSage Cell Serverで実行することでflagが得られた。

This implies that the same input character should be converted to the same output characters.
Also, checking each characters in output.txt on Sakura Editor, I found that the codes of each characters (U+xxxx) matches the output hexadecimal numbers.

I decided to obtain outputs for each inputs in the range 0x20 to 0x7f to create a table for inversion.
I also decided to read the codes for each characters in output.txt on Sakura Editor and refer the table to obtain the input characters.

In conclusion, I obtained the flag by executing this program on Sage Cell Server.

solve.txt

DUCTF{sh0uld'v3_us3d_r0t_13}

DownUnderCTF 2021