일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- System
- webhacking
- 정보보안기사 실기
- SQL
- 정보보안기사
- Spring
- Operating System
- pwnable
- BOF
- Pwnable.kr
- 워게임
- PWN
- hacking
- Shell code
- Lord of BOF
- Spring Framework
- 웹해킹
- system hacking
- Buffer Overflow
- 네트워크
- 정보처리기사 실기
- 해킹
- 운영체제
- wargame
- LOB
- webhacking.kr
- Payload
- stack overflow
- OS
- Spring MVC
- Today
- Total
DongDD's IT
[C 언어] 메모리 구조 본문
[C 언어] 메모리 구조
메모리 구조
- 프로그램 실행 시 메모리 공간에 프로그램이 쌓이게 된다.
- C언어에서는 Stack, Heap, Data, Code 영역으로 나뉘어진다
1) Code 영역
- 실행되는 프로그램의 코드 부분이 저장되는 영역
- Text 영역이라고도 불림
- 이 부분에 저장된 내용을 하나씩 처리하며 프로그램이 실행됨
2) Data 영역
- 전역변수, 정적 변수 등이 저장되는 공간
- 프로그램 실행 시 프로그래머가 선언한 변수에 대한 메모리 공간이 할당되고 프로그램 종료 시 해제된다.
- 초기화 되지 않은 변수는 BSS영역에 할당되게 된다.
3) Stack 영역
- 지역 변수와 함수 호출 시 매개 변수가 저장되는 공간
- 함수 안에서 변수를 선언할 경우 stack에 쌓이게 되고 함수가 종료되면 소멸된다.
- Stack 영역은 다른 영역과 달리 위에서 아래로 쌓이는 구조로 되어있음(높은 주소 -> 낮은 주소)
4) Heap 영역
- 프로그래머가 동적 할당을 해 생성한 변수가 Heap 영역에 저장된다.
Stack과 Heap은 서로가 있는 위치로 쌓이게 되어 서로의 메모리 공간을 침범할 수 있음
-> Stack overflow : stack이 heap영역을 침범한 경우
-> Heap overflow : heap이 stack 영역을 침범한 경우
소스 코드로 알아보는 영역 별 변수 할당
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> #include <malloc.h> #include <stdlib.h> int a; // data 영역에 할당 int b; // data 영역에 할당 void function(int stack3) { //stack 영역에 할당 int stack4; //stack 영역에 할당 } int main(int argc, char *argv[]) { int stack1,stack2; // stack 영역에 할당 char *heap1 = (char *) malloc(sizeof(char) * 100); //heap 영역에 할당 int *heap2 = (int *) malloc(sizeof(int) * 100); //heap 영역에 할당 } |
- main 함수의 지역변수 stack1, stack2와 function 함수의 매개변수 stack3, 지역변수 stack4는 stack영역에 할당되게 된다.
- 사용자가 동적으로 메모리 할당을 해준 heap1, heap2 같은 경우에는 heap 영역에 할당되게 된다.
- 전역 변수로 선언한 a,b는 data영역의 BSS 영역에 할당되게 된다.