問題
解いてみた
asm3(0xaeed09cb,0xb7acde91,0xb7facecd)のときの戻り値(eax)を求める問題です。
スタックの状態はこうでしょうか。
ソースを見てみます。
eax、ax、ah、alが出てきたので一度表にしておきます。
<+3>: xor eax,eax
これはeaxを0にする処理です。
<+5>: mov ah,BYTE PTR [ebp+0xb]
ahにebp+0xbを代入する。
ebp+0xbは何かというとebp+0xcが引数2なので、その直前に2桁。
つまり引数1の一番左の2桁になるのでaeとなります。
BYTEなので2桁です。
ahはae。
<+8>: shl ax,0x10
axを0x10bit左にシフトする。
ax=0xae00なので左に16bitシフトするとax=0x0000です。
<+12>: sub al,BYTE PTR [ebp+0xe]
alから[ebp+0xe]を引く。
ebp+0xeはacなので0x00-0xac=FFF~FF54
ってなるんですけど、BYTEってことなので2桁。FFFの部分はたぶん無視して良さそうなので
al=0x54
<+15>: add ah,BYTE PTR [ebp+0xd]
ahに[ebp+0xd]をたす。
[ebp+0xd]は0xde、ah=0x00なので
0x00+0xde=0xde
<+18>: xor ax,WORD PTR [ebp+0x12]
ax=0xde54
[ebp+0x12]=0xb7fa
0xde54 xor 0xb7fa = {flag}
ということでできました。