OPEN HYPER STEP
← 목록으로 (화이트햇 보안)
SECURITY · 95 / 96
security
CHAPTER 95 / 96
읽기 약 2
FUNCTION

ASLR, DEP, Stack Canary: 현대 방어 기법


핵심 개념

ASLR·DEP(NX)·스택 카나리 — 버퍼 오버플로우 방어 3종 + ROP 우회 개요.

본문

3대 방어 기법

📋 코드 (8줄)
1. ASLR (Address Space Layout Randomization)
   메모리 배치를 매번 무작위화 → 공격자가 주소 예측 불가

2. DEP / NX bit (Data Execution Prevention)
   스택/힙은 실행 불가능 메모리 → 코드 주입 차단

3. Stack Canary (스택 카나리)
   리턴 주소 직전에 비밀 값 → 변조 시 abort

ASLR 동작

BASH📋 코드 (17줄)
# Linux에서 ASLR 상태 확인
$ cat /proc/sys/kernel/randomize_va_space
2  # 0=비활성, 1=conservative, 2=full (기본)

# 매 실행마다 다른 주소
$ ldd /bin/ls
linux-vdso.so.1 (0x00007ffd4e5fa000)
libc.so.6 => /lib/.../libc.so.6 (0x00007f8a5b2c0000)

$ ldd /bin/ls
linux-vdso.so.1 (0x00007ffe1234c000)   # 매번 다름
libc.so.6 => /lib/.../libc.so.6 (0x00007f3e9a000000)


# 비활성 (디버깅용 — 운영 환경 절대 금지)
$ setarch -R ./prog
또는 $ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

ASLR 효과 검증

C📋 코드 (20줄)
#include <stdio.h>
#include <stdlib.h>

int global = 5;

int main(void) {
    int local = 10;
    int *heap = malloc(sizeof(int));

    printf("Code:  %p\n", (void*)main);
    printf("Data:  %p\n", (void*)&global);
    printf("Heap:  %p\n", (void*)heap);
    printf("Stack: %p\n", (void*)&local);
    printf("libc:  %p\n", (void*)printf);

    free(heap);
    return 0;
}

// 매 실행마다 주소 다름 — 공격자가 페이로드에 정확한 주소 못 박음

DEP / NX bit

📋 코드 (10줄)
스택 메모리:
[ 데이터 ]  ← 읽기/쓰기 가능, 실행 불가능 (NX)

공격자 시도:
1. 스택에 shellcode 주입
2. 리턴 주소를 shellcode 시작점으로 변조
3. 함수 종료 → CPU가 shellcode 실행 시도

DEP 효과:
3에서 NX bit 검사 → SIGSEGV로 즉시 종료

DEP 확인

BASH📋 코드 (9줄)
# Linux: gcc 기본 활성
$ gcc -z noexecstack prog.c -o prog  # 명시적
$ readelf -l prog | grep STACK
GNU_STACK   0x0  0x0  0x0  0x0  RW   0x10
                              ^^^ R+W만, X 없음 → NX 활성


# DEP 비활성 시도 (절대 금지)
$ gcc -z execstack prog.c -o prog

Stack Canary

C📋 코드 (22줄)
// 컴파일러가 자동 삽입 (gcc -fstack-protector-strong)

void vulnerable_function(const char *input) {
    // 컴파일러 자동 삽입:
    // long canary = __stack_chk_guard;  // 비밀 값 읽기

    char buffer[64];
    strcpy(buffer, input);  // 오버플로우 시 canary도 덮어씀

    // 함수 종료 직전 자동 삽입:
    // if (canary != __stack_chk_guard) {
    //     __stack_chk_fail();  // *** stack smashing detected ***
    //     abort();
    // }
}


// 컴파일러 옵션
// -fno-stack-protector       비활성 (절대 금지)
// -fstack-protector          취약 함수만
// -fstack-protector-strong   더 많은 함수 (모던 기본)
// -fstack-protector-all      모든 함수

Canary 우회 (공격자 관점, 개념)

📋 코드 (12줄)
방법 1: Brute force — 어려움 (8바이트, 매번 변경)
방법 2: 정보 누출 — 포맷 스트링 등으로 canary 값 읽기
방법 3: 스택 카나리 우회 — buffer overflow가 아닌 다른 vector
   - GOT overwrite
   - Heap overflow
   - format string


방어 강화:
- ASLR + DEP + Canary 3중 방어
- CFI (Control Flow Integrity) — 모던 컴파일러
- Shadow Stack — Intel CET, AMD CET

ROP (Return-Oriented Programming) — 개요

📋 코드 (15줄)
DEP 우회 기법:
1. 메모리 안의 기존 코드 조각(gadget)을 활용
   - libc 함수 (system, mprotect 등)
   - 짧은 어셈블리 sequence + ret

2. 스택에 gadget 주소 chain 작성
   - 첫 ret → gadget 1 실행 → ret
   - 다음 ret → gadget 2 실행 → ret
   - ...
   - 결국 system("/bin/sh") 호출

방어:
- ASLR (gadget 주소 무작위)
- CFI (gadget 진입점 차단)
- Shadow Stack (return address 무결성)

종합 방어 전략

BASH📋 코드 (17줄)
# 권장 컴파일 옵션 (배포 빌드)
gcc \
    -O2 \                              # 최적화
    -D_FORTIFY_SOURCE=2 \               # libc 안전 함수
    -fstack-protector-strong \          # 스택 카나리
    -fcf-protection=full \              # CFI (Intel CET)
    -fpie -pie \                        # PIE (전체 ASLR)
    -Wl,-z,relro -Wl,-z,now \           # Read-only relocations
    -Wl,-z,noexecstack \                # DEP (NX 스택)
    -Wformat=2 -Wformat-security \      # 포맷 스트링 검사
    prog.c -o prog


# 검증
$ checksec ./prog  # checksec.sh 도구
RELRO          STACK CANARY      NX            PIE
Full RELRO     Canary found      NX enabled    PIE enabled

다음 챕터

CH.12 "C 메모리 종합" — 안전한 코드 원칙 + Rust/Go의 해결법.


AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

내 C 빌드 옵션을 분석해서 ASLR/DEP/
Canary 활성 상태와 보강 가이드를
만들어줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

Linux 커널 vs Windows의 메모리 보호
메커니즘 차이를 비교 분석해줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

내 배포 바이너리들의 checksec 결과를
자동 검증하는 CI 스크립트를 만들어줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

2026년 Intel CET / AMD Shadow Stack
실무 채택률과 효과를 솔직히 알려줘.

⭐ 이것만 기억하세요
ASLR, DEP, Stack Canary: 현대 방어 기법 이 3가지만 확실히 잡으세요
1.ASLR + DEP + Stack Canary 3중 방어 — 모던 OS의 표준, 모든 컴파일 옵션 활성 필수
2.ROP는 DEP 우회 기법 — gadget chain으로 코드 주입 없이 임의 함수 호출
3.다음 챕터 CH.12에서 종합 — 안전 코드 원칙 + Rust/Go가 해결한 방법


공유하기
진행도 95 / 96