TCPサーバの接続情報と、サーバのプログラムが与えられた。
サーバは与えられた条件を満たす文字列の置換規則を入力させるものだった。
redpwnCTF 2021 の the-substitution-game
に続いてまたMarkov Algorithm Online的なやつである。
今回は停止規則にも対応しており、さらにMAOに近づいている。
the-substitution-game用のシミュレータが、
置換規則の区切り文字をテキストエディタで置換して入力することで今回も役立った。
3ステージをクリアすることでflagが得られた。
Information to connect to a TCP server and the server program were given.
The server asked us to enter a set of replacement rules for strings that satisfies the condition.
Something like Markov Algorithm Online again!
(the previous one is "the-substitution-game" in redpwnCTF 2021)
This challenge supports the terminating rule and is closer to MAO.
My simulator was also helpful for this challenge
with replacing the delimiter in the rules via a text editor.
I obtained the flag by solving 3 rounds.
strellic
が何回か繰り返された入力を、1個のjsgod
に置換することが求められた。
the-substitution-game の Level 4に似ているが、
入力と出力が被らないのでこっちのほうが簡単である。
strellic
が2個連続していたら1個にすることで減らしていき、最後に1個残ったstrellic
をjsgod
に置換すればよい。
The task was replacing strellic
repeated some times to one jsgod
.
This looked like the Level 4 in "the-substitution-game",
but this challenge is easier because the output and input don't overlap.
This can be archived by reducing strellic
by replacing two consecutive occurrences of that to one,
and replacing the last one occurrence of strellic
to jsgod
.
11010000^10111001
を1101001
にするというように、
与えられた2進数値をそのXORに置換することを求められた。
これは、以下のようにすることで実現できた。
^
の左側の0
や1
を、別の記号(z
とo
)に変換し、右に送る-
と+
)に変換する-
と+
を0
と1
に戻す0
を消去する^
を消去し、完成させる
The task was replacing two binary numbers to their XOR
like replacing 11010000^10111001
to 1101001
.
I archived this in the following way:
0
or 1
at the left of ^
to another mark (z
or o
) and send it to the right.-
or +
).-
and +
to 0
and 1
.0
at the top.^
to complete the replacement.
1110111x10101011
を100111101111101
にするというように、
与えられた2進数値をその積に置換することを求められた。
これは、以下のようにすることで実現できた。
=
と答え0
を入れる。この処理の前の状態と区別するため、x
を*
に置換する。*
の左の0
や1
を、別の記号(z
やo
)に変換して右に送る。z
が右の数値の右端に着いたら、次の桁のために右の数値の右端に0
を足して2倍にし、2に戻る。o
が右の数値の右側に着いたら、次の桁のために右の数値の右端に0
(次の手順に合わせて-
で表現する)を足して2倍にし、文字C
を生成して数値のコピーを開始する。C
をコピー位置の基準にし、右の数値の0
と1
をv
と^
で表現して答えに足すためにコピーする。
コピーした0
や1
は-
や+
に変換する。-
や+
を0
や1
に戻し、C
を消去する。v
や^
で表現された右の数値のコピーを答えに加算する。
n
やp
で表現して右に送る。n
やp
が答えの右端に着いたら、加算を行い、結果をN
かP
で表現する。c
を生成し、答えのまだ加算処理をしていない部分に1を加算する。N
やP
を0
や1
に戻す。*
を消去する。0
を消去する。=
を消去する。
The task was replacing two binary numbers to their product
like replacing 1110111x10101011
to 100111101111101
.
I archived this in the following way:
=
and the (tentative) answer 0
to the right of the right number.
To distiguish it from the status before this process, replace x
with *
.0
or 1
at the left of *
to the right with replacing to another mark (z
or o
).z
arrives at the right end of the right number,
append 0
at the right end of the right number to double the right number for process of next digit and go back to the step 2.o
arrives at the right end of the right number,
append 0
(expressed as -
for the next step) at the right end of the right number to double the right number for process of next digit.
Then, put the mark C
to start copying the number.0
and 1
as v
and ^
for work.
Use the mark C
to decide where to copy from.
After copying, replace 0
or 1
with -
or +
.-
and +
to 0
and 1
and remove C
.v
and ^
) to the (tentative) answer.
n
or p
.n
or p
arrives at the right end, perform addition and express the result as N
or P
.c
and add one to the unprocessed part of the (tentative) answer.N
and P
to 0
and 1
.*
.0
at the top.=
.