본문 바로가기

Security

memory architecture & stack frame

반응형

하나의 프로세스가 실행될 때 메인 메모리에서 하나의 세그먼트는 위와 같은 구조

Stack  지역변수, 리턴 값 , 매개변수 등 저장하는 영역
Heap malloc , new 등 동적인 메모리를 할당할 때 위치하는 영역
Data 전역변수 , 정적변수 , 배열 (문자열) , 구조체 등이 저장 (초기화 된 변수가 저장)
BSS 전역변수 , 정적변수 , 배열 (문자열) , 구조체 등이 저장 (초기화되지 않은 변수가 저장)
Text (Code) 함수는 명령어로 볼 수 있는데 이 함수에 대한 기계어 코드가 들어감

Stack Frame

#include <stdio.h>
int sum(int a, int b)
{
	return a + b;
}

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

1. 메인 함수 실행

main의 stack frame

  • main이 실행되면 맨 밑에는 RET address가 깔림
  • RET address는 함수가 끝났을 때 돌아가는 주소
  • RBP 기준으로 위로 스택이 쌓아질 것을 의미함
  • 변수 c가 스택에 쌓음

  • main의 버퍼 이후 sum을 호출하면서 차곡차곡 변수가 쌓임
  • sum을 호출하면서 변수가 먼저 쌓이고 sum 내부에 대한 스택이 쌓임
  • 컴파일러가 코드 최적화를 하면서 실제 어셈블리를 통해 확인한 결과는 상이할 수 있음
  • RET 전에 변수 x , y 가 먼저 깔리는 이유 (함수 호출 시에 밑과 같은 순서이기 때문)

main 부분을 보면

  • 우선 RET이 제일 아래에 깔리고
  • RBP가 push됨
  • movq rsp rbp에서 rsp값을 rbp로 옮김 
  • 그리고 rsp에서 16byte만큼 빼서 메모리 공간을 만든다.
  • esi와 edi에는 각각 2와 1을 대입하는데 e(32bit)레지스터를 쓰는것은 효율성을 위해 사용
  • 그리고 call sum

RET이 밑에 깔리고 RBP push

rbp 기준으로 -4 -8 byte 위치에 변수 저장

rbp 반환하면서

다시 비워지면서 rax에 반환값이 저장되기 때문에 그 값을 스택에 올리면서 결국 반환

반응형

'Security' 카테고리의 다른 글

kali msfconsole  (0) 2021.12.09
hacking tools  (0) 2021.12.08
register & system call  (0) 2021.11.26
[systemhacking] ELF 동적 디버깅  (0) 2021.11.24
[systemhacking] logical bugs  (0) 2021.11.23