プログラム src.py
と、ファイル model.pth
が与えられた。
src.py
は、以下の処理をするものだった。
nn.Sequential(*([nn.Linear(8, 8, bias=False)] * 7))
を用いたクラスのインスタンスを用意し、そのデータを model.pth
に保存する。flag
を8×8の行列に変形する。
まず、nn.Linear(8, 8, bias=False)
とは何かを調べると、
8次元の入力を行列の掛け算により8次元の出力に変換する処理 (bias=False
なので定数の加算はしない) のようだった。
A program src.py
and a file model.pth
were given.
What src.py
does is:
nn.Sequential(*([nn.Linear(8, 8, bias=False)] * 7))
and save its data to model.pth
.flag
to an 8 x 8 matrix.
To begin with, I searched for what is nn.Linear(8, 8, bias=False)
.
I found that it converts a 8-dimension input to a 8-dimension output by matrix multiplication (No addition of constant values is performed because bias=False
).
Linear — PyTorch 1.10.0 documentation
次に、nn.Sequential
とは何かを調べると、渡された処理をそれぞれ順に行う処理のようだった。
Then, I searched for what is nn.Sequential
. It turned out to be a process where the passed processes are sequentially done.
Sequential — PyTorch 1.10.0 documentation
これらを組み合わせた nn.Sequential(*([nn.Linear(8, 8, bias=False)] * 7))
は「8次元の入力を行列の掛け算により8次元の出力に変換する処理」を7回繰り返す処理ということだとわかった。
次に、model.pth
をバイナリエディタで見ると、先頭に PK
が見えた。
そこで、これはzipアーカイブであると推測し、
すると、archive/data/93839392490432
という256バイトのファイルがあり、これが nn.Linear
で用いられる行列のデータであると推測した。
そして、この行列のデータをテキストに変換する以下のプログラムを作成した。
Combining these, nn.Sequential(*([nn.Linear(8, 8, bias=False)] * 7))
should be a process where "a process to convert a 8-dimension input to a 8-dimension output by matrix multiplication" is repeated 7 times.
After that, I viewed model.pth
in a binary editor and found it beginning with PK
.
Therefore, I guessed that this is a zip archive and unzipped that using
Then, I found a 256-byte file archive/data/93839392490432
and guessed that this is the data for the matrix used in nn.Linear
.
I created this program to convert this matrix data to text:
さらに、src.py
の出力としてコメントで書かれているデータもBase64デコードすると256バイトになったので、同様に行列を表すテキストに変換した。
ここで、実験のためにflagの最初の部分 buckeye{
に
Also, Base64-decoding the data written in the comment as the output of src.py
yielded 256-byte data.
I also converted this data to a text representation of matrix in the same way.
To use in an experiment, I applied "To Decimal" on buckeye{
.
Raspberry Pi の wolfram
コマンドを利用して、この変換結果に model.pth
から読み取った行列の7乗を掛けてみた。
Using the wolfram
command on Raspberry Pi, I multiplied the matrix read from model.pth
to the 7th power to the result of conversion.
結果は以下のようになった。
This is the result:
これは、出力データから読み取った以下の行列の1行目と近い値である。
This result is near to this first row of the matrix read from the output data:
出力データから読み取った行列に、model.pth
から読み取った行列の7乗の逆行列を掛け、さらにその結果を四捨五入した。
I multiplied the inverse of the matrix read from model.pth
to the 7th power to the matrix read from the output data, and rounded the result.
以下の結果が得られた。
This is the result:
この結果をCyberChefで変換することで、flagが得られた。
I obtained the flag by converting this result using CyberChef.
Find / Replace, From Decimal - CyberChef