Security

📌 리눅스 바이너리 보안 기법 비교: ASLR, DEP/NX, Format String, Stack Canary, RELRO, PIE

구루싸 2025. 6. 5. 00:44
반응형
SMALL

리눅스 시스템에서 바이너리 보안은 다양한 보안 기법들의 조합으로 구성됩니다. 이번 글에서는 흔히 CTF나 보안 공부에서 마주치는 주요 보호 기법들인 ASLR, DEP/NX, Format String, Stack Canary, RELRO, PIE의 차이점과 역할을 정리해보겠습니다.

🔐 1. ASLR (Address Space Layout Randomization)

  • 개념: 메모리 주소를 무작위로 배치하여 공격자가 정확한 주소를 예측하지 못하게 함
  • 보호 위치: Stack, Heap, mmap, libc, PIE 실행파일의 주소
  • 효과: 주소 기반 공격(Ret2libc, ROP 등)을 어렵게 만듦
  • 우회 가능성: 정보 유출 (info leak)이 있으면 우회 가능
  • 확인 방법:
    cat /proc/sys/kernel/randomize_va_space

🚫 2. DEP / NX Bit (Data Execution Prevention)

  • 개념: 스택, 힙 등의 영역을 실행 불가능하게 만들어 쉘코드 실행 방지
  • 효과: Ret2StackShellcode 같은 공격 방지
  • 우회 방법: ROP(Return Oriented Programming)으로 우회 가능
  • 확인 방법:
    checksec --file=바이너리이름

📝 3. Format String 취약점

  • 개념: printf(user_input)처럼 입력값이 포맷 문자열이 될 경우 발생
  • 영향: 메모리 읽기/쓰기 가능, RIP 제어 가능
  • 예방: 항상 포맷 지정
    printf("%s", user_input);

🔒 4. Stack Canary

  • 개념: 스택 리턴 주소 앞에 '카나리' 값을 두고 손상 여부로 오버플로우 감지
  • 효과: 리턴 주소 덮기 공격 방지
  • 우회 방법: Canary 유출 시 우회 가능 (ex. Format String leak)
  • 확인 방법:
    checksec --file=바이너리이름

🧷 5. RELRO (RELocation Read-Only)

  • 개념: GOT(Global Offset Table)를 읽기 전용으로 만들어 덮기 방지
  • 종류:
    • Partial RELRO: 일부만 보호
    • Full RELRO: GOT 전체를 보호
  • 확인 방법:
    checksec --file=바이너리이름

🧱 6. PIE (Position Independent Executable)

  • 개념: 실행파일 자체도 ASLR의 영향을 받아 주소가 매 실행 시 변경
  • 효과: 코드 주소 예측을 어렵게 만듦
  • 확인 방법:
    checksec --file=바이너리이름

📊 요약 비교표

기법 보호 대상 우회 가능 여부 확인 방법
ASLR 전체 메모리 주소 Info leak 시 가능 cat /proc/...
checksec
DEP / NX Stack, Heap ROP 등으로 우회 가능 checksec
Format String 입력 포맷 문자열 직접 포맷 사용 시 취약 코드 리뷰
Stack Canary 리턴 주소 보호 Canary leak 필요 checksec
RELRO GOT 영역 Partial은 우회 가능 checksec
PIE 코드 주소 주소 유출 시 가능 checksec

✅ 마무리

보안 기법은 단독으로는 완전하지 않습니다. 여러 기법이 함께 동작해야 실질적인 보호가 이루어집니다. 실습 시에는 checksec 명령어를 활용해 각 보호 기법의 적용 여부를 확인해보는 것을 추천드립니다.

반응형
LIST