시스템해킹

어셈블리에서의 프롤로그

세종대학교 S.S.G / WHS 2기 2023. 10. 5. 16:09

Redhat 6.2 버전의 구닥다리 환경에서 실습을 진행했다...

처음 배우는 뉴비의 글이니 틀린 정보들이 수두룩 할 것이다...

 

 

sample.c

#include <stdio.h>

void main(){
	int c;
    c = function(1, 2);
}

int function(int a, int b){
	char buffer[10];
    a = a + b;
    return a;
}

 

해당 코드의 동작은

 

main()

int c 변수 선언

c 변수에 function(1, 2) 값 대입

 

function(int a, int b)

char buffer[10] 선언

a 변수에 ab를 더한 값을 저장

a값을 반환

 

으로 동작한다

 

 

 

sample.c의 어셈블리 코드이다. 해당 어셈블리는 intel 기반이 아닌 at&t 문법을 사용하기 때문에 mov a, b 라면 a의 값을 b에 대입한다.

(intel은 b값을 a에 대입)

main :
    pushl %ebp
    movl %esp, %ebp
    subl $4, %esp
    pushl $2
    pushl $1
    call function
    addl $8, %esp
    movl %eax, %eax
    movl %eax, -4(%ebp)

L1 :
	leave
	ret


function :
    pushl %ebp
    movl %esp, %ebp
    subl  $12, %esp
    movl 12(%ebp), %eax
    addl  %eax, 8(%ebp)
    movl 8(%ebp), %edx
    movl %edx, %eax
    jmp  .L2

L2 :
	leave
    ret

 

 

prologue란 새로운 함수에 진입했을 때 새로운 함수로 스택 프레임을 초기화 하는 과정이다.

pushl %ebp

movl %esp, %ebp 부분이다.

pushl %ebp

먼저 pushl %ebp를 하게 되면 현재 ebp레지스터에 저장되있는 값을 push 한다는 뜻이다.

현재 ebp에 저장되어있는 값은 main 함수 이전의 ebp값이고, 그 ebp 값이 저장되게 된것이다.

 

movl %esp, %ebp

이후 esp가 가르키고 있는 값을 ebp에 대입하여 현재 esp가 가르키는 곳을 ebp가 가르키게 만들어 새로운 스택 프레임을 만드는 것이다.

 

이 과정이 프롤로그이다.

 

 

 

call funtion

이후 function 함수로 프롤로그를 살펴보자.

call을 하게 되면 function 함수의 return address를 스택에 push한다. 이 값은 main으로 돌아와서 다음에 실행할 명령어의 주소이다. 이후 function 함수로 이동하게 된다.

 

 

function에 진입하자마자 프롤로그가 실행되는 것을 볼 수 있다.

이를 그림으로 살펴보면

pushl %ebp를 통해 main 함수의 ebp 값을 저장한다.

 

 

이후에 ebp값을 esp값으로 이동시켜 새로운 function함수를 위한 스택 공간을 할당한 것이다.