3 ポイント 投稿者 GN⁺ 2023-08-12 | 1件のコメント | WhatsAppで共有
  • OFRAK Tetrisは、ブラウザ上でARM命令が落ちてくるテトリス風ゲームで、ブロックをそろえる代わりに命令を配置してプログラムの実行フローを作る
  • 落下する命令ガジェットは回転させてから固定され、固定された命令のうち画面上部にあるものだけが実行される
  • スコアはR12が指すメモリアドレスに保存され、R0〜R12、LR、PC、SPとメモリダンプを見ながら状態を追跡できる
  • 時間切れ、不正なメモリアクセス、不正なアドレスへのジャンプが発生するとGame overとなり、実行が終了する
  • シングルステップ実行、音楽トグル、論理命令、無限モード、落下間隔、最大ガジェットサイズなどのオプションで難易度と実行方式を調整できる

ARM命令で進行するテトリス

  • OFRAK Tetrisは、ARM命令で構成されたガジェット(gadget)が落ちてくるテトリス風ゲーム
  • ユーザーは落下する命令を回転させたうえで左側に固定し、実行フローを作る
  • 実行ルール

    • 命令は上から下へ落下する
    • ユーザーは命令を回転させて固定する
    • 固定された命令のうち一番上の命令だけが実行される

画面で確認する実行状態

  • 現在の実行対象の命令とアドレスが一緒に表示される
    • 例: add PC, PC, #61
    • 例: 00010000, 00010004, 00010008
  • レジスタとメモリの状態を見ながら実行結果を追跡できる
    • R0〜R12、LR、PC、SPの値が表示される
    • メモリ領域は16進数アドレスと、0で埋められた値の形式で表示される
    • スコアはScore: 0のように表示される

スコア保存とゲーム終了条件

  • スコアはR12が指すメモリアドレスに保存される
  • 次のいずれかが発生するとゲームが終了する
    • 時間切れになる
    • 不正なメモリにアクセスする
    • 不正なアドレスへジャンプする
  • 終了画面にはGame over.とハイスコア入力欄が表示される

操作と設定

  • 基本操作には、シングルステップ実行、ガジェット固定、レジスタ回転、音楽の再生/一時停止、説明の表示/非表示が含まれる
  • ゲームパッドのキーバインド設定も提供される
    • Single Step

    • Toggle Music

    • Lock In

    • Rotate Instructions Up / Down / Left / Right

      • Toggle Game Instructions
      • ゲーム設定で実行条件と難易度を調整できる
      • Score multiplier
      • Enable Logical Instructions
      • Infinite mode
      • Seconds between drops
      • Maximum gadget size

DEF CON現地イベント

  • DEF CONにいるユーザーは、Red Balloon Securityのテーブルを訪れてCar Hacking VillageでTetrisを一緒にプレイできる
  • 十分に高いスコアを獲得した人には賞品が提供される予定

1件のコメント

 
GN⁺ 2023-08-12
Hacker News のコメント
  • アセンブリの作業経験がほとんどないプログラマーの立場からすると、学習に向いた素晴らしいツールです。
    各命令が何をするのかを見るために、別タブでチートシートを開いていました。
    ただ、最初のセグフォルトのせいで最高スコアが -48億になったのは少し残念でした :-P

  • 本当に素晴らしい! 今のところ最高スコアは 65612 まで出ました。
    フィードバックとしては、ヘルプメニューを開いたときに閉じ方が明確ではなく、おそらく ? をもう一度押すしかないようです。
    Goblin の音楽が気に入っていますし、命令をいじるのに良いインターフェースと色分けも良いです。
    命令実行の効果を事前に見られて、ゲーム終了後にプログラムを修正できるサンドボックスモードがあれば、ARM アセンブリを学ぶ人にはかなり役立ちそうです。

    • サンドボックスモードのアイデアは気に入りました。
      このゲームを作りながら数時間プレイしてみたところ、ARM アセンブリを読む速度が確実に上がりました。
  • 「スコアは R12 が指すアドレスのメモリに保存されます」を見て笑わずにはいられませんでした。
    共有してくれてありがとう。DEFCON が恋しくなりました。行けるのはたぶん来年になりそうです。

    • R12 の何が面白かったのか教えてもらえますか?
    • 命令やアドレスが何かをほとんど知らない立場としては、「スコアは R12 が指すアドレスのメモリに保存されます」が何を指しているのか気になります。
      返信前からページを開いたままだったので、更新するまで回答が見えませんでした。
  • これまで試した良い戦略は 2 つあります。
    1 つ目は、PC をできるだけ多くのレジスタにばらまき、それらのレジスタをできるだけ何度も足し合わせてから、合計をアドレス 0 やスコアのある場所に保存する方法です。
    2 つ目は、以前の PC 値から組み立てられた命令を整数としてレジスタに読み込み、たいてい負数に見えるので、減算で負でない値にしてからスコア位置に保存する方法です。
    他の人がどんな戦略を試したのか気になります。

  • コンセプトは本当に素晴らしいのですが、私のアセンブリ理解度が低すぎます :)
    スコアは R12 に保存されると書いてありますが、R12 が 0 なのに、なぜスコアが 16 なのか分かりません。
    https://imgur.com/a/RY5jhTu

    • R12 にはスコアのアドレスが入っています。
      この場合はアドレス 0、つまりデータセグメントの開始地点です。
      スコアレジスタは黄色で、そのレジスタが指す該当メモリ領域、つまり実際のスコアのバイト列も黄色で表示されます。
  • コンピューターには慣れていて、基本的なアセンブリも少し知っていますが、いや、これはまったく理解できませんでした。

    • 具体的に気になることがあれば説明できます。
      もっと広く言えば、ゲームをより分かりやすくする方法についての考えも知りたいです。
      命令を説明するマニュアルが役立つことは分かっていますが、ほかのアイデアも歓迎です。
  • 美しいブルータリズム UI/UXです。

  • プレイする前に「About」を押したところ、新しいページが開いてこう表示されました。「このサイトを使い続けることで、Cookie の使用に同意したものとみなされます」
    GDPR 違反のように見えます。Cookie を拒否する方法は、同意するのと同じくらい簡単であるべきです。
    特にこれらの Cookie はサイトの動作に必要でもなさそうです。
    「本サービスは Cookie およびピクセルタグ、Web ビーコン、クリア GIF、JavaScript などの類似技術を使用して、サーバーが Web ブラウザを認識し、訪問および利用のタイミングを把握し、傾向を分析し、ユーザーベースを理解し、本サービスを運営・改善します … 第三者がデバイスに配置した Cookie を含め、第三者から受け取った情報で収集情報を補完する場合もあります」
    https://ofrak.com/privacy/#tracking-tools-and-opt-out
    ページ下部でブラウザ設定から Cookie を削除するよう案内するのは、受け入れられる解決策ではありません。

    • 残念ながら、こうした慣行は多くのウェブサイトで行われており、多くの企業がCookie 法をきちんと守っていません。
      https://www.cnil.fr/en/refusing-cookies-should-be-easy-accep...
    • 私の環境では違法なものは保存しておらず、ゲーム設定だけを保存していましたが、なぜそのバナーが出るのか分かりません。
    • サイト訪問者にブラウザで Cookie を無効化するよう案内する方式は、まさに apple.com も使っています。
  • ゲームをどうビルドするのか気になります。
    https://ofrak.com/docs/environment-setup.html を見てみましたが、テトリスゲームに関する具体的な内容は見つけられませんでした。
    私が見落としているのかもしれません。

  • コンセプトが本当に気に入りました。
    高得点を得る鍵は、PC に 0 を書き込むことのように見えます。
    新しい命令のバイナリコードが右側に見えるメモリ領域に「追加」され、その後 R12 を操作してスコアを最大化できるからです。

    • もう 1 つの鍵は、R12 を 4 で割り切れない値に変えることです。
      すべての命令が 4 バイトで、最上位ビットが常に 1 だからです。
      何度かは 20億程度まで行きましたが、平均はかなり低いです ;)