혜랑's STORY

[picoCTF] asm1 - Reverse Engineering 본문

2021 SISS 21기 활동/여름방학 CTF[연합]

[picoCTF] asm1 - Reverse Engineering

hyerang0125 2021. 8. 5. 19:04

source를 다운받아서 살펴보자.

asm1:
	<+0>:	push   ebp
	<+1>:	mov    ebp,esp
	<+3>:	cmp    DWORD PTR [ebp+0x8],0x71c
	<+10>:	jg     0x512 <asm1+37>
	<+12>:	cmp    DWORD PTR [ebp+0x8],0x6cf
	<+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],0x8be
	<+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

 

문제에서 0x8be를 넣었다. 차근차근 따라가며 flag를 찾아보자.

<+3>: cmp    DWORD PTR [ebp+0x8],0x71c

스택의 첫 번째 값인 "0x8be"와 0x71c를 비교한다.

<+10>: jg     0x512 <asm1+37>

비교한 값의 왼쪽 값이 더 클 경우 <+37>로 이동한다.
0x8be와 0x71c 중 0x8be가 더 크다. 따라서 <+37>로 이동하여 이어가면 된다.

<+12>: cmp    DWORD PTR [ebp+0x8],0x6cf

<+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],0x8be

역시 0x8be와 0x8be를 비교한다.

<+44>: jne    0x523 <asm1+54>

비교한 값이 서로 다를 경우 <+54>로 점프한다.
현재는 같으므로 점프하지 않는다.

<+46>: mov    eax,DWORD PTR [ebp+0x8]

eax에 0x8be를 넣는다.

<+49>: sub    eax,0x3

eax값에서 0x3만큼 뺀다.
0x8be - 0x3 = 0x8bb

<+52>: jmp    0x529 <asm1+60>

<+60>으로 점프한다.

<+54>: mov    eax,DWORD PTR [ebp+0x8]

<+57>: add    eax,0x3

<+60>: pop    ebp

eax를 반환한다.
즉, 0x8bb를 반환한다.

<+61>: ret

종료

 

문제를 해결할 수 있었다.