ELFファイル v1
が与えられた。
このファイルに strings
コマンドをかけると、http://137.184.108.185/v2
というURLが出てきた。
しかし、このURLへのアクセスを試みたが、繋がらなかった。
しばらくすると、DiscordでURL http://147.182.172.217:42100/v1
が発表された。
このURLにアクセスすると別のELFファイルがダウンロードでき、URL http://147.182.172.217:42100/v2
が含まれていた。
このURLが示すファイル v2
には、URL http://147.182.172.217:42100/v3
が含まれていた。
このことから、URLは連番で、ダウンロードできるファイルは次のURLを含むと予想できた。
そこで、URLの数字を適当に変えて試していった結果、
http://147.182.172.217:42100/v100000000
からは約18.3KBのファイルがダウンロードでき、
http://147.182.172.217:42100/v150000000
では version not found と表示された。
さらに、1からある番号までは必ず version not found にならず、それを超えると必ず version not found になると仮定し、 以下のようにPythonのインタラクティブを用いて二分探索を行った。
まず、範囲を示す変数を初期化し、範囲の中央の番号を返す関数m()
を用意する。
A ELF file v1
was given.
Applying the strings
command to this file, I found an URL http://137.184.108.185/v2
.
However, I couldn't connect to this URL.
After a while, an URL http://147.182.172.217:42100/v1
was announced on Discord.
Accessing to this URL yielded another ELF file which contains an URL http://147.182.172.217:42100/v2
.
The file v2
pointed at by this URL contained an URL http://147.182.172.217:42100/v3
.
Based on these, I guessed that sequencing number is used for the URL and files pointed at by an URL contains URL with the next number.
I tried changing the number in URL and found that
http://147.182.172.217:42100/v100000000
has a file that is about 18.3KB, and that
http://147.182.172.217:42100/v150000000
shows "version not found".
With an assumption that no numbers from v1
to some point yields "version not found"
and that all numbers beyond the point yields "version not found",
I performed a binary search using the interactive mode of Python.
To perform a binary search, firstly initialize variables to represent the range
and create a function m()
that returns the number for the center of current range.
次に、m()
を実行すると範囲の中央の番号が得られるので、それをURLにセットしてアクセスする。
version not found となったら r = m()
を実行、そうでない場合はl = m()
を実行し、範囲を更新する。
再び m()
を実行すると、新しい範囲の中央の番号が得られる。
これを繰り返すことで、version not found になるかどうかの境界がある範囲を絞っていく事ができる。
その結果、
http://147.182.172.217:42100/v133791021
からは約16.3KBのファイルがダウンロードでき、
http://147.182.172.217:42100/v133791022
では version not found と表示された。
http://147.182.172.217:42100/v133791021
からダウンロードしたファイルに strings
コマンドをかけると、flagが得られた。
Then, obtain the number for the center of current range by executing m()
and access an URL with the number.
If it yielded "version not found", execute r = m()
. Otherwise, execute l = m()
. This updates the range.
Executing m()
after that yields the number of for the center of new range.
We can nallow the range which has the border of whether to yield "version not found" or not by repeating this.
As a result, I found that
http://147.182.172.217:42100/v133791021
yields a file that is about 16.3KB, and that
http://147.182.172.217:42100/v133791022
shows "version not found".
I obtained the flag by applying the strings
command to the file downloaded from http://147.182.172.217:42100/v133791021
.