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 |