🧨 스택 버퍼 오버플로우 시뮬레이터 KISA #16 · 버퍼 오버플로우

고정 크기 16바이트 스택 버퍼를 strcpy/gets 로 공격자 입력으로 채웁니다. 입력이 16바이트를 넘어가면 스택 카나리, 저장된 프레임 포인터, 마지막으로 반환주소까지 덮어써 제어 흐름을 탈취합니다.

① 취약: 경계 없는 strcpy(buf, input) VULNERABLE

스택 레이아웃(아래가 높은 주소): char buf[16] · 4바이트 카나리 · 4바이트 저장된 EBP · 4바이트 반환주소. 입력을 타이핑하거나 슬라이더를 움직이면 스택 다이어그램이 실시간으로 갱신됩니다. 16바이트를 넘는 바이트가 카나리 → EBP → RET 순으로 흘러넘칩니다.

② 안전: 경계 복사 + 스택 카나리 검사 SECURE

수정본은 strncpy/snprintf로 최대 sizeof(buf)-1 바이트만 복사하고 NUL 종료해 오버플로우가 불가능합니다. 컴파일러 스택 카나리(-fstack-protector)도 ret 직전에 손상을 탐지해 프로그램을 중단시킵니다.

③ 취약 vs 안전 코드 (C)

VULNERABLE
// C — 경계 검사 없는 복사
void handle(char *input){
    char buf[16];
    strcpy(buf, input);   // 길이 무시 → 오버플로우
    // gets(buf);          // 마찬가지로 위험
    printf("%s\n", buf);
}   // ret 시 덮어쓴 반환주소로 점프 → 제어 탈취
SECURE
// C — 경계 복사 + NUL 종료 (+ 카나리)
void handle(const char *input){
    char buf[16];
    snprintf(buf, sizeof(buf), "%s", input);
    // strncpy(buf, input, sizeof(buf)-1);
    // buf[sizeof(buf)-1] = '\0';
    printf("%s\n", buf);
}   // -fstack-protector 가 ret 전 카나리 검증
방어 핵심: 고정 버퍼에 strcpy/gets/sprintf/scanf("%s") 사용 금지 · 길이 제한 API(strncpy/snprintf/fgets)를 쓰고 항상 NUL 종료 · 컴파일러 완화책 활성화: 스택 카나리(-fstack-protector-strong), ASLR, 실행 불가 스택(NX/DEP) · 가능하면 메모리 안전 언어 사용.
⚠️ 교육용 시뮬레이션입니다. 스택은 페이지 내부 mock 모델이며 실제 메모리 쓰기나 코드 실행은 없습니다.