crackme

密码是flag{Y0u_c4n_und3rst4nd_bin4ry!}

利用IDA PRO分析後發現,輸入的密碼有32個bytes,每個byte分別與key中的每個byte做XOR運算再XOR 1後與result對應的byte比較,可知只要反向將result中的每個byte先XOR 1再XOR key中對應的每個byte就是正確密碼。

我用我熟悉的工具Cheat Enging以匯編寫下了script做解碼,並利用64位特性來簡化動作,最後結果存在result

GlobalAlloc(Main, 10240)
Label(key)
Label(result)
Label(Begin)
Label(End)
registersymbol(result)
CreateThread(Main)

Main:
mov rax, key
mov rbx, result
mov r8, 0101010101010101
xor rdi, rdi
Begin:
cmp rdi, 20
je End
mov rcx, [rbx+rdi] // [result + offset]
xor rcx, r8
xor rcx, [rax+rdi]
mov [rbx+rdi], rcx
add rdi, 08
jmp Begin

End:
ret 08

key:
DB 43 64 38 56 77 30 48 34 48 79 4B 31 6C 31 4F 4F
DB 54 41 71 32 6A 6F 4B 49 77 71 4C 61 6B 4D 6B 61

result:
DB 24 09 58 30 0D 68 79 40 16 1B 7E 5E 32 45 20 2A
DB 66 32 03 47 5F 00 2E 17 14 19 23 54 18 35 4B 1D