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
종료
문제를 해결할 수 있었다.