본문 바로가기
게임해킹/knockon 부트캠프

[3주차 TIL] KnockOn Bootcamp - 메모리 구조와 매핑

by HHack 2025. 4. 22.
반응형

📘실행파일의 메모리 구조와 매핑 – 코드가 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의 논리적 구역으로 나뉜다.
  • 각 구역은 용도, 접근 권한, 공격 대상 여부가 모두 다르다.
  • 리버서와 익스플로잇 개발자는 각 구역의 경계, 주소, 권한을 정확히 파악해야 한다.

🔧 실습 과제

  1. cat /proc/self/maps로 현재 프로세스의 메모리 매핑 확인
  2. C 코드에서 int x = 10; 과 malloc(sizeof(int))의 주소 차이 확인
  3. mprotect()를 사용해 Stack에 실행 권한을 부여해보고 실행 여부 테스트
  4. ASLR 우회, 메모리 구조 기반 익스플로잇,혹은 섹션 덤프 및 수동 분석 방법
반응형