【发布时间】:2021-03-21 04:27:21
【问题描述】:
我正在参加保险箱比赛,我得到了这个保险箱:
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
safe 和 key 的模拟在 Core Wars 8086 engine 内完成。 rules 如下,其中 safe 和 key 都是战争中的幸存者:
幸存者不能在固定地址上加载,因为游戏 引擎每轮将它们加载到一个随机地址。那些节目 生成的必须是 COM 而不是 EXE,并且只包含 8086 指令。
每个幸存者都会收到一组自己的完整寄存器 (寄存器),其他幸存者无法访问。在 此外,每个幸存者都有一个 2048 字节的“个人”堆栈,即 其他幸存者也无法进入。
在运行第一轮游戏之前,游戏引擎 将 arena 中的所有字节初始化为值 0CCh(注意:这 字节值是“不受支持”的指令 - 详情如下)。那么发动机 将每个幸存者加载到竞技场内存中的随机位置,即 - 完全按原样复制幸存者文件的内容。这 两个幸存者之间的距离,以及两个幸存者之间的距离 幸存者和竞技场边缘,保证至少1024 字节。每个幸存者的代码最大为 512 字节。
在第一轮之前,游戏引擎初始化寄存器(的 每个幸存者)到以下值:
- BX、CX、DX、SI、DI、BP - 重置。
- 标志 - 重置。
- AX, IP - 初始幸存者的位置,游戏引擎加载幸存者的竞技场中的随机偏移量。
- CS、DS - 所有幸存者共有的竞技场部分。
- ES - 同一组的幸存者共享内存的段(段)(请参阅高级技术)。
- SS - 幸存者个人堆栈的开始部分。
- SP - 偏移幸存者个人堆栈的开始。
此时游戏以回合开始,每一回合运行游戏引擎运行每个幸存者的下一条指令,直到结束 游戏结束:在 200,000 轮之后,或者当一个幸存者仍然存在时 在竞技场。幸存者在每轮比赛中的顺序 在游戏开始时随机确定,并且不 期间发生变化。
在以下情况下,幸存者将被取消资格:
- 运行非法指令(例如:字节 060h,不翻译成任何汇编指令)。
- 游戏引擎运行“不支持”指令(例如:“INT 021h”)。游戏引擎阻止尝试启动的运行指令 与操作系统或计算机硬件的直接通信。 尝试访问不在竞技场范围内的内存, 并且不在幸存者的“个人”堆栈范围内。
- 攻击其他幸存者是通过在竞技场内存中写入有关他们的代码的信息来完成的(为了让他们执行其中一项 以上三项行动),并因此取消他们的资格。早些时候, 因此,必须找到它们的藏身之处:)
【问题讨论】:
-
内存中的代码在哪里?
add可以修改代码字节吗?这里的目标到底是什么,你控制什么参数?我假设您可以选择寄存器内容或其他内容,并且您正在尝试安排执行以退出循环? “保险箱竞争”并不是一个非常知名的术语。 -
对于我们这些不知道此类比赛如何运作的人,您能否更清楚地解释您要完成的工作? “破解保险箱”意味着什么?
-
“钥匙”可以用不同的指令覆盖保险柜的机器码吗?这个保险箱对我来说没有多大意义。循环结构仅取决于寄存器(特别是 CX),而不是内存内容。
add ds:0DEDh, ax只在ds:0DEDh更改内存,所以除非这恰好与代码重叠,否则我认为没有办法通过将任何东西放在内存中的任何位置else 来解锁自己.此外,它所做的修改取决于安全“线程”的 AX 中的内容。你能以某种方式控制寄存器吗? -
我唯一的猜测是,也许你可以在进入循环之前设置
ds。在这种情况下,根据安全代码与 16 字节边界对齐的方式,您可能会得到add来修改其代码。但是如果没有对“规则”的更精确和详细的解释,我认为这是无法回答的。 -
@MichaelPetch:好的那是有道理的。如果 OP 花时间在那个详细程度进行解释(即使没有关于解决方案应该如何工作的部分),那么问题就不会首先解决。或者此时,可以在编辑后重新打开。但仅仅说“AX 是随机的”根本没有帮助。
标签: assembly nasm reverse-engineering x86-16 corewars