2016-11-05 63 views
-1

我參加了名爲'代碼大師 - 極限'的競賽 在本次比賽中,保險箱和組合鍵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 

斧頭關鍵是隨機介於0 -64K

+1

你的問題是什麼? – fuz

+0

這個例子沒有多大意義。所以你確實改變了原來的鎖碼?如果是的話,爲什麼不只是'je L'。如果您在原始鎖定之前添加了該鍵,那麼'L'標籤和'jne L'不屬於該鍵(如果ZF = 0,甚至可以進行無限循環)。 – Ped7g

+1

如果這個鎖已經在運行,那麼'ax'是隨機的,甚至是恆定的0-64k,所以你可以做一些像nopasara那樣聰明的回答,或者每隔幾個週期將每個偶數放入[0A2h]太快),直到你意外擊中了正確的一個。 (是否有一些解鎖限制?) – Ped7g

回答

2

首先AX是未知的,計算沒有意義,但是push ax;。之後,從循環AX的第2遍開始,它會變爲poped,但仍然是未知的並且是常量,因此您需要捕獲2個「內存變量」值之間的差異,並且它將爲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 
+0

感謝您的幫助:) –

+0

對我來說,* L2 *循環是一個無限循環。或者你知道* 0A2h *內存字是隨時間異步變化的嗎? –