Bit-O-Asm-3

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-0xc],0x9fe1a
<+22>:    mov    DWORD PTR [rbp-0x8],0x4
<+29>:    mov    eax,DWORD PTR [rbp-0xc]
<+32>:    imul   eax,DWORD PTR [rbp-0x8]
<+36>:    add    eax,0x1f5
<+41>:    mov    DWORD PTR [rbp-0x4],eax
<+44>:    mov    eax,DWORD PTR [rbp-0x4]
<+47>:    pop    rbp
<+48>:    ret

まず関数の準備と値の保存を行う。

<+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-0xc],0x9fe1a
<+22>:    mov    DWORD PTR [rbp-0x8],0x4

edi と rsi をスタックに保存する。[rbp-0xc] に 0x9fe1a、[rbp-0x8] に 0x4 を代入する。

次に、0x9fe1a を eax に読み込み、0x4 を掛ける。

<+29>:    mov    eax,DWORD PTR [rbp-0xc]
<+32>:    imul   eax,DWORD PTR [rbp-0x8]

この時点の値は次の通り。

eax = 0x9fe1a
eax = 0x9fe1a × 0x4
   = 0x27f868
   = 2619496

imul の結果は eax に格納される。

次に、eax に 0x1f5 を加算する。

<+36>:    add    eax,0x1f5

0x1f5 は10進数で 501。計算結果は次の通り。

eax = 0x27f868 + 0x1f5
    = 0x27fa5d
    = 2619997

計算結果を [rbp-0x4] に保存し、もう一度 eax に読み込む。

<+41>:    mov    DWORD PTR [rbp-0x4],eax
<+44>:    mov    eax,DWORD PTR [rbp-0x4]

最後に関数から戻る。eax の値が答えになる。

<+47>:    pop    rbp
<+48>:    ret

答えは 2619997。

picoCTF{2619997}