picoGym asm2 250 points

picoCTF2019で出題されたものですが、問題が少し変わっている&解説記事がないため記載

問題

play.picoctf.org

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
となっていて、これが答え