*모든 내용, 이미지의 출처는 Background: Windows Memory Layout | Dreamhack
메모리 레이아웃(Memory Layout)
프로세스 가상 메모리의 구성.
*가상 메모리(Virtual Memory) : 프로그램 실행 시 운영체제에서 프로세스에게 사용 가능한 메모리 공간을 할당해주는데, 이 공간을 가상메모리라고 함.
운영체제가 하는 일
- 프로그램의 정보를 참조하여 저장된 데이터가 적절한 영역에 저장되도록 함.
- 프로세스가 사용할 가상 메모리를 용도별로 구획.
- 프로세스가 사용하는 데이터를 적절한 구획에 저장.
-> 유사한 데이터끼리. 구획에 권한 부여. => 개발자가 프로세스의 메모리를 직관적으로 이해 가능함.
<프로세스 메모리 구조>
섹션: 유사한 용도로 사용되는 데이터가 모여있는 영역
윈도우 PE 파일 = PE 헤더 + 1개 이상 섹션.
".text" : PE 코드
".data" : PE가 실행 중에 참조하는 코드
섹션에 대한 정보 in PE 헤더
- 섹션의 이름
- 섹션의 크기
- 섹션이 로드될 주소의 오프셋
- 섹션의 속성과 권한
*오프셋(offset) : 컴퓨터 기억 장치에서 임의 주소에서 간격을 두고 떨어진 주소와의 거리.
기억 장치가 페이지 혹은 세그먼트 단위로 나누어져 있을 때 하나의 시작 주소로부터 오프셋(offset)만큼 떨어진 위치를 나타냄.
*세그먼트(segment)
1: 서로 구분되는 기억 장치의 연속된 한 영역
2: 어떤 프로그램이 너무 커서 한 번에 주기억장치에 올릴 수 없어 갈아넣기 기법을 사용하여 쪼개었을 때, 나뉜 각 부분.
3: 세그먼테이션 방식의 가상 기억 장치에서 사용되는 것. 페이지와 비슷, 그러나 가변 길이, 기억 장치의 어느 곳에도 자리할 수 있는 기억 장소 영역. 한 세그먼트는 프로그램의 논리적인 한 구성 단위를 저장함.
4: 계층 모형의 데이터베이스에서 여러 항목이 모인 레코드에 해당하는 단위.
1) .text
실행 가능한 기계 코드가 위치함. main()등의 함수 코드
이 세그먼트에는 읽기 권한과 실행 권한 부여. but 쓰기 권한은 공격자가 악성코드를 삽입하기 쉬워지므로 제거.
2) .data
컴파일 시점에 값이 정해진 전역 변수들이 위치함. 초기화 된 전역 변수, 전역 상수
CPU가 이 섹션의 데이터를 읽고 쓸 수 있어야 하므로, 읽기/쓰기 권한 부여.
3) .rdata
컴파일 시점에 값이 정해진 전역 상수, 참조할 DLL 및 외부 함수들의 정보 저장. : 전역 상수, 임포트 데이터
읽기 권한 부여(CPU가 읽어야함.), 쓰기는 불가능.
str_ptr은 "readonly"라는 문자열을 가리키고 있는데, str_ptr은 전역 변수로서 .data에 위치하지만, "readonly"는 상수 문자열로 취급되어 .rdata에 위치한다.
섹션이 아닌 메모리
가상 메모리 공간에는 스택과 힙도 적재됨.
스택
윈도우 프로세스의 각 스레드는 자신만의 스택 공간을 갖고 있음.
보통 지역 변수나 함수의 리턴 주소가 저장됨.
자유롭게 읽고 쓰는 영역 -> 읽기/쓰기 권한 부여
지역 변수, 함수의 인자 등
'아래로 자란다' : 스택이 확장될 때, 기존 주소보다 낮은 주소로 확장
힙
프로그램이 여러 용도로 사용하기 위해 할당받는 공간 -> 모든 종류의 데이터가 저장될 수 있음.
사용 예: malloc(), calloc()등으로 할당 받은 메모리
스택과의 차이
- 비교적 큰 데이터 저장 가능.
- 전역적으로 접근 가능.
- 실행중 동적으로 할당받음.
권한 : 읽기/쓰기
상황에 따라 실행 권한을 가지는 경우도 존재함.
heap_data_ptr에 malloc()으로 동적 할당한 영역의 주소를 대입하고 31337이란 값을 씀. heap_data_ptr은 지역변수이므로 스택에 위치하며, malloc으로 할당받은 힙 세그먼트의 주소를 가리킴.
ㅇㄹㄴㅇㅇㄴㄹ
'Dreamhack' 카테고리의 다른 글
리버싱 06 - rev-basic-0 (0) | 2022.07.12 |
---|---|
리버싱 05 - x86 Assembly (0) | 2022.07.12 |
리버싱 03 - 컴퓨터 구조, 명령어 집합 구조 (0) | 2022.07.10 |
리버싱 02 - 동적 분석과 정적 분석 (0) | 2022.07.10 |
리버싱 01 - Binary (0) | 2022.07.09 |