Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 装配-安全竞争_Assembly_X86 16_Corewars - Fatal编程技术网

Assembly 装配-安全竞争

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

我参加了名为“代码大师-极限”的比赛 在这次比赛中,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
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-偏移幸存者个人堆栈的开始
在这一点上,游戏开始轮,每轮运行游戏引擎运行每个幸存者的下一条指令,直到结束 游戏规则:20万回合后,或者只有一个幸存者 在竞技场上。幸存者在每轮比赛中的顺序 是在游戏开始时随机确定的,而不是 在这期间改变

在下列情况下,幸存者被取消资格:

  • 运行非法指令(例如:未转换为任何汇编指令的字节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。请不要只是张贴代码;张贴解释。看见另外,请参见。