오늘 끝나면
익스플로잇 완화
- ✓익스플로잇 완화의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 익스플로잇이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
ASLR·DEP — 공격과 방어의 군비경쟁 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
화이트해킹 · 11
익스플로잇
완화
버그를 다 없애는 건 불가능함.
그래서 OS는 공격을 “어렵게” 만드는 벽을 깔아둠.
ASLR · DEP · 카나리 — 완화의 삼총사임.
버그는 못 없앰 · 비싸게 만듦
10강에서 본 버퍼 오버플로우 같은 버그는 끝없이 새로 생김. 다 잡는 건 포기하는 게 현실적임.
그래서 방어 전략이 둘로 갈림.
하나는 취약점 제거 — 코드를 고쳐 버그 자체를 없애는 것.
다른 하나는 완화(mitigation) — 버그가 남아 있어도 공격을 못 써먹게 막는 것.
완화의 목표는 0으로 만드는 게 아님 / 비용을 올리는 것임.
버그 하나로 끝나던 공격을 여러 조건을 다 맞춰야 되게 바꿔 놓음.
ASLR · DEP · 카나리는 전부 “공격을 한 단계씩 더 어렵게” 깔아 둔 벽임.
버그를 코드에서 직접 없앰
현실에선 다 못 잡음
버그가 남아도 못 써먹게 막음
ASLR · DEP · 카나리
ASLR — 주소를 매번 섞는다
10강의 공격은 “반환주소를 내가 아는 주소로 덮어 거기로 점프”였음. 핵심 전제는 그 주소를 안다는 것임.
ASLR(주소 공간 배치 무작위화)은 이 전제를 깸.
프로그램이 실행될 때마다 코드·스택·라이브러리가 매번 다른 주소에 깔림.
어제 0x400000이던 자리가 오늘은 0x7af120임.
공격자는 심을 목표 주소를 모름 / 추측해 봐야 거의 다 빗나감.
빗나간 점프는 엉뚱한 데로 가고 보통 프로그램이 그냥 죽음.
방어 관점에선 공짜에 가까운 벽임 — OS가 켜만 주면 모든 프로그램이 덕을 봄.
| 코드 | 스택 | 라이브러리 | |
|---|---|---|---|
| 1회차 | 0x400000 | 0xbf820 | 0x7f1200 |
| 2회차 | 0x7af120 | 0x3c901 | 0x5ad880 |
| 3회차 | 0x2c8a40 | 0xe6213 | 0x91f400 |
DEP·NX와 스택 카나리
ASLR이 “어디로 점프할지”를 막는다면, 나머지 둘은 다른 길목을 막음.
DEP / NX(데이터 실행 금지)는 메모리를 두 종류로 나눔.
코드 영역은 실행만 · 데이터 영역은 읽고 쓰기만.
공격자가 입력으로 심은 셸코드는 데이터 칸에 있음 → 점프해도 실행 거부됨.
스택 카나리는 버퍼와 반환주소 사이에 감시값(카나리)을 끼워 둠.
오버플로우가 반환주소를 덮으려면 이 값부터 망가뜨려야 함.
함수가 끝날 때 카나리가 바뀌었으면 침범을 알아채고 즉시 멈춤 / 반환주소까지 닿기 전에 끊김.
심은 셸코드는 데이터 칸 → 실행 거부
끝날 때 카나리 바뀌면 → 멈춤
완화 토글 — 직접 해봄
말로는 감이 안 옴. 오른쪽에서 같은 가상 공격에 방어를 켰다 껐다 해봄.
공격은 늘 세 단계로 흐름.
카나리 통과 → 주소 맞히기 → 코드 실행.
세 단계가 다 통과해야 장악 성공임.
방어를 다 끄면 한 줄 공격이 그대로 뚫림.
카나리만 켜도 1단계에서 끊기고 · ASLR만 켜도 주소가 빗나가 2단계에서 멈춤.
하나만 켜도 한 단계가 막힘 / 셋을 겹쳐 켜면 벽이 더 두꺼워짐 — 이게 완화의 작동 방식임.
방어가 다 꺼짐. 같은 한 줄 공격이 카나리를 지나 · 주소를 맞혀 · 데이터를 코드로 실행함. 흐름이 통째로 넘어감.
하나만 켜도 공격 한 단계가 끊김 — 겹쳐 켜면 더 두꺼워짐
공방의 군비경쟁
완화는 끝이 아님. 벽이 올라가면 공격도 그 벽을 우회하게 진화함 — 이게 군비경쟁임.
DEP가 셸코드 실행을 막자, 공격자는 코드를 새로 안 심고 이미 있는 코드 조각을 이어 붙이는 ROP로 우회함.
ASLR이 주소를 섞자, 메모리를 흘리는 다른 버그로 주소를 먼저 캐내는 정보 유출을 끼워 넣음.
그래서 방어도 멈추지 않음 — CFI·섀도 스택 같은 새 완화가 계속 얹힘.
방어 관점의 결론은 단순함 / 완화 하나에만 기대지 말고 여러 겹을 겹쳐 두는 것.
한 겹이 우회돼도 다음 겹이 남아 공격 비용을 계속 끌어올림 — 이게 다층 방어임.
Q. ASLR이 어렵게 만드는 것은? (버그 발견 · 목표 주소 맞히기 · 데이터 실행 · 네트워크 접속)
정답은 목표 주소 맞히기임.ASLR은 코드·스택·라이브러리를 매번 무작위 주소에 깔아 둠.
그래서 공격자가 점프할 주소를 알 수 없고, 추측해도 거의 다 빗나감.
데이터 실행을 막는 건 DEP/NX, 침범 탐지는 카나리 — 역할이 서로 다름.