security
CHAPTER 95 / 96
읽기 약 2분
FUNCTION
ASLR, DEP, Stack Canary: 현대 방어 기법
핵심 개념
ASLR·DEP(NX)·스택 카나리 — 버퍼 오버플로우 방어 3종 + ROP 우회 개요.
본문
3대 방어 기법
1. ASLR (Address Space Layout Randomization)
메모리 배치를 매번 무작위화 → 공격자가 주소 예측 불가
2. DEP / NX bit (Data Execution Prevention)
스택/힙은 실행 불가능 메모리 → 코드 주입 차단
3. Stack Canary (스택 카나리)
리턴 주소 직전에 비밀 값 → 변조 시 abortASLR 동작
# 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_spaceASLR 효과 검증
#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
스택 메모리:
[ 데이터 ] ← 읽기/쓰기 가능, 실행 불가능 (NX)
공격자 시도:
1. 스택에 shellcode 주입
2. 리턴 주소를 shellcode 시작점으로 변조
3. 함수 종료 → CPU가 shellcode 실행 시도
DEP 효과:
3에서 NX bit 검사 → SIGSEGV로 즉시 종료DEP 확인
# 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 progStack Canary
// 컴파일러가 자동 삽입 (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 우회 (공격자 관점, 개념)
방법 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 CETROP (Return-Oriented Programming) — 개요
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 무결성)종합 방어 전략
# 권장 컴파일 옵션 (배포 빌드)
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