picoCTF2019 asm1 [Reverse Engineering]
What does asm1(0x345) return? Submit the flag as a hexadecimal value (starting with '0x'). NOTE: Your submission for this question will NOT be in the normal flag format. Source located in the directory at /problems/asm1_5_301df039c0ee4ee4dfa8adad6a40b875.
Hints: assembly conditions
アセンブラの問題です。0x345を引数として与えられたときにasm1は何を返しますかという問題です。与えられたコードは以下です。
asm1:
<+0>: push ebp
<+1>: mov ebp,esp
<+3>: cmp DWORD PTR [ebp+0x8],0x37a
<+10>: jg 0x512 <asm1+37>
<+12>: cmp DWORD PTR [ebp+0x8],0x345
<+19>: jne 0x50a <asm1+29>
<+21>: mov eax,DWORD PTR [ebp+0x8]
<+24>: add eax,0x3
<+27>: jmp 0x529 <asm1+60>
<+29>: mov eax,DWORD PTR [ebp+0x8]
<+32>: sub eax,0x3
<+35>: jmp 0x529 <asm1+60>
<+37>: cmp DWORD PTR [ebp+0x8],0x5ff
<+44>: jne 0x523 <asm1+54>
<+46>: mov eax,DWORD PTR [ebp+0x8]
<+49>: sub eax,0x3
<+52>: jmp 0x529 <asm1+60>
<+54>: mov eax,DWORD PTR [ebp+0x8]
<+57>: add eax,0x3
<+60>: pop ebp
<+61>: ret
+0と+1はFunction Prologueというお決まりの方法です。
+3行目で引数の0x345と0x37aの比較(cmp)が行われています。0x345のほうが小さいので、+10行目のjg (jump greater)はジャンプしません。
そのまま進んで+12行目で引数の0x345と0x345の比較(cmp)が行われますが、+19行目はjne(jump not equal)なので、ここもジャンプしません。
+21行目で引数の0x345をeaxレジスタに格納して、+24行目でeaxに0x3を加えて(add)いるので、eaxは0x345 + 0x3 = 0x348になります。
+27行目でjmp(jump)命令が実行されて、+60行目に飛びます。このまま値を返しますので、結果は0x348となります。
答え:0x348