当サイトの一部ページには、アフィリエイト・アドセンス・アソシエイト・プロモーション広告を掲載しています。

Amazonのアソシエイトとして、Security Akademeiaは適格販売により収入を得ています。

広告配信等の詳細については、プライバシーポリシーページに掲載しています。

消費者庁が、2023年10月1日から施行する景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題のある表現がありましたら、問い合わせページよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

Storage Cracker【Turing Complete編】

2023年9月12日

はじめに

いつもブログをご覧いただきありがとうございます。

FIRE生活中のIPUSIRONです😀

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だと判明しました。