[CTF] PICOCTF2019

picoCTF 2019 - asm1

レ(゚∀゚;)ヘ=З=З=З 2023. 12. 29. 14:58
728x90

asm1 문제는 0x6fa를 넣으면 asm1이 16진수로 리턴하는 값이 무엇인지 구하는 것이다.

<주어진 코드>

asm1:
	<+0>:	push   ebp
	<+1>:	mov    ebp,esp
	<+3>:	cmp    DWORD PTR [ebp+0x8],0x3a2
	<+10>:	jg     0x512 <asm1+37>
	<+12>:	cmp    DWORD PTR [ebp+0x8],0x358
	<+19>:	jne    0x50a <asm1+29>
	<+21>:	mov    eax,DWORD PTR [ebp+0x8]
	<+24>:	add    eax,0x12
	<+27>:	jmp    0x529 <asm1+60>
	<+29>:	mov    eax,DWORD PTR [ebp+0x8]
	<+32>:	sub    eax,0x12
	<+35>:	jmp    0x529 <asm1+60>
	<+37>:	cmp    DWORD PTR [ebp+0x8],0x6fa
	<+44>:	jne    0x523 <asm1+54>
	<+46>:	mov    eax,DWORD PTR [ebp+0x8]
	<+49>:	sub    eax,0x12
	<+52>:	jmp    0x529 <asm1+60>
	<+54>:	mov    eax,DWORD PTR [ebp+0x8]
	<+57>:	add    eax,0x12
	<+60>:	pop    ebp
	<+61>:	ret

 

<코드 해석>

<+0>:           push           ebp

-push를 통해 ebp에 데이터 저장한다. ( 0x6fa을 ebp에 저장한다.)

<+1>:           mov           ebp, esp

-> esp 값을 ebp에 저장해준다.

더보기

esp : 현재 스택의 가장 위에 들어있는 데이터를 가리키고 있는 포인터

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

-> [ebp+0x8]에 저장된 데이터와 0x3a2를 비교한다. 여기서 [ebp+0x8]은 0x6fa이다. 

<+10>:           jg           0x512 

-위 코드에서 왼쪽 값이었던 0x6fa가 0x3a2보다 크므로 로 점프한다.

더보기

jg : 왼쪽 인자의 값이 오른쪽 인자보다 크면 점프해라

<+37>:           cmp           DWORD PTR [ebp+0x8], 0x6fa

-> [ebp+0x8]에 있는 값과 0x6fa에 있는 값을 비교한다. (여기서 [ebp+0x8]은 스택의 첫 번째            )

<+44>:           jne           0x523 

-> 위 코드에서 [ebp+0x8], 즉, 0x6fa와 0x6fa를 비교하는데, 두 값이 같으므로 아래줄로            이동한다.

더보기

 jne : 두 값이 다르면 점프해라

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

-> [ebp+0x8]을 eax에 저장해준다.

<+49>:           sub           eax, 0x12

-> eax에서 0x12 뺀 값을 eax에 저장한다. 즉, 0x6fa에서 0x12를 빼는 것이다.

더보기

 sub : [sub 인자1인자2]인 경우 인자1 - 인자2 값을 인자1로 대입

 eax : 산술(덧셈, 곱셈, 나눗셈 등)논리 연산을 수행하며 함수의 반환값이 저장됨

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

-> 60번째 줄로 점프한다.

<+60>:           pop           ebp

-스택을 빼낸다.

<+61>:           ret

-> eax가 반환된다.

 

위의 과정을 통해 eax인 0x6fa - 0x12가 반환된다는 것을 알 수 있었다. 계산을 해주기 위해 16진수를 10진수로 바꿔서 뺄셈을 해준 다음에 다시 16진수로 바꿔주었다.

 

각각 10진수로 바꾸면 1786, 18이고, 1786 - 18 = 1768가 나와서 다시 16진수로 바꿔주니 0x6e8가 나왔다.

flag의 값은 picoCTF{0x6e8}이다.

 

'[CTF] PICOCTF2019' 카테고리의 다른 글

picoCTF 2019 – asm3  (0) 2023.12.29
picoCTF 2019 - asm2  (0) 2023.12.29