Storage Cracker【Turing Complete編】
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです😀
Storage Crackerステージ
Storage Crackerステージのゴールは、パスコードを解読することです。
正しいパスコード(番号)を出力するとクリアになります。
ステージのLevel log
ステージ開始時の説明は次の通りです。
The security access door to the storage room is broken and it keeps locking our old janitor inside. The door keeps changing the passcode, we need a program that can recover the passcode at any time.
The easiest way to find the passcode would be to try all combinations unitl you find the right one. Although the broken mechanism does make weird beep when your guess is too high, you might be able to use that to your advantage.
You win this level when you output the correct passcode, no output will fail the level. Additionally, the input will be 1 after a guess that was too high and 0 otherwise.
Storage Crackerステージを解く
1:プログラムを設計する
シンプルに総当たりでパスコードを解読することにします。
「0からスタートして出力⇒インクリメントして出力⇒インクリメントして出力⇒・・・」というロジックになります。パスコードの桁数はわかりませんが、このアプローチならいつか解析に成功するはずです。
2:プログラムを実装する
ループ処理を実現するには、labelとジャンプ命令を組み合わせます。
Conditionモードには常にONを意味するInstructionビット列がありますので、これに"JMP"という名称をつけてジャンプ命令として定義しました。使い方としては、ジャンプ命令の直前にラベルを記述します。これは即値扱いでREG 0に格納されるので、ジャンプ命令によってそのラベルを作った行("label <ラベル名>"を記述した行)にジャンプすることになります。ャンプ直前に
実装すると、次に示すプログラムになりました。
※今回は従来のアセンブリー言語風に記述していますが、"regX_to_regY"という命令で記述しても構いません。コメントをつけたので、それを参考にして実装してください。
# REG2はインクリメント増分.
1 # REG0←即値0
mov+reg2_dest # REG2←REG0
# 0を出力.
0 # REG0←即値0
out # Output←REG0
# 1以降をループしながら出力.
label loop_for_bruteforce
add # REG3←REG1+REG2
mov+reg3_src # REG0←REG3
out # Output←REG0
mov+reg3_src+reg1_dest # REG1←REG3
loop_for_bruteforce # ループ先を指定.
JMP
3:テストする
最初はプログラムが期待する動きをするか確認するために、[Next]ボタンを使ってステップ実行していきます。
「きちんとループ処理されていること」「左側のOUTPUTSが0から順にインクリメントされていること」に注目します。
うまく動いていたら、[Run]ボタンでプログラムを実行させます。
解析には時間がかかるので、しばらく眺めていましょう。206を出力した時点でクリアしたことを伝える画面が出ます。つまり、パスコードは206だと判明しました。