Что-то не так с printf или что-то - PullRequest
0 голосов
/ 20 января 2019

Я читаю некоторые материалы о безопасном программировании. Когда я вхожу: ./a.out% .622496x% .622496x% n

. / A.out% .. 622496x% n

. / A.out% .633x% .63336x% n

. / A.out% .6edd33x% .63336x% n

Некоторые получат coredump, некоторые не смогут, могут 't выяснить, почему они печатают все 0.

Вот код example.c gcc example.c

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

int main(int argc,char *argv[])
{
    char buffer[512]="";
    strncpy(buffer,argv[1],500);
    printf(buffer);

    return 0; 
}

1 Ответ

0 голосов
/ 20 января 2019

Вы должны очистить свои входные данные перед отображением такой строки.

Поскольку у вас есть %xxx - строка, printf интерпретирует их как потенциальные аргументы, а затем попытается получить их, следовательно,основной дамп.Но это идет дальше, так как это может означать атаки безопасности через этот механизм.В некотором смысле, это эквивалент C-инъекций SQL.

Как и @TypeIA, правильный способ сделать это - рассмотреть buffer в качестве аргумента строки форматирования (printf("%s", buffer)), а несама строка форматирования.Это также причина, по которой некоторые компиляторы будут предупреждать, если вы создадите функцию с аргументами ( char * format, ... ); (не const).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...