731. 버퍼 오버플로우 공격 (서비스 다운/원격코드 실행 위협망 타격)
핵심 인사이트: "이름을 적으세요(최대 10글자)"라는 빈칸에 해커가 무식하게 100글자를 쑤셔 넣는다. 일반적인 프로그램은 넘치는 글자를 잘라버리지만, 허술하게 짠 프로그램은 남는 90글자가 메모리의 옆방(명령어 실행 구역)까지 뚫고 넘쳐흘러 들어가 버린다. 해커는 이 넘쳐흐른 90글자 속에 '관리자 권한을 내놔라'라는 악성 코드를 심어둔다. 메모리의 공간적 허점을 찌르는 가장 고전적이고 파괴적인 시스템 해킹, 버퍼 오버플로우다.
Ⅰ. 버퍼 오버플로우(Buffer Overflow)의 개념
- 개념: 프로그램이 데이터를 저장하기 위해 할당받은 임시 메모리 공간(버퍼)의 크기보다, 더 큰 용량의 데이터를 강제로 입력하여 데이터가 버퍼의 경계를 넘쳐흐르게(Overflow) 만드는 해킹 기법입니다.
- 넘쳐흐른 데이터는 바로 인접해 있는 메모리 영역(다른 변수나, 다음에 실행할 프로그램 명령어 주소 등)을 덮어써 버려 프로그램의 실행 흐름을 완전히 조작합니다.
Ⅱ. 공격의 타겟: 메모리 구조 (스택과 힙) 🌟
프로그램이 실행될 때 메모리는 크게 4구역(Code, Data, Heap, Stack)으로 나뉩니다. 이 중 공격의 주요 타겟은 두 곳입니다.
1. 스택 버퍼 오버플로우 (Stack Buffer Overflow) - 가장 보편적
- 스택(Stack): 함수가 실행될 때 임시 변수들을 담고, 함수가 끝나면 **"다음엔 어디로 돌아가서 실행해라"라는 복귀 주소(Return Address)**를 저장하는 공간입니다.
- 공격 원리: 해커가 이름 입력칸(버퍼)에 100글자를 밀어 넣습니다. 글자가 넘쳐흐르면서 스택에 적혀있던 '정상적인 복귀 주소'를 지워버리고, 해커가 원하는 **'악성코드가 심어진 메모리 주소'**로 덮어써 버립니다.
- 결과: 함수가 끝나는 순간, 컴퓨터는 해커가 적어둔 주소로 점프하여 쉘(Shell, 관리자 터미널)을 열어주는 악성 코드를 무비판적으로 실행해 버립니다.
2. 힙 버퍼 오버플로우 (Heap Buffer Overflow)
- 힙(Heap): 사용자가 동적으로 크기를 늘렸다 줄였다 할 수 있는 자유로운 메모리 공간입니다.
- 스택처럼 복귀 주소가 바로 옆에 있진 않지만, 동적 메모리 구조(Linked List 등)를 관리하는 포인터를 덮어써서 시스템을 혼란에 빠뜨려 프로그램(웹 서버 등)을 기절시키는 DoS 공격에 주로 쓰입니다.
Ⅲ. 현대 운영체제의 3대 방어 대책 (해커와의 창과 방패) 🌟
이 고전적인 공격을 막기 위해 오늘날의 윈도우와 리눅스는 철통같은 방어막을 쳐두었습니다.
- ASLR (주소 공간 배치 난수화):
- 해커가 스택을 덮어쓸 때 "악성코드가 있는 주소"를 정확히 알아야 점프할 수 있습니다.
- ASLR은 컴퓨터가 켜질 때마다, 또는 프로그램이 실행될 때마다 메모리의 주소(스택, 힙 등) 위치를 무작위(Random)로 마구 섞어버리는 기술입니다. 해커는 악성코드의 주소가 매번 바뀌므로 점프할 과녁을 찾지 못하게 됩니다.
- DEP/NX (데이터 실행 방지):
- 스택이나 힙은 '데이터'를 담는 곳이지 '명령어'를 실행하는 곳이 아닙니다. CPU 차원에서 "이 구역(스택)에 있는 텍스트는 절대 코드로 실행하지 마라!"라고 실행 방지(No-eXecute) 도장을 찍어두는 기술입니다. 해커가 점프에 성공해도 코드가 실행되지 않습니다.
- Stack Canary (카나리아):
- 옛날 광부들이 유독가스를 감지하려고 탄광에 카나리아 새를 데려간 것에서 유래했습니다.
- 버퍼와 복귀 주소 사이에 **'임의의 쓰레기 난수 값(카나리아)'**을 몰래 끼워 넣습니다. 만약 해커가 버퍼를 넘치게 하면 이 카나리아 값부터 먼저 덮어쓰여(파괴)집니다. 함수가 끝나기 전 카나리아가 죽었는지(값이 변했는지) 확인하고, 변했으면 "해킹이다!"라며 프로그램을 즉시 강제 종료해 버립니다.
📢 섹션 요약 비유: 버퍼 오버플로우는 서류철(버퍼)에 A4용지를 10장만 넣으라고 했는데 100장을 쑤셔 넣는 짓입니다. 삐져나온 종이들이 책상 옆에 있던 '사장님의 결재 서류(복귀 주소)' 위를 덮어버렸고, 비서(CPU)는 튀어나온 종이에 적힌 "해커의 월급을 1억으로 올려라"라는 글자를 사장님의 결재 서류인 줄 착각하고 그대로 실행해 버립니다. 이를 막기 위해 책상 위치를 매일 바꾸거나(ASLR), 서류철 구역에서는 아예 도장을 못 찍게(DEP) 막는 방어법이 동원됩니다.