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;
}
이상적인 실행 결과