Короткое переопределение без знака - PullRequest
1 голос
/ 28 марта 2012

while (fscanf (fp, "% s", строки [cnt ++])! = EOF); ​​

cnt - неподписанный шорт. Он имеет 65535. Поэтому, когда когда-либо файл достигает больше, чем эти много слов, cnt снова инициализируется в 0 и продолжается. Мой вопрос: это происходит на всех компиляторах или только на gcc?

Ответы [ 4 ]

2 голосов
/ 28 марта 2012
char filename[128];
strcpy(filename, argv[1]);

filename может хранить только 128 символов (127 + NULL символ). Переполнение может произойти, когда пользователь передает аргумент, содержащий более 127 символов (как указано в paxdiablo).

В идеале ваше приложение подсчитывает, сколько символов содержится во входном параметре, и выделяет переменную, достаточно большую для хранения этой информации:

int param_size = strlen(argv[1]);
char* filename = malloc(param_size+1);
if (!filename)
{
     // TODO: memory allocation failed! Need to handle error.
     // (notify the user, quit the application or something).
}
strcpy(filename, argv[1]);
0 голосов
/ 28 марта 2012

Вы, вероятно, можете избежать такого кода:

char filename[128];
strcpy(filename, argv[1]);

... и написать код, похожий на этот:

#define BUFSIZE 128
char filename[BUFSIZE];
strncpy(filename, argv[1], BUFSIZE);

StrNcpy-версия strcpy ограничивает количество символов, которые вы можете скопировать,Использование макросов для размеров - это хорошо, поэтому вы можете изменить размер буфера позже и не заполнять свой код магическими числами.

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

strings[STRINGSIZE] = 0; 
cnt = cnt %  STRINGSIZE;

... так что вы гарантируете, что ваша строка имеет ограничение размера в этих пределах.

0 голосов
/ 28 марта 2012

Уязвимости:

1) Нет проверки argc, чтобы увидеть, существует ли на самом деле argv [1]. Индекс может быть недействительным, если пользователь только что набрал homework.exe без каких-либо параметров командной строки.

2) Не проверяется, поместится ли содержимое argv [1] в буфер имени файла. В настоящий момент предполагается, что файл состоит из текстовых строк, длина строки которых не превышает 79 символов.

3) fscanf () предполагает определенный формат файла. Это может быть или не быть уязвимостью. Если он не содержит строк в заданном формате, или если он содержит больше строк, чем уместится в беззнаковом коротком, программа завершится сбоем и сгорит.

0 голосов
/ 28 марта 2012

Здесь есть 3 различные уязвимости:

  1. strcpy(filename, argv[1]);, о которых упоминали другие.

  2. strings[cnt++] - если файлсодержит более USHRT_MAX строк, вы превысите массив strings.Вы начнете читать в области стека, используемые для других целей.

  3. fscanf(fscanf(fp, "%s",... - если строка содержит более 79 символов, вы перезапишете следующую строку.Это будет безопасно, если вы не превысите весь массив строк.

...