You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CoreWars安全挑战求助:如何找到AX值以终止安全循环

CoreWars 8086汇编安全挑战求解思路

安全挑战代码分析

先拆解目标安全代码的执行逻辑:

START:
    PUSH AX
    MOV word [0D5h], 0
    MOV CX, 2           
    looper:
    add [0D5h], AX      
    MOV AX, [0D5h]      
    MUL CX         
    INC CX      
    cmp word [0D5h], 0D287h
    jne looper
    POP AX
    JMP START

核心流程:

  1. 保存初始AX到栈,初始化内存[0D5h]为0,CX设为2
  2. 进入内层循环:将AX累加到[0D5h],把AX替换为[0D5h]的值,再乘以CX,CX自增1
  3. 每次循环末尾检查[0D5h]是否等于0D287h,不满足则继续循环
  4. 内层循环退出后,恢复AX并跳回START,进入外层无限循环

触发内层循环退出的AX值计算

要让内层循环终止,需让某次循环末尾的cmp判定[0D5h] == 0D287h,通过分析[0D5h]的变化规律,可得到以下有效初始AX值:

  • 第一次循环触发:第一次循环时[0D5h] = 初始AX,直接让AX等于目标值即可:

    AX = 0D287h
    
  • 第二次循环触发:第二次循环时[0D5h] = 初始AX * 3,解方程3*AX ≡ 0D287h mod 65536,可得:

    AX = 0462Dh (十进制17965,3*17965=53895=0D287h)
    
  • 后续循环无有效解:从第三次循环开始,[0D5h]的系数(12、60、360等)与65536的最大公约数无法整除目标值0D287h,因此没有可行解。

终止安全代码整体循环的关键

注意:即使内层循环退出,安全代码会通过JMP START重新初始化并进入循环,因此仅触发内层循环退出无法终止其无限运行,需结合以下操作:

方法1:破坏安全代码的指令

参考示例思路,找到安全代码中关键循环指令(如JMP START或jne looper)的内存地址,将其修改为0CCh(中断指令),让安全代码执行到该位置时停止。示例密钥代码:

start:
    mov word [0D5h], 0D287h  ; 触发内层循环退出,引导安全代码执行到外层循环关键指令
    mov byte [安全代码JMP_START的地址], 0CCh  ; 替换为中断指令,终止循环
    jmp start

方法2:持续锁定[0D5h]的值

若无法修改安全代码指令,可持续将[0D5h]设为0D287h,让安全代码每次进入内层循环后立即退出,大幅降低其运行优先级,间接达成终止循环的效果:

start:
    mov word [0D5h], 0D287h
    jmp start

内容的提问来源于stack exchange,提问作者Electric Ice Wolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:14:57