본문 바로가기

Security study/Pwnable

리눅스 메모리 구조

(1) 코드(텍스트) 영역

-> 유저가 작성한 소스코드가 들어가는 영역으로 이곳의 명령 실행 순서는 차례대로 진행되지 않는다.

그*순서를 맞추기 위해 EIP(명령 포인터) 레지스터를 이용한다.

-> 이곳에는 진짜 코드만 저장하고 있기 때문에 쓰기가 불가능하고 읽기만 가능하다.

 

(2) 데이터 영역

-> 초기값이 있는 전역(global)변수와 정적(static)변수 등이 할당된다.
-> 프로그램 시작과 동시에 할당되며, 프로그램이 종료될 때 메모리가 소멸된다.

 

(3) BSS 영역

-> 초기값이 없는 전역(global)변수와 정적(static)변수, 0이나 NULL로 초기화된 변수들이 할당된다.
-> 이변수들에게 어느 정도의 메모리를 할당할 것이라는 정보를 저장한다.
-> 이후 런타임 시스템이 여기 변수들을 필요로 할 때, 각 변수에 대한 메모리 영역이 실제로 확보된다.
-> 초기화는 런타임에 다 링크되어 올라간 뒤에 프로그램 로더가 프로그램을 로드할 때 초기화된다.

 

(4) 스택 영역

-> 프로그램이 실행하고 있는 동안에 만들어지는 임시 데이터를 스택처럼 쌓아서 저장하는 영역이다.
-> 프로그램이 자동으로 사용하는 임시 메모리 영역이라고도 할 수 있다.
-> 보통 함수 호출 시 생성되는 지역 변수와 매개변수가 저장되며, 함수 호출이 완료되면 메모리가 소멸된다.
-> 컴파일될 때 메모리 공간을 가진다.

* 리틀 엔디안 방식으로 저장되므로 하위 바이트부터 먼저 들어간다.

* 기본 구조
=> Buffer + sfp[4byte] + ret[4byte]

(5) 힙 영역

-> 프로그램 실행 중에 동적으로 메모리를 할당하기 위한 공간이다.
-> malloc등으로 프로그래머가 할당하고 해제한다.
-> 동적 데이터 영역이라고도 하며, 여기에 메모리를 할당하는 것을 동적 할당이라고 한다.
-> 런타임 시에 동적으로 크기가 결정된다.

'Security study > Pwnable' 카테고리의 다른 글

GDB 사용방법  (0) 2021.05.12
[pwnable.kr] collision 문제 풀이  (0) 2021.05.05
setuid 개념 정리  (0) 2021.05.05
[2주차 과제] swing_pwn_chall 풀이  (0) 2021.04.28
pwntools 사용법 및 기능  (0) 2021.04.28