Проблема с переполнением буфера

Я изучаю переполнение буфера. Написал по примеру программу с такой проблемой:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int check_auth(char *password)
{
    int auth_flag = 0;
    char password_buffer[16];

    strcpy(password_buffer, password);

    if(strcmp(password_buffer, "enter") == 0)
        auth_flag = 1;
    return auth_flag;
}

int main(int argc, char *argv[])
{
    if(argc < 2){
        printf("Не введён пароль\n");
        exit(0);
    }
    if(check_auth(argv[1])){
        printf("-------------------------------Доступ предоставлен-------------------------------\n");
        printf("WELCOME ARTEM\n");
    }
    else
        printf("В доступе отказано\n");
}

Было сказано, что если поменять инициализацию переменных password_buffer и auth_flag, то проблема с уязвимостью переполнения буфера исчезнет. Но ничего не получается. Посмотрел в отладчике: переменная auth_flag находится после password_buffer. Как исправить?


Ответы (1 шт):

Автор решения: AlexGlebe

Функция strcpy очень опасна при использовании на неизвестных строках. Желательно копировать до исчерпания размера буфера с помощью strncpy.

 char password_buffer[16];
 // копируем максимум 16 байт
 strncpy(password_buffer, password,sizeof(password_buffer));
 // а если строка не вмещается фиксируем конец строки прямо.
 // без символа '\00' будут проблемы.
 password_buffer[sizeof(password_buffer)-1] = '\00';
→ Ссылка