![[ksnctf] Programming [ksnctf] Programming](/images/7/1/0/4/e/7104e5ea0f5ef6c49b0b28d9d86df69a00299f9e-07.png)
ksnctfにチャレンジ 第7問目です。
※ksnctfは常駐型のCTFサイトです。 ※問題のページはコチラです。
Programming
一見C++に見えるかなりおかしなインデントのソースコードが渡されます。 これを indent コマンドで整形して眺めたり 実際に実行してみても全く意味のあるコードになりません。
となるとこのおかしなインデントに意味があるはずですが、 スペース と タブ がランダムに挿入されています ここで whiitespaceという難解プログラミング言語を思いつくか どうかが鍵です。
Brainfuck やその派生言語はよく見かけますが 難解プログラミングなど検索したことがあれば 難解プログラミング言語のなかではメジャーなので(?) 結構趣味で処理系を公開している人もいたりいなかったり します。
>参考 whitespace
知っていた中ではこの処理系が使いやすいので これを使います。
まず、どんなプログラムか
$ ./whitespace.out -m program.cpp
これでニーモニックが見れます。
まぁじっくり読まなくても
STACK_PUSH X
IO_PUT_CHAR
この部分は ASCII文字の出力しているのは一目瞭然 なので出力されるはずの文字が分かるのですが一応ちゃんとやります
0035: IO_READ_NUM
0036: STACK_PUSH 0
0041: HEAP_LOAD
0042: STACK_PUSH 33355524
0047: ARITH_SUB
0048: FLOW_BEZ 66
ここがポイントです。 入力された数値と 33355524 の差をとって 0なら 0+066 にジャンプしています。
つまりこのコードは PIN: と表示して 33355524 と入力されたら FLAGを表示 それ以外なら NO と表示して終了 する というプログラムのようです。
というわけで
これで無事FLAGが取得できます。