Bit-O-Asm-4
Q.
eaxレジスタの値は?
<+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
最初の命令で関数の準備を行い、edi と rsi をスタックに保存する。[rbp-0x4] には 0x9fe1a を代入する。
<+22>: cmp DWORD PTR [rbp-0x4],0x2710
cmp は2つの値を比較し、差に応じてフラグを更新する。メモリ上の値は変更しない。
[rbp-0x4] - 0x2710
= 0x9fe1a - 0x2710
= 0x9d70a
= 644874
結果は正なので、符号付き比較の「以下」は偽になる。
<+29>: jle 0x55555555514e <main+37>
jle は符号付きで左辺が右辺以下なら <+37> に移動する。今回は移動せず、<+31> を実行する。
<+31>: sub DWORD PTR [rbp-0x4],0x65
[rbp-0x4] から 0x65 を引く。
[rbp-0x4] = 0x9fe1a - 0x65
= 0x9fdb5
= 654773
次の jmp で <+41> に移動する。<+37> の add は実行しない。
<+35>: jmp 0x555555555152 <main+41>
<+41> で [rbp-0x4] の値を eax に読み込む。
<+41>: mov eax,DWORD PTR [rbp-0x4]
その後、関数から戻る。
<+44>: pop rbp
<+45>: ret
最終的な eax の値は 654773。
picoCTF{654773}