반응형
하나의 프로세스가 실행될 때 메인 메모리에서 하나의 세그먼트는 위와 같은 구조
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이 실행되면 맨 밑에는 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 |