picoGym asm2 250 points
picoCTF2019で出題されたものですが、問題が少し変わっている&解説記事がないため記載
問題
asm2: <+0>: push ebp <+1>: mov ebp,esp <+3>: sub esp,0x10 <+6>: mov eax,DWORD PTR [ebp+0xc] <+9>: mov DWORD PTR [ebp-0x4],eax <+12>: mov eax,DWORD PTR [ebp+0x8] <+15>: mov DWORD PTR [ebp-0x8],eax <+18>: jmp 0x509 <asm2+28> <+20>: add DWORD PTR [ebp-0x4],0x1 <+24>: sub DWORD PTR [ebp-0x8],0xffffff80 <+28>: cmp DWORD PTR [ebp-0x8],0x63f3 <+35>: jle 0x501 <asm2+20> <+37>: mov eax,DWORD PTR [ebp-0x4] <+40>: leave <+41>: ret
asm2(0xb,0x2e)として引数を付けた場合のasm2関数の戻り値を答える問題
解説
DWORD PTR [ebp+0xc]が第2引数
DWORD PTR [ebp+0x8]が第1引数のため、
<+0>: push ebp <+1>: mov ebp,esp <+3>: sub esp,0x10 <+6>: mov eax,DWORD PTR [ebp+0xc] <+9>: mov DWORD PTR [ebp-0x4],eax <+12>: mov eax,DWORD PTR [ebp+0x8] <+15>: mov DWORD PTR [ebp-0x8],eax <+18>: jmp 0x509 <asm2+28>
ここまで進んだ時の値は、
DWORD PTR [ebp-0x4] = 0x2e
DWORD PTR [ebp-0x8] = 0xb
となっている。
その後、
<+20>: add DWORD PTR [ebp-0x4],0x1 <+24>: sub DWORD PTR [ebp-0x8],0xffffff80 <+28>: cmp DWORD PTR [ebp-0x8],0x63f3 <+35>: jle 0x501 <asm2+20>
このループに入る。
まず、0xffffff80を2の補数表記から16進数に戻すと-0x80となるため、<+24>で0xbに0x80を加算して、0x63f3を超えるまでループさせている。
ループの回数は、
(0x63f3-0xb)/0x80+1 = c8
回となるため、
<+37>: mov eax,DWORD PTR [ebp-0x4]
に来た時のDWORD PTR [ebp-0x4]の値は、0x2e+0xc8=0xf6
となっていて、これが答え