ksnctf Q.7


program.cpp というファイルが配布されている。

このファイルは空白とタブがごちゃまぜになった cpp プログラムに見える。

例に違わず僕のこれは cpp だと確信していたため、このプログラムをみて思った。

「くそ汚いな」

とはいっても、cpp は普通に実行できるはずだ。

そこで gcc でコンパイルして実行してみる。

$ ./a.out

FROGThisiswrong:(

ムカつく顔である。

いま思えばこの顔に全てを狂わされたのかもしれない。

この文字列の形式から FLAG の文字列に似ているため、ひたすら cpp デバッグした。

しかし、お察しの通り.cpp はフェイクだ。

僕はこれに気づかず長い時間を gdb に費やした。

しかし、どうしてもわからないため write up をみることに。

少しだけ write up をみると、writespace というプログラミング言語があるとのこと。

なんと、空白とタブと改行だけで記述するプログラミング言語があるのだ。

そのヒントをもらって、僕は whitespace インタープリタを探し、 見つけた下のサイトで実行した。

http://127.0.0.1:5500/naokikp.github.io/wsi/whitespace.html

このサイト、なんとステップ実行ができる。

すると、jmpz するまえに、ある数字でスタックの値を引いていることがわかった。

jmpz はスタックの一番上が、0 かどうかで条件分岐するから、その引いている値と同じ値になるように、 標準入力を調整してやれば、完了だ。