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
核心流程:
- 保存初始AX到栈,初始化内存
[0D5h]为0,CX设为2 - 进入内层循环:将AX累加到
[0D5h],把AX替换为[0D5h]的值,再乘以CX,CX自增1 - 每次循环末尾检查
[0D5h]是否等于0D287h,不满足则继续循环 - 内层循环退出后,恢复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
相关产品推荐
相关产品推荐

