버퍼 오버플로우란 무엇인가? 실습 가이드
실제 C 예제, 스택 다이어그램, 그리고 직접 확인할 수 있는 도구들로 버퍼 오버플로우의 실제 작동 원리를 배웁니다.
버퍼 오버플로우는 프로그램이 고정 크기 메모리 영역에 그 영역이 담을 수 있는 것보다 더 많은 데이터를 쓸 때 발생합니다. 초과된 바이트들이 인접한 메모리로 유출되고, 그 버퍼 옆에 무엇이 있는지에 따라 변수를 손상시키거나, 프로그램을 충돌시키거나, 실행 흐름을 완전히 탈취할 수 있습니다. 소프트웨어 보안에서 가장 오래된 취약점 클래스 중 하나이며 오늘날에도 CTFs, CVEs, 그리고 임베디드 펌웨어에서 여전히 나타납니다.
취약한 패턴
C의 전형적인 예제입니다:
#include <string.h>
void greet(char *name) {
char buffer[64];
strcpy(buffer, name);
}
int main(int argc, char **argv) {
greet(argv[1]);
return 0;
}
strcpy는 전달받은 문자열을 buffer로 복사합니다. 범위 검사가 없습니다. argv[1]이 64바이트보다 길면, 복사는 배열의 끝을 넘어 계속됩니다. 스택에서 buffer는 다른 지역 변수들, 저장된 레지스터들, 그리고 결국 CPU에게 greet() 실행이 끝난 후 어디로 점프할지를 알려주는 반환 주소 아래에 있습니다. 그 반환 주소를 당신이 제어하는 주소로 덮어쓰면, 다음에 실행될 내용을 제어할 수 있습니다.
이것이 여전히 컴파일되고 실행되는 이유
C와 C++는 원시 배열에 대한 자동 범위 검사를 수행하지 않습니다. strcpy, gets, sprintf, strcat 같은 함수들은 목적지의 실제 크기를 신경 쓰지 않고 null 종료자나 소스 길이만 신경 쓰기 때문에 버퍼의 끝을 넘어 기꺼이 쓸 것입니다. 이를 strncpy나 snprintf와 비교해보면, 이들은 명시적 크기 인수를 받고 거기서 멈춥니다. 취약점은 사실
AI 도움을 받아 작성했으며, Michal Pilch(CISSP), Korra Studio에서 검토 및 게시했어요.
이것은 Korra Studio 나레지베이스의 한 노트예요. 플랫폼은 모든 주제를 1-to-1 멘토링과 함께 제공해요.
무료로 시작하기arrow_forward