2주차 실습 예제

2주차 스택 메모리 예제

예제 1 스택 메모리 침범
예제 2 입력 버퍼 오버플로우

예제 1. 스택 메모리 침범

포인터를 이용해 현재 변수 바깥의 스택 메모리를 건드릴 때 어떤 식으로 보일 수 있는지 설명하는 예제입니다.

주의: 이 코드는 정의되지 않은 동작입니다. 아래 출력은 학습용으로 정리한 예시일 뿐, 실제 결과는 실행 환경마다 달라질 수 있습니다.
#include <stdio.h>

int main(void) {
    int a;              // 스택에 지역 변수 a 선언
    int *pt = &a;       // a의 주소를 포인터에 저장

    *pt = 1;            // 정상적으로 a에 값 1 저장
    *(pt - 1) = 2;      // a보다 "앞쪽" 스택 메모리를 건드림 (정의되지 않은 동작)
    *(pt - 2) = 3;      // 더 앞쪽 메모리 건드림
    *(pt - 3) = 4;
    *(pt - 4) = 5;

    // 출력 시도
    for (int i = 0; i < 5; i++) {
        printf("*(pt - %d) = %d\n", i, *(pt - i));
    }

    return 0;
}

예제 2. 입력 버퍼 오버플로우

문자 배열 크기보다 긴 입력을 받으면 옆 메모리까지 덮어쓸 수 있다는 점을 보여주는 예제입니다.
고전적인 해킹 수법이기도 합니다.

주의: 이 코드는 정의되지 않은 위험한 코드입니다. 아래 출력은 password가 손상될 수 있음을 설명하기 위한 예시입니다.
#include <stdio.h>

int main(void) {
    char id[10];   // 최대 9글자 + '\0' 저장 가능
    char password[7] = "123456";

    printf("아이디 입력: ");
    scanf("%s", id); // 길이 제한 없음 → 10자 이상 입력 시 위험

    printf("입력한 id: %s\n", id); // 운이 좋으면 비밀번호가 같이 나올 지도 모름
    printf("원래 password: %s\n", password); // 운이 좋으면 비밀번호를 원하는데로 초기화할 수도 있다.

    return 0;
}