Проблема с переполнением буфера
Я изучаю переполнение буфера. Написал по примеру программу с такой проблемой:
#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';