asm4 (Reverse Engineering)
What will asm4("picoCTF_a3112") 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
添付ファイル
・test.S
test.Sを確認する。
asm4:
<+0>: push ebp
<+1>: mov ebp,esp
<+3>: push ebx
<+4>: sub esp,0x10
<+7>: mov DWORD PTR [ebp-0x10],0x246
<+14>: mov DWORD PTR [ebp-0xc],0x0
<+21>: jmp 0x518 <asm4+27>
<+23>: add DWORD PTR [ebp-0xc],0x1
<+27>: mov edx,DWORD PTR [ebp-0xc]
<+30>: mov eax,DWORD PTR [ebp+0x8]
<+33>: add eax,edx
<+35>: movzx eax,BYTE PTR [eax]
<+38>: test al,al
<+40>: jne 0x514 <asm4+23>
<+42>: mov DWORD PTR [ebp-0x8],0x1
<+49>: jmp 0x587 <asm4+138>
<+51>: mov edx,DWORD PTR [ebp-0x8]
<+54>: mov eax,DWORD PTR [ebp+0x8]
<+57>: add eax,edx
<+59>: movzx eax,BYTE PTR [eax]
<+62>: movsx edx,al
<+65>: mov eax,DWORD PTR [ebp-0x8]
<+68>: lea ecx,[eax-0x1]
<+71>: mov eax,DWORD PTR [ebp+0x8]
<+74>: add eax,ecx
<+76>: movzx eax,BYTE PTR [eax]
<+79>: movsx eax,al
<+82>: sub edx,eax
<+84>: mov eax,edx
<+86>: mov edx,eax
<+88>: mov eax,DWORD PTR [ebp-0x10]
<+91>: lea ebx,[edx+eax*1]
<+94>: mov eax,DWORD PTR [ebp-0x8]
<+97>: lea edx,[eax+0x1]
<+100>: mov eax,DWORD PTR [ebp+0x8]
<+103>: add eax,edx
<+105>: movzx eax,BYTE PTR [eax]
<+108>: movsx edx,al
<+111>: mov ecx,DWORD PTR [ebp-0x8]
<+114>: mov eax,DWORD PTR [ebp+0x8]
<+117>: add eax,ecx
<+119>: movzx eax,BYTE PTR [eax]
<+122>: movsx eax,al
<+125>: sub edx,eax
<+127>: mov eax,edx
<+129>: add eax,ebx
<+131>: mov DWORD PTR [ebp-0x10],eax
<+134>: add DWORD PTR [ebp-0x8],0x1
<+138>: mov eax,DWORD PTR [ebp-0xc]
<+141>: sub eax,0x1
<+144>: cmp DWORD PTR [ebp-0x8],eax
<+147>: jl 0x530 <asm4+51>
<+149>: mov eax,DWORD PTR [ebp-0x10]
<+152>: add esp,0x10
<+155>: pop ebx
<+156>: pop ebp
<+157>: ret
"picoCTF_a3112"という文字列を引数として渡す。
<+7>でebp-0x10に0x246を、<+14>でebp-0xcに0x0を格納している。
<+21>の無条件ジャンプで<+27>にジャンプする。
<+27>でedxに0x0、<+30>でeaxにebp+0x8つまり"picoCTF_a3112"へのポインタを入れ、<+33>でeaxにedxを加算しており、eaxには"picoCTF_a3112"へのポインタの先頭アドレスが入っていることになる。
<+35>でeaxから1Byte分、pをeaxにゼロ拡張で格納する。
<+38>と<+49>のtest命令とjne命令で条件には当てはまるために、<+23>にジャンプする。
<+23>でebp-0xcに0x1を足して、ebp-0xcは0x1になる。
<+27>以降同様に処理し、<+38>と<+40>のtest命令とjne命令で条件に当てはまらない、つまり文字数分をebp-0xcに加算し終わり、0xdになるまで繰り返す。
<+42>でebp-0x8に0x1を格納し、<+49>の無条件ジャンプで<+138>にジャンプする。
<+138>でebp-0xcをeaxに格納しているので、eaxには0xdが入っている。
<+141>でeaxから0x1を引いているので、eaxには0xcが入る。
<+144>でebp-0x8とeaxを比較し、<+147>のjl命令で条件に当てはまるため、<+51>にジャンプする。
<+51>でedxにebp-0x8を、<+54>でeaxにebp+0x8つまり"picoCTF_a3112"へのポインタを入れ、<+57>でeaxにedxを加算しており、eaxには"picoCTF_a3112"の0x1番目であるiへのポインタが入っている。
<+59>でeaxから1byte分、iをeaxにゼロ拡張し、<+62>でalをedxに符号拡張で格納しているので、edxには0x00000069が入っている。
<+65>でebp-0x8をeaxに格納し、<+68>でeax-0x1の値をecxに格納しているので、ecxには0x0が入っている。
<+71>、<+74>、<+76>で"picoCTF_a3112"の0x0番目のpをゼロ拡張でeaxに格納し、<+79>でalをeaxに符号拡張で格納しているので、eaxには0x00000070が入っている。
<+82>でedxからeaxを減算しているので、0x69 - 0x70 = -0x7。
<+84>と<+86>でedxとeaxには-0x7が入っている。
<+88>でeaxにebp-0x10を格納しているので0x246が入っている。
<+91>でebxにedx+eax1を格納しているので、-0x7+0x2461=0x23fが入っている。
<+94>でeaxにebp-0x8を格納しているので、0x1が入っている。
<+97>でedxにeax+0x1を格納しているので、0x2が入っている。
<+100>、<+103>、<+105>で"picoCTF_a3112"の0x2番目のcをゼロ拡張でeaxに格納し、<+108>でalをeaxに符号拡張しているので、edxには0x00000063が入っている
<+111>でecxにebp-0x8の0x1を、<+114>でeaxにebp+0x8である"picoCTF_a3112"へのポインタを入れ、<+117>でeaxにecxを加算しており、eaxには"picoCTF_a3112"の0x1番目であるiへのポインタが入っている。
<+119>でeaxから1byte分、iをeaxにゼロ拡張し、<+122>でalをeaxに符号拡張で格納しているので、eaxには0x00000069が入っている。
<+125>でedxからeaxを減算しているので、0x63 - 0x69 = -0x6。
<+127>でeaxにedxを格納しているので、-0x6が入っている。
<+129>でeaxにebxを加算しているので、-0x6 + 0x23f = 0x239。
<+131>でebp-0x10にeaxの値を格納しているので、0x239が入っている。
<+134>でebp-0x8に0x1を加算しているので、0x2。
<+138>でeaxにebp-0xcの値を格納しているので、0xdが入っている。
<+141>でeaxから0x1を減算しているので、eaxは0xc。
<+144>でebp-0x8とeaxを比較し、<+147>のjl命令で条件に当てはまるため、<+51>にジャンプする。
以降<+144>と<+147>のcmpとjl命令で条件に当てはまらない、つまり文字数-2回分繰り返す。
ここでの処理は、(ebp-0x10) = (arg1[i]-arg1[i-1])+(arg1[i+1]-arg1[i])+(ebp-0x10)
つまり、(ebp-0x10) = (arg1[i+1]-arg1[i-1])+(ebp-0x10)をiが1~11まで繰り返している。
ebp-0x10の初期値は0x246であり、iを1~11まで繰り返すと、
(ebp-0x10)+arg1[2]-arg1[0]+arg1[3]-arg1[1]+arg1[4]-arg1[2]+arg1[5]-arg1[3]・・・
= (ebp-0x10)-arg1[0]-arg1[1]+arg1[11]+arg1[12]
となる。
よって、最終的なebp-0x10は、
0x246 - 0x70 - 0x69 + 0x31 + 0x32 = 0x1d0
となる。
<+149>でebp-0x10をeaxに格納しているので、eaxには0x1d0が入っていることになる。
フラグが得られた。
0x1d0