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 かどうかで条件分岐するから、その引いている値と同じ値になるように、 標準入力を調整してやれば、完了だ。