CoreWars安全挑战赛助力破解安全

问题描述 投票:0回答:1

我有这个保险箱1:

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]
设置为
0D287h
来打破内部循环,所以我知道框架可能会是这样的:

start:
    ;... get ax
    mov word [0D5h], 0D287h
    jmp start

至少我是这么理解的,请问有人有什么想法吗?


脚注1:安全挑战
对于那些不熟悉安全挑战的人,我先给出一个基本的解释:
你得到一个保险箱,它是 NASM 编译的汇编 8086 代码,它执行算术操作并且永远循环,为了赢得钥匙,它需要比保险箱运行更多的时间,这意味着它也必须永远循环,但也停止保险箱的循环。您可能会问,除了内存之外,钥匙和保险箱在所有方面都是分开的,例如,如果您想停止这个保险箱:

start:
    mov [0DAh], ax
    jmp start

这个保险箱的钥匙是:

start:
    mov bx, [0DAh]
    mov byte [bx], 0cch
    jmp start

assembly nasm emu8086 corewars
1个回答
0
投票

我从来不明白这些“安全挑战”是什么意思,但我立即看到了接下来的 2 个解决方案,它们阻止了保险箱的内循环,然后无限地重复:

  • AX = 53895 (D287h),其中
    jne looper
    从未被采用
  • AX = 17965 (462Dh) 其中
    jne looper
    被取 1 次

[0D5h]
处的字值依次变为x, 3x, 12x, 60x, 360x, ...
并且 D287h 恰好可以被 1 和 3 整除。

© www.soinside.com 2019 - 2024. All rights reserved.