스택 버퍼 오버플로우는 스택의 버퍼에서 발생하는 오버플로우를 뜻함
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_auth(char *password) {
int auth = 0;
char temp[16];
strncpy(temp, password, strlen(password));
if(!strcmp(temp, "SECRET_PASSWORD"))
auth = 1;
return auth;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: ./sbof_auth ADMIN_PASSWORD\n");
exit(-1);
}
if (check_auth(argv[1]))
printf("Hello Admin!\n");
else
printf("Access Denied!\n");
}
위의 코드에서 main 함수는 argv[1]을 check_auth 함수의 인자로 전달한 후 반환 값을 가져옴. 이 때, 반환 값이 0이 아니라면 "Hello Admin!"을, 0이라면 "Access Denied"라는 문자열을 출력함
그런데 check_auth에서 strncpy 함수를 통해 temp 버퍼를 복사할 때, temp의 크기인 16바이트가 아닌 인자로 전달된 password의 크기만큼 복사시킴 -> argv[1]에 16바이트가 넘는 문자열을 전달하면, 이들이 모두 복사되어서 스택 버퍼 오버플로우가 발생함
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(void) {
char secret[16] = "secret message";
char barrier[4] = {};
char name[8] = {};
memset(barrier, 0, 4);
printf("Your name: ");
read(0, name, 12);
printf("Your name is %s.", name);
}
위의 코드에서 8바이트 크기의 name 버퍼에 12바이트의 입력을 받음 -> 읽고자 하는 데이터인 secret 버퍼와의 사이에 barrier라는 4바이트의 널 배열이 존재하는데, 오버플로우를 이용하여 널 바이트를 모두 다른 값으로 변경하면 secret을 읽을 수 있음(널바이트가 없어져서 끝을 맺지 못함!)