标签: corewars

Core Wars 8086 安全挑战(在内存地址上安全使用加法)

我正在做一个保险箱比赛,我得到了这个保险箱:

start:
add     ds:0DEDh, ax
xor     cx, cx
loop    start
Run Code Online (Sandbox Code Playgroud)

根据我的理解,cx 在循环结束时将为 0,并在下一次迭代时更改为 FFFF。我也知道 0xCCh 是会停止程序的非法指令。我怎样才能破解这个保险箱?

**编辑:这里的目标是停止这个无限循环。循环没有停止项,我需要以某种方式让它停止使用逆向工程。例如:这是一个简单的保险箱

safe:
  mov     ax, ds:4D2h
  cmp     ax, 1000h
  jl      safe 
Run Code Online (Sandbox Code Playgroud)

这是它的关键,使用逆向工程编写:

mov bx, 1000h
mov [4D2h], bx    
l:
    jmp l
Run Code Online (Sandbox Code Playgroud)

这种保险箱钥匙的模拟是在Core Wars 8086 引擎内完成的。该规则是如下,其中既安全关键是在战争中的幸存者:

幸存者不能在固定地址上加载,因为游戏引擎每回合都会将它们加载到一个随机地址。生成的程序必须是 COM 而不是 EXE,并且只包含 8086 条指令。

每个幸存者收到一组自己的完整寄存器(寄存器),其他幸存者无法访问。此外,每个幸存者都有一个 2048 字节的“个人”堆栈,其他幸存者也无法访问。

在运行第一轮游戏之前,游戏引擎将竞技场中的所有字节初始化为值 0CCh(注意:此字节值是“不支持”的指令 - 详情如下)。然后引擎将每个幸存者加载到竞技场内存中的随机位置,即 - 完全按原样复制幸存者文件的内容。两个幸存者之间的距离,以及幸存者与竞技场边缘之间的距离,保证至少为 1024 字节。每个幸存者的代码最多有 512 个字节。

在第一轮之前,游戏引擎将(每个幸存者的)寄存器初始化为以下值:

  • BX、CX、DX、SI、DI、BP - 重置。
  • 标志 - 重置。
  • AX, IP …

assembly reverse-engineering nasm x86-16 corewars

1
推荐指数
1
解决办法
372
查看次数

标签 统计

assembly ×1

corewars ×1

nasm ×1

reverse-engineering ×1

x86-16 ×1