Assembly 装配-安全竞争
我参加了名为“代码大师-极限”的比赛 在这次比赛中,8086总成中有保险箱和钥匙。 一个保险柜和一把钥匙有一个联合的数据段,你需要制作一把打破保险柜的钥匙。 保险柜示例:Assembly 装配-安全竞争,assembly,x86-16,corewars,Assembly,X86 16,Corewars,我参加了名为“代码大师-极限”的比赛 在这次比赛中,8086总成中有保险箱和钥匙。 一个保险柜和一把钥匙有一个联合的数据段,你需要制作一把打破保险柜的钥匙。 保险柜示例: L: mov ax, [1234] cmp ax, 5678 jne L 打开保险柜的钥匙示例 L: mov ax, 5678 mov [1234], ax jne L 现在我有一个保险箱,我不能打破它 and al, 0FEh push ax clc mul ax
L:
mov ax, [1234]
cmp ax, 5678
jne L
打开保险柜的钥匙示例
L:
mov ax, 5678
mov [1234], ax
jne L
现在我有一个保险箱,我不能打破它
and al, 0FEh
push ax
clc
mul ax
xor ax, dx
or al, 1
loc_10A:
sub [0A2h], ax
pop ax
push ax
jnz loc_10A
保险箱和钥匙的模拟是在内部完成的。保险箱和钥匙都是战争幸存者的情况如下: 幸存者不能在固定地址上加载,因为游戏 引擎每转一圈将它们加载到一个随机地址。那些节目 生成的必须是COM而不是EXE,并且只包含8086指令 每个幸存者都会收到一套自己的完整寄存器 (登记册),其他幸存者无法访问。在里面 此外,每个幸存者都有一个2048字节的“个人”堆栈,即 其他幸存者也无法进入 在运行游戏的第一轮之前,游戏引擎 将竞技场中的所有字节初始化为值0CCh(注意:此 字节值是“不受支持”的指令-详细信息如下)。那引擎呢 将每个幸存者加载到竞技场内存中的随机位置,即- 按原样复制幸存者文件的内容。这个 两名幸存者之间的距离,以及两名幸存者之间的距离 幸存者和竞技场边缘,保证至少1024人 字节。每个幸存者的代码最大为512字节 在第一轮之前,游戏引擎初始化寄存器(的 每个幸存者)的值设置为以下值:
- BX、CX、DX、SI、DI、BP-重置
- 标志-重置
- AX,IP-初始幸存者的位置,由游戏引擎加载幸存者的竞技场中的随机偏移量
- CS,DS-竞技场中所有幸存者共有的部分
- ES-同一组幸存者共享的记忆片段(见高级技术)
- SS-幸存者个人堆栈的开始部分
- SP-偏移幸存者个人堆栈的开始
- 运行非法指令(例如:未转换为任何汇编指令的字节060h)
- 由游戏引擎运行“不受支持”的指令(例如:“INT 021h”)。游戏引擎阻止运行试图启动的指令 与操作系统或计算机硬件的直接通信。 尝试访问不在竞技场范围内的内存, 而且不在幸存者的“个人”范围内
- 攻击其他幸存者是通过在竞技场内存中写入关于他们的代码的信息来完成的(为了让他们执行其中一项任务) 上述三项行动),并因此取消其资格。早期的, 因此,我们必须找到他们藏身的地方:)
首先,AX是未知的,计算是无意义的,但
push AX代码>。稍后,从循环的第二个过程开始,AX被popped,但仍然未知且保持不变,因此您需要捕获2个“memory var”值之间的差异,它将是AX值。诸如此类:
mov cx, 0ah;
delay:
nop;
loop delay;
l2:
mov ax, [0A2h];
mov bx, [0A2h];
sub ax, bx
jz l2;
mov [0A2h], ax;
jmp l2
首先,AX是未知的,计算是无意义的,但push AX代码>。稍后,从循环的第二个过程开始,AX被popped,但仍然未知且保持不变,因此您需要捕获2个“memory var”值之间的差异,它将是AX值。诸如此类:
mov cx, 0ah;
delay:
nop;
loop delay;
l2:
mov ax, [0A2h];
mov bx, [0A2h];
sub ax, bx
jz l2;
mov [0A2h], ax;
jmp l2
你的问题是什么?那个例子没有多大意义。原来的锁码你改了?如果是,为什么不干脆jel
。如果您在原始锁之前添加了该键,则L
标签和jne L
不属于该键(如果ZF=0,它甚至可以执行无限循环)。如果该锁已在运行,则ax
是随机的,甚至是常数0-64k,因此您可以做一些类似nopasara的聪明的事情来回答,或者只是每隔两个周期(不要太快)将每个偶数放入[0A2h],直到意外地找到正确的一个为止。(解锁是否有限制?)你的问题是什么?这个例子没有多大意义。原来的锁码你改了?如果是,为什么不干脆jel
。如果您在原始锁之前添加了该键,则L
标签和jne L
不属于该键(如果ZF=0,它甚至可以执行无限循环)。如果该锁已在运行,则ax
是随机的,甚至是常数0-64k,因此您可以做一些类似nopasara的聪明的事情来回答,或者只是每隔两个周期(不要太快)将每个偶数放入[0A2h],直到意外地找到正确的一个为止。(解锁是否有限制?)欢迎使用StackOverflow。请不要只是张贴代码;张贴解释。看见另外,请参见。欢迎来到StackOverflow。请不要只是张贴代码;张贴解释。看见另外,请参见。