1

私は金庫大会をやっていて、この金庫を手に入れました:

start:
add     ds:0DEDh, ax
xor     cx, cx
loop    start

私の理解では、 cx はループの最後で 0 になり、次の反復で FFFF に変わります。また、0xCCh がプログラムを停止させる不正な命令であることもわかっています。どうすればこの金庫を破ることができますか?

**編集: ここでの目標は、この無限ループを止めることです。ループには停止期間がなく、リバース エンジニアリングを使用してループを停止させる必要があります。例: これは単純な金庫です。

safe:
  mov     ax, ds:4D2h
  cmp     ax, 1000h
  jl      safe 

これは、リバース エンジニアリングを使用して記述されたキーです。

mov bx, 1000h
mov [4D2h], bx    
l:
    jmp l

この金庫のシミュレーションは、 Core Wars 8086 エンジン内で行われます。セーフキーの両方が戦争の生存者である場合のルールは次のとおりです。

ゲーム エンジンは毎ターンランダムなアドレスにロードするため、生存者は固定アドレスにロードすることはできません。生成されるプログラムは、EXE ではなく COM である必要があり、8086 命令のみが含まれています。

各生存者は、他の生存者がアクセスできない独自の完全なレジスタ (レジスタ) のセットを受け取ります。さらに、各サバイバーには 2048 バイトの「個人用」スタックがあり、これも他のサバイバーからはアクセスできません。

ゲームの最初のラウンドを実行する前に、ゲーム エンジンはアリーナ内のすべてのバイトを値 0CCh に初期化します (注: このバイト値は「サポートされていない」命令です。詳細は後述します)。次に、エンジンは各サバイバーをアリーナ メモリのランダムな場所にロードします。つまり、サバイバー ファイルの内容をそのままコピーします。2 人のサバイバー間の距離、およびサバイバーとアリーナの端の間の距離は、少なくとも 1024 バイトであることが保証されています。各サバイバーのコードは最大 512 バイトです。

最初のラウンドの前に、ゲーム エンジンは (各生存者の) レジスタを次の値に初期化します。

  • BX、CX、DX、SI、DI、BP - リセット。
  • フラグ - リセット。
  • AX、IP - 最初のサバイバーの位置。ゲーム エンジンによってサバイバーがロードされるアリーナ内のランダム オフセット。
  • CS、DS - すべてのサバイバーに共通のアリーナのセグメント。
  • ES - 同じグループの生存者が共有するメモリのセグメント (セグメント) (高度なテクニックを参照)。
  • SS - 生存者の個人スタックの最初のセクション。
  • SP - オフセット サバイバーの個人スタックの開始。

この時点で、ゲームはラウンドで開始され、各ラウンドでゲームエンジンが実行され、各生存者の次の命令が実行され、ゲームが終了するまで: 200,000 ラウンド後、または単一の生存者がアリーナに残るとき。生存者が各ラウンドでプレイする順序は、ゲームの開始時にランダムに決定され、その間は変更されません。

次の場合、サバイバーは失格となります。

  • 不正な命令の実行 (例: アセンブリ命令に変換されないバイト 060h)。
  • ゲーム エンジンによる「サポートされていない」命令の実行 (例: 「INT 021h」)。ゲーム エンジンは、オペレーティング システムまたはコンピュータ ハードウェアとの直接通信を開始しようとする命令の実行を防ぎます。アリーナの領域内になく、生存者の「個人的な」スタックの領域内にないメモリにアクセスしようとします。
  • 他のサバイバーを攻撃するには、コードに関する情報をアリーナ メモリに書き込み (上記の 3 つのアクションのいずれかを実行させるため)、その結果、彼らを失格にします。したがって、以前に、彼らが隠れている場所を見つける必要があります:)
4

2 に答える 2