반응형
📘실행파일의 메모리 구조와 매핑 – 코드가 RAM 위에 올라가는 방식
실행파일이 메모리에 어떻게 적재되고, 어떤 구역이 어떤 역할을 하는지를 알아야만
스택 버퍼 오버플로우, 힙 조작, 코드 인젝션, 권한 우회 등 실전 익스플로잇이 가능해집니다.
🔍 4.1 메모리 구조 개요
프로그램이 실행되면 운영체제는 실행파일을 RAM의 특정 공간에 적재한다.
이 메모리 공간은 아래처럼 여러 구역(섹션, Section)으로 나뉘어 있으며,
각 구역은 서로 다른 목적과 보안 속성을 가진다.
아래 그림은 메모리 구조의 전형적인 모습이다:
📦 4.2 각 섹션의 구조와 역할
🔹 Code Section (.text)
- 역할: 프로그램의 기계어 명령어(코드)가 저장됨
- 속성: 읽기 + 실행(Read + Execute), 쓰기 금지
- 보안적 의미: Self-modifying code, shellcode 삽입 시 이 구역을 공격함
- 리버싱 포인트: 주로 분석 대상이 되는 섹션
🔹 Data Section (.data / .bss)
- 역할: 전역 변수와 정적(static) 변수 저장
- .data: 초기값이 있는 변수
- .bss: 초기값이 없는 변수 (0으로 초기화됨)
- 속성: 읽기 + 쓰기(RW), 실행 금지
📌 힙과 달리, 정적으로 주소가 할당되어 있어 디버깅 시 분석이 쉬움
🔹 Heap
- 역할: malloc, new 등으로 동적 할당되는 메모리
- 속성: 읽기 + 쓰기 (RW)
- 성장 방향: 아래쪽으로 확장됨
📌 힙 스프레이, 힙 오버플로우 등 힙 기반 공격은 이 공간을 타깃으로 한다.
🔹 Stack
- 역할: 함수 호출 시 지역 변수, 복귀 주소, 파라미터 저장
- 속성: 읽기 + 쓰기 (RW)
- 성장 방향: 위쪽으로 확장됨 (힙과 반대 방향)
📌 스택 버퍼 오버플로우 공격, ROP 체인 삽입, 리턴 주소 조작은 이 영역을 조작하는 기술이다.
🧠 4.3 /proc/{PID}/maps – 메모리 매핑 정보 확인
리눅스에서는 /proc/{프로세스ID}/maps 파일을 통해
현재 프로세스의 메모리 맵을 확인할 수 있다.
📌 예시 출력
00400000-0040b000 r-xp 00000000 08:01 786433 /bin/cat
0060a000-0060b000 r--p 0000a000 08:01 786433 /bin/cat
0060b000-0060c000 rw-p 0000b000 08:01 786433 /bin/cat
필드 | 의미 |
00400000-0040b000 | 메모리 주소 범위 |
r-xp | 권한 (Read, eXecute, Private) |
/bin/cat | 매핑된 파일 이름 |
🔍 권한 플래그
- r: 읽기(Read)
- w: 쓰기(Write)
- x: 실행(Execute)
- p: 프라이빗 매핑 (복사-쓰기)
- s: 공유 매핑 (shared)
📌 리버싱 시 이 정보를 통해 쉘코드 실행 가능한 영역,
IAT, GOT, libc 매핑 여부를 분석할 수 있다.
🔐 4.4 보안 기법과 메모리 영역 관계
보안 기법 | 보호 대상 영역 | 설명 |
NX (No eXecute) | Stack / Heap | 코드 실행 방지 |
ASLR | 모든 영역 (특히 Heap, Stack, libc) | 주소 무작위화 |
RELRO | GOT, .data | 재배치 주소 고정화 |
PIE | Code Section | 실행파일 자체의 베이스 주소 무작위화 |
🧠 리버싱 시 주의할 점
- 코드 인젝션은 실행 가능한 주소 영역을 찾아야 하며 (x 권한 확인)
- 버퍼 오버플로우는 주로 Stack → RET 주소 조작이나 Heap → 객체 해킹으로 진행됨
- /proc/self/maps, vmmap, pmap, Ghidra의 메모리 맵 창 등으로 구조 분석 가능
✅ 정리
- 실행파일이 메모리에 올라가면 Code / Data / Heap / Stack의 논리적 구역으로 나뉜다.
- 각 구역은 용도, 접근 권한, 공격 대상 여부가 모두 다르다.
- 리버서와 익스플로잇 개발자는 각 구역의 경계, 주소, 권한을 정확히 파악해야 한다.
🔧 실습 과제
- cat /proc/self/maps로 현재 프로세스의 메모리 매핑 확인
- C 코드에서 int x = 10; 과 malloc(sizeof(int))의 주소 차이 확인
- mprotect()를 사용해 Stack에 실행 권한을 부여해보고 실행 여부 테스트
- ASLR 우회, 메모리 구조 기반 익스플로잇,혹은 섹션 덤프 및 수동 분석 방법
반응형
'게임해킹 > knockon 부트캠프' 카테고리의 다른 글
[3주차 TIL] KnockOn Bootcamp - ELF 파일 구조 (0) | 2025.04.22 |
---|---|
[3주차 TIL] KnockOn Bootcamp - 링커와 로더 (0) | 2025.04.22 |
[3주차 TIL] KnockOn Bootcamp - 컴파일러 (0) | 2025.04.22 |
[3주차 TIL] KnockOn Bootcamp - 아키텍쳐 (2) | 2025.04.22 |
[2,3주차 TIL] KnockOn Bootcamp - 프로젝트 만들기 (0) | 2025.04.15 |