WebページのURLと、サーバのファイル一式が与えられた。
このWebページは、Pythonのプログラムを送信すると、
2個の引数の和を返す関数f(a, b)
が10ケース中何ケースで正しく動作したかを表示するものであった。
与えられたファイル中のtask/yeet.py
を読むと、プログラムと同じディレクトリにflag.txt
がある状態で実行され、
各ケースの実行の間で状態はリセットされないことが読み取れた。
従って、今何ケース目なのかをカウントし、それに応じてわざと誤答を返すことで、1回のクエリで0~10の11通りの情報を読み取ることができる。
以下のプログラムを送信すると3ケースで正解になったので、flag.txt
のサイズは33バイトであるとわかった。
An URL of a web page and the files for the server were given.
On the page, we can send a Python program and it displays the number of cases among 10 cases in which
a function to return the sum of two arguments f(a, b)
correctly worked.
Reading task/yeet.py
in the given files, I found that the program is executed in an environment
as if there is flag.txt
in the same directory as the program,
and that the status is not reset between execution for each cases.
This means that we can get 11 kinds of information (0-10) per query by counting the executed cases and intentionally returning wrong answer according to the count.
Sending this program resulted in correctly working in 3 cases. This means that the size of flag.txt
is 33 bytes.
さらに、以下のプログラムは0ケースで正解になったので、
flag.txt
の内容はcorctf{
で始まって}
と改行で終わることがわかった。
Also, this program correctly worked in 0 cases.
This means that the contents of flag.txt
begins with corctf{
, and ends with }
followed by a newline character.
これらの情報を利用し、以下のプログラムでflag.txt
の残りの部分を読み取った。
ルールよりflagは0x20~0x7eの95通りの文字のみを含むので、2回のクエリで1文字を読み取ることができる。
pos
の値により読み取る文字を設定し、%
を//
に変えることでもう一方の桁を読み取ることができる。
Based on these information, I read the remaining part of flag.txt
using the following program.
According to the rule, the flag contain only 95 kinds of characters (0x20 - 0x7e), so we can use 2 queries to read 1 character.
The character to read can be set by the value of pos
.
You should change %
to //
to read the other digit.
結果、以下のデータが読み取れた。
As a result, I read following data:
これを以下のプログラムで文字列に変換した。
I converted this result via this program:
得られた結果にcorctf{}
を付け足すことで、flagが得られた。
I obtained the flag by adding corctf{}
to the result.