как переписать следующую функцию, чтобы она больше не была уязвимой для переполнения буфера стека - PullRequest
0 голосов
/ 17 декабря 2010

Мне нужно переписать функцию, чтобы она больше не была уязвимой для переполнения буфера стека.

void hello (char *tag)
{
   char inp [16];

   printf("enter value for %s:", tag);
   gets(inp);
   printf("hello your %s is %s\n", tag, inp);
}

Кроме того, как мне переписать следующий код, чтобы избежать переполнения буфера:

int main (int argc, char *argv[ ]) {
    int valid=FALSE;
    char str1[8];
    char str2[8];

    next_tag(str1);
    gets(str2);
    if (strncmp(str1,str2,8)==0)
        valid=TRUE;
    printf("buffer: str1(%s),str2(%s),valid(%d) \n", str1, str2, valid);
}

Ответы [ 5 ]

1 голос
/ 17 декабря 2010

Просто используйте fgets () вместо gets ().Позволяет ограничить количество символов, хранящихся в буфере.

0 голосов
/ 26 октября 2013

Вы можете создать тестовый пример после получения строк, чтобы проверить его длину. Если вы принимаете ввод, продолжайте, иначе прекратите или паникуйте!
Выполнить тесты до этой строки:

if (strncmp(str1,str2,8)==0)
    valid=TRUE;
0 голосов
/ 17 декабря 2010

Я не собираюсь публиковать код, так как это выглядит как домашнее задание.

Переполнение буфера происходит при попытке получить доступ к расположению буфера сверх его размера.

например, в вашей функции hello(...) это будет пытаться получить доступ к элементу массива inp больше 15.

Вы просите пользователя предоставить индекс в массив, а затем возвращает значение этого местоположения массива.

Чтобы предотвратить переполнение, вам обязательно нужно убедиться, что диапазон указанного пользователем индекса меньше размера этого массива.

Я не могу комментировать второй фрагмент кода, потому что он неполный.

0 голосов
/ 17 декабря 2010
void hello (char *tag)
{
   char inp [16];

   printf("enter value for %s:", tag);
   fgets(inp, 16, stdin);
   printf("hello your %s is %s\n", tag, inp);
}

И аналогично для другого.

0 голосов
/ 17 декабря 2010

Используйте fgets вместо get.Сохраняйте размер по длине буфера, и вы не переполните его.

...