題目來源:https://class.nckuctf.org/challenges#Ez_asm0-48
asm3.txt :
<+0>: endbr64
<+4>: push rbp
<+5>: mov rbp,rsp
<+8>: mov DWORD PTR [rbp-0x14],edi
<+11>: mov QWORD PTR [rbp-0x20],rsi
<+15>: mov DWORD PTR [rbp-0x4],0x9fe1a
<+22>: cmp DWORD PTR [rbp-0x4],0x2710
<+29>: jle 0x55555555514e <main+37>
<+31>: sub DWORD PTR [rbp-0x4],0x65
<+35>: jmp 0x555555555152 <main+41>
<+37>: add DWORD PTR [rbp-0x4],0x65
<+41>: mov eax,DWORD PTR [rbp-0x4]
<+44>: pop rbp
<+45>: ret
重點行數:<+15>: mov DWORD PTR [rbp-0x4],0x9fe1a
<+22>: cmp DWORD PTR [rbp-0x4],0x2710
<+29>: jle 0x55555555514e <main+37>
<+31>: sub DWORD PTR [rbp-0x4],0x65
<+35>: jmp 0x555555555152 <main+41>
<+41>: mov eax,DWORD PTR [rbp-0x4]
<+15> 將 0x9fe1a 儲存到記憶體位址 [rbp-0x4]
<+22> 比較記憶體位址 [rbp-0x4] 中的值與 0x2710
<+29> 若比較結果為小於或等於(jle),則跳到 <+37>
<+31> 若沒有跳轉,則將記憶體位址 [rbp-0x4] 的值減去 0x65
<+35> 減完後直接跳到 <+41>
<+37> 若有跳轉到這裡,則將記憶體位址 [rbp-0x4] 的值加上 0x65
<+41> 將記憶體位址 [rbp-0x4] 中的值儲存到暫存器 eax
因此可得出:
eaz = 0x9fe1a - 0x65
654874 - 101 = 654773
依此可得出解答