스킬캠퍼스
11강 · 익스플로잇 완화
강의

오늘 끝나면

익스플로잇 완화

  • 익스플로잇 완화의 핵심 문제를 한 문장으로 설명한다
  • 오른쪽 실습에서 익스플로잇이 어떻게 움직이는지 관찰한다
  • 다음 강의와 이어지는 한계를 말할 수 있다

실습 미션

ASLR·DEP — 공격과 방어의 군비경쟁 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.

성공 조건

  • 실습의 기본값을 먼저 관찰
  • 입력값이나 모드를 한 번 이상 바꿔 결과 비교
  • 왜 결과가 바뀌었는지 한 문장으로 설명

화이트해킹 · 11

익스플로잇
완화

버그를 다 없애는 건 불가능함.
그래서 OS는 공격을 “어렵게” 만드는 벽을 깔아둠.
ASLR · DEP · 카나리 — 완화의 삼총사임.

P.01화이트해킹 · 11

버그는 못 없앰 · 비싸게 만듦

10강에서 본 버퍼 오버플로우 같은 버그는 끝없이 새로 생김. 다 잡는 건 포기하는 게 현실적임.

그래서 방어 전략이 둘로 갈림.
하나는 취약점 제거 — 코드를 고쳐 버그 자체를 없애는 것.
다른 하나는 완화(mitigation) — 버그가 남아 있어도 공격을 못 써먹게 막는 것.

완화의 목표는 0으로 만드는 게 아님 / 비용을 올리는 것임.
버그 하나로 끝나던 공격을 여러 조건을 다 맞춰야 되게 바꿔 놓음.
ASLR · DEP · 카나리는 전부 “공격을 한 단계씩 더 어렵게” 깔아 둔 벽임.

취약점 제거 vs 익스플로잇 완화
두 가지 방어 전략
취약점 제거

버그를 코드에서 직접 없앰

버그 수 = 0 목표

현실에선 다 못 잡음

익스플로잇 완화

버그가 남아도 못 써먹게 막음

공격 비용 ↑↑

ASLR · DEP · 카나리

완화의 목표 = 0이 아니라 비용 올리기
P.02화이트해킹 · 11

ASLR — 주소를 매번 섞는다

10강의 공격은 “반환주소를 내가 아는 주소로 덮어 거기로 점프”였음. 핵심 전제는 그 주소를 안다는 것임.

ASLR(주소 공간 배치 무작위화)은 이 전제를 깸.
프로그램이 실행될 때마다 코드·스택·라이브러리가 매번 다른 주소에 깔림.
어제 0x400000이던 자리가 오늘은 0x7af120임.

공격자는 심을 목표 주소를 모름 / 추측해 봐야 거의 다 빗나감.
빗나간 점프는 엉뚱한 데로 가고 보통 프로그램이 그냥 죽음.
방어 관점에선 공짜에 가까운 벽임 — OS가 켜만 주면 모든 프로그램이 덕을 봄.

실행할 때마다 메모리 지도가 바뀜
실행할 때마다 주소가 섞임
코드스택라이브러리
1회차0x4000000xbf8200x7f1200
2회차0x7af1200x3c9010x5ad880
3회차0x2c8a400xe62130x91f400
공격자가 심을 주소를 못 고정함 → 추측 빗나감
P.03화이트해킹 · 11

DEP·NX와 스택 카나리

ASLR이 “어디로 점프할지”를 막는다면, 나머지 둘은 다른 길목을 막음.

DEP / NX(데이터 실행 금지)는 메모리를 두 종류로 나눔.
코드 영역은 실행만 · 데이터 영역은 읽고 쓰기만.
공격자가 입력으로 심은 셸코드는 데이터 칸에 있음 → 점프해도 실행 거부됨.

스택 카나리는 버퍼와 반환주소 사이에 감시값(카나리)을 끼워 둠.
오버플로우가 반환주소를 덮으려면 이 값부터 망가뜨려야 함.
함수가 끝날 때 카나리가 바뀌었으면 침범을 알아채고 즉시 멈춤 / 반환주소까지 닿기 전에 끊김.

데이터는 못 돌고 · 침범은 들킨다
DEP/NX · 스택 카나리
DEP / NX — 데이터 실행 금지
코드 영역실행 O
데이터 영역실행 ✕

심은 셸코드는 데이터 칸 → 실행 거부

스택 카나리 — 침범 탐지
버퍼입력이 채움
🐤 카나리감시값
반환주소보호 대상

끝날 때 카나리 바뀌면 → 멈춤

P.04화이트해킹 · 11

완화 토글 — 직접 해봄

말로는 감이 안 옴. 오른쪽에서 같은 가상 공격에 방어를 켰다 껐다 해봄.

공격은 늘 세 단계로 흐름.
카나리 통과 → 주소 맞히기 → 코드 실행.
세 단계가 다 통과해야 장악 성공임.

방어를 다 끄면 한 줄 공격이 그대로 뚫림.
카나리만 켜도 1단계에서 끊기고 · ASLR만 켜도 주소가 빗나가 2단계에서 멈춤.
하나만 켜도 한 단계가 막힘 / 셋을 겹쳐 켜면 벽이 더 두꺼워짐 — 이게 완화의 작동 방식임.

같은 공격 · 켜진 방어만 바뀜
완화 토글 · 같은 공격 · 켜진 방어만 바뀜
입력 — 방어를 켜고 끄기
가상 공격 — 위에서 아래로 흐름
1. 카나리 통과버퍼와 반환주소 사이의 감시값을 안 망가뜨리고 넘기
2. 주소 맞히기점프할 목표 주소를 정확히 알아내기
3. 코드 실행점프한 데이터 영역을 코드로 실행하기
출력 — 공격 결과
장악 성공방어 0개 켜짐

방어가 다 꺼짐. 같은 한 줄 공격이 카나리를 지나 · 주소를 맞혀 · 데이터를 코드로 실행함. 흐름이 통째로 넘어감.

하나만 켜도 공격 한 단계가 끊김 — 겹쳐 켜면 더 두꺼워짐

P.05화이트해킹 · 11

공방의 군비경쟁

완화는 끝이 아님. 벽이 올라가면 공격도 그 벽을 우회하게 진화함 — 이게 군비경쟁임.

DEP가 셸코드 실행을 막자, 공격자는 코드를 새로 안 심고 이미 있는 코드 조각을 이어 붙이는 ROP로 우회함.
ASLR이 주소를 섞자, 메모리를 흘리는 다른 버그로 주소를 먼저 캐내는 정보 유출을 끼워 넣음.

그래서 방어도 멈추지 않음 — CFI·섀도 스택 같은 새 완화가 계속 얹힘.
방어 관점의 결론은 단순함 / 완화 하나에만 기대지 말고 여러 겹을 겹쳐 두는 것.
한 겹이 우회돼도 다음 겹이 남아 공격 비용을 계속 끌어올림 — 이게 다층 방어임.

Q. ASLR이 어렵게 만드는 것은? (버그 발견 · 목표 주소 맞히기 · 데이터 실행 · 네트워크 접속)정답은 목표 주소 맞히기임.
ASLR은 코드·스택·라이브러리를 매번 무작위 주소에 깔아 둠.
그래서 공격자가 점프할 주소를 알 수 없고, 추측해도 거의 다 빗나감.
데이터 실행을 막는 건 DEP/NX, 침범 탐지는 카나리 — 역할이 서로 다름.
방어가 오르면 공격이 진화함
방어 ↔ 공격 · 끝없는 군비경쟁
방어가 올라가면
공격이 우회함
스택 카나리
포인터 덮어쓰기로 우회
DEP / NX
ROP — 기존 코드 조각 재사용
ASLR
정보 유출로 주소 먼저 캐냄
CFI · 섀도 스택
…다음 라운드
방어 = 여러 겹을 겹쳐 비용을 계속 올리기

3줄 요약

  1. 1ASLR·DEP — 공격과 방어의 군비경쟁
  2. 2익스플로잇 완화은 기초·정찰 → 웹 취약점 → 시스템 침투 → 네트워크·IoT → 레드팀·AI 흐름 안의 한 칸이다.
  3. 3개념을 외우는 것보다 입력을 바꾸면 무엇이 달라지는지 보는 것이 우선이다.

완료 전 점검

복습 카드

익스플로잇

ASLR·DEP — 공격과 방어의 군비경쟁

취약점

공격에 악용될 수 있는 시스템의 약점

페이로드

공격이 실행할 실제 코드나 데이터