스킬캠퍼스

오늘 끝나면

익스플로잇 완화

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

실습 미션

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 — 공격과 방어의 군비경쟁

취약점

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

페이로드

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