bof buffer overflow

agnusdei·2024년 7월 14일
0

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를 처리할 때 버퍼 오버플로우를 방지할 수 있습니다. 입력값의 길이를 항상 검사하고, 안전하게 복사하는 것이 중요합니다.

profile
DevSecOps ⚙️ + CTF🚩

0개의 댓글