0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

picoCTF 2019 writeup asm4

0
Last updated at Posted at 2025-12-11

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?