argv와 버퍼 오버플로우argv와 기본 개념argv는 C 프로그램이 실행될 때 전달되는 명령줄 인수를 포함하는 배열입니다. 이 배열과 함께 argc라는 정수도 함께 전달되며, 이는 명령줄 인수의 개수를 나타냅니다.
argc (argument count):
argv (argument vector):
#include <stdio.h>
#include <string.h>
void vulnerableFunction(int argc, char *argv[]) {
char buffer[10];
if (argc > 1) {
strcpy(buffer, argv[1]); // 버퍼 크기 확인 없이 문자열 복사
printf("Buffer contents: %s\n", buffer);
}
}
int main(int argc, char *argv[]) {
vulnerableFunction(argc, argv);
return 0;
}
strcpy(buffer, argv[1])는 argv[1]의 크기를 확인하지 않고 buffer에 복사합니다.argv[1]의 길이가 10을 초과하면, 버퍼 오버플로우가 발생하여 메모리의 다른 부분이 손상될 수 있습니다.#include <stdio.h>
#include <string.h>
void safeFunction(int argc, char *argv[]) {
char buffer[10];
if (argc > 1) {
// 입력 문자열의 길이를 확인하여 버퍼 오버플로우 방지
if (strlen(argv[1]) < sizeof(buffer)) {
strncpy(buffer, argv[1], sizeof(buffer) - 1); // 버퍼 크기만큼만 문자열 복사
buffer[sizeof(buffer) - 1] = '\0'; // 널 종료 문자 추가
printf("Buffer contents: %s\n", buffer);
} else {
printf("Input too long and will be truncated.\n");
strncpy(buffer, argv[1], sizeof(buffer) - 1); // 버퍼 크기만큼만 문자열 복사
buffer[sizeof(buffer) - 1] = '\0'; // 널 종료 문자 추가
printf("Truncated buffer contents: %s\n", buffer);
}
}
}
int main(int argc, char *argv[]) {
safeFunction(argc, argv);
return 0;
}
strlen(argv[1])을 사용하여 입력 문자열의 길이를 확인합니다.buffer의 크기를 초과하지 않으면 strncpy로 안전하게 복사합니다.strncpy로 버퍼 크기만큼만 복사합니다.이러한 방식으로 argv를 처리할 때 버퍼 오버플로우를 방지할 수 있습니다. 입력값의 길이를 항상 검사하고, 안전하게 복사하는 것이 중요합니다.