picoCTF 2018 assembly-0 풀이
assembly0번의 문제는 함수 asm0(0xaa,0xf2)를 호출할 경우 리턴될 값이 aa인지 f2인지를 답하는 문제입니다.
우선 아래 코드를 보면
파일명 intro_asm_rev.S
-----------------------------------------------------------------------------------------------------------------------------------
.intel_syntax noprefix
.bits 32 // Intel x86 CPU에선 리틀엔디안 방식 사용(x86 == 32bit)
.global asm0
asm0: //asm0 함수정의
push ebp
mov ebp,esp //asm0 함수의 스택프레임 생성
mov eax,DWORD PTR [ebp+0x8] //EBP+0에는 이전 EBP저장, EBP+4는 asm0 을 call 한 명령어의 다음 줄 주소, EBP+8은 aa가 EBP+C는 f2 가 저장 되어있다.
mov ebx,DWORD PTR [ebp+0xc] //EBX = f2
mov eax,ebx //EAX=EBX(f2)
mov esp,ebp
pop ebp //스택프레임 해제(최상위 스택을 ebp에 대입한후 해제)
ret // 최상위 스택(call 다음 명령어 주소)으로 복귀
-----------------------------------------------------------------------------------------------------------------------------------
EBP+8이 aa, EBP+c가 f2인 이유는 함수를 호출할때 파라미터를 스택에 쌓는데 맨 마지막 파라미터(f2)를 먼저 스택에 쌓는 규칙때문이다. 함수 입장에서는 스택에 파라미터가 순서대로 있게 되는 것 이며 아래와 같이 그림1)의 구조로 되어있을 것입니다.