문제

picoCTF 2018 assembly-0 풀이

Public Class 2019. 5. 20. 05:26

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)의 구조로 되어있을 것입니다.

그림1) 스택의 asm0함수 스택프레임