
버퍼 오버플로우(Buffer Overflow): 컵에 물이 넘치면 생기는 일
C언어의 strcpy 하나가 어떻게 전체 시스템 권한을 탈취하게 만들까요? 스택 오버플로우 공격의 원리와 이를 막기 위한 ASLR, Canary, NX Bit 같은 방어 기법들을 파헤쳐봤습니다.

C언어의 strcpy 하나가 어떻게 전체 시스템 권한을 탈취하게 만들까요? 스택 오버플로우 공격의 원리와 이를 막기 위한 ASLR, Canary, NX Bit 같은 방어 기법들을 파헤쳐봤습니다.
잘 돌아가던 Node.js 서버가 매일 밤 12시만 되면 'Heap Out of Memory'를 뱉으며 죽었습니다. 원인은 전역 변수에 쌓인 데이터 더미였죠. 이 디버깅 과정을 통해 배운 Stack과 Heap의 차이, 그리고 메모리 누수를 막는 방법을 정리했습니다.

나는 그냥 재미있어 보이는 링크를 눌렀을 뿐인데, 내 이름으로 송금이 되었습니다. 로그인된 상태를 악용하는 교묘한 공격, CSRF를 이해하기까지의 여정.

내 서버는 왜 걸핏하면 뻗을까? OS가 한정된 메모리를 쪼개 쓰는 처절한 사투. 단편화(Fragmentation)와의 전쟁.

프론트엔드 개발자가 알아야 할 4가지 저장소의 차이점과 보안 이슈(XSS, CSRF), 그리고 언제 무엇을 써야 하는지에 대한 명확한 기준.

8비트짜리 게임기 팩을 꽂아서 게임을 하던 시절, 특정 레벨에서 이상한 행동을 하면 갑자기 엔딩 화면이 나오거나 무적 모드가 되는 버그(Glitch)들이 있었습니다. 이들 중 상당수는 메모리 관리를 잘못해서 생긴 일이었습니다.
버퍼(Buffer)는 데이터를 임시로 담아두는 그릇(메모리 공간)입니다. 오버플로우(Overflow)는 넘친다는 뜻입니다.
100ml 컵에 200ml 물을 부으면 어떻게 될까요? 물은 식탁으로 흘러넘쳐, 옆에 있던 스마트폰을 적시고 고장 낼 수도 있습니다. 컴퓨터에서도 똑같습니다. "이름을 10글자 입력하세요"라고 했는데 100글자를 입력하면, 넘친 데이터가 옆에 있는 중요한 메모리 영역(예: 관리자 권한 플래그, 함수 복귀 주소)을 덮어써 버립니다.
이것이 해킹의 고전이자 제왕인 버퍼 오버플로우 공격입니다.
이 취약점이 단순히 이론적인 것이 아님을 증명한 역사적인 사건들이 있습니다.
인터넷 역사상 최초의 웜 바이러스입니다. 로버트 모리스라는 대학원생이 만든 이 프로그램은 fingerd라는 유닉스 데몬의 buffer overflow 취약점을 이용했습니다. gets() 함수를 통해 입력을 받을 때 길이를 검사하지 않는 점을 악용해 자신의 코드를 실행시켰고, 당시 인터넷에 연결된 전 세계 컴퓨터의 10%를 마비시켰습니다.
마이크로소프트 SQL 서버의 버퍼 오버플로우 취약점을 이용했습니다. 단 376바이트의 작은 패킷 하나가 서버를 감염시켰고, 감염된 서버는 다시 무작위 IP로 패킷을 쏘아대며 기하급수적으로 퍼졌습니다. 단 10분 만에 전 세계 인터넷 트래픽을 마비시켰으며, 한국의 인터넷망이 불통 되는 '대란'을 일으킨 주범이기도 합니다.
프로그램이 함수를 호출할 때, Stack이라는 메모리 영역을 사용합니다.
스택에는 지역 변수(Local Variable)와 복귀 주소(Return Address)가 저장됩니다. 이 복귀 주소가 바로 해커의 타겟입니다.
char buffer[10] 같은 데이터.buffer에 10글자가 아니라 100글자를 입력합니다.C언어를 배울 때 가장 먼저 배우면서, 가장 위험한 함수가 strcpy입니다.
void vulnerable_function(char *str) {
char buffer[10];
strcpy(buffer, str); // 길이 검사를 안 함!
}
strcpy는 "복사할 문자열이 버퍼보다 긴지" 검사하지 않습니다. 그저 NULL 문자(\0)가 나올 때까지 무작정 복사합니다.
그래서 현대 컴파일러에서는 strcpy 대신 strncpy, strlcpy 등 길이를 검사하는 안전한 함수 사용을 권장(강제)합니다.
gets() 함수는 아예 C11 표준에서 퇴출(Removed)당했습니다. 존재 자체가 보안 위협이기 때문입니다.
운영체제와 컴파일러 개발자들도 가만히 있지는 않았습니다. 버퍼 오버플로우를 막기 위한 3대 방어막이 등장했습니다.
Stack Smashing Detected).방어가 강력해지면 공격도 진화합니다. NX Bit와 ASLR을 우회하기 위해 해커들은 ROP (Return Oriented Programming)라는 기법을 창안했습니다.
libc 같은 표준 라이브러리에는 pop eax; ret; 같은 기계어 코드 조각들이 무수히 많습니다.ret 명령어를 만날 때마다 다음 가젯으로 점프하며, 해커가 의도한 동작을 수행합니다.이것이 보안(Security)의 본질입니다. 끝없는 창과 방패의 싸움입니다.
우리가 모든 해킹 기법을 알 필요는 없지만, 기본 원칙은 지켜야 합니다.
strcpy, gets, sprintf 대신 strncpy, fgets, snprintf를 사용하세요.