問題
解いてみた
asm2(0xc,0x15)を実行したときにどうなりますか?
という問題です。
アセンブラを見てみます。
<+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 0x50c <asm2+31>
<+3>:これの意味ってなんなんですか?ちょっとわかりません、この先でesp使われてないので支障はなさそう。
<+6>:第2引数の0x15をeaxに代入する。
<+9>:ebp-0x4に0x15を代入する。
<+12>:eaxに第1引数の0xcを代入する。
<+15>:ebp-0x8に0xcを代入する。
<+18>:asm2+31にジャンプする。
<+31>: cmp DWORD PTR [ebp-0x8],0xa3d3
<+38>: jle 0x501 <asm2+20>
<+31>:ebp-0x8と0xa3d3を比較する。ebp-0x8は0xc。
<+38>:0xc<0xa3d3なのでジャンプする。
<+20>: add DWORD PTR [ebp-0x4],0x1
<+24>: add DWORD PTR [ebp-0x8],0xaf
<+31>: cmp DWORD PTR [ebp-0x8],0xa3d3
<+38>: jle 0x501 <asm2+20>
<+20>:ebp-0x4に0x1を足す。ebp-0x4は0x15なので0x16になる。
<+24>:ebp-0x8に0xafを足す。ebp-0x8は0xcなので0xBBになる。
<+31>:と<+38>:0xBB<0xa3d3なのでジャンプする。
というのが繰り返される。
ということで
0xa3d3 - 0xc = 0xA3C7
で差分を出して
0xA3C7 / 0xaf = 0xef
0xef + 0x1 = 0xf0
ループする回数を計算して、オーバーしないといけないので、1を足して
0x15 + 0xf0 = ?
ループする前のeaxに足すというのが答えです。
答えをマスクするのが難しい問題でした。