В документе Использование уязвимостей форматной строки авторы приводят следующий пример кода, в котором input
— это нефильтрованный пользовательский ввод.
char outbuf[512];
char buffer[512];
sprintf (buffer, "ERR Wrong command: %400s", input);
sprintf (outbuf, buffer);
Затем они объясняют, что, используя специальную строку формата в качестве входных данных, они могут обойти ограничение %400s
:
"%497d\x3c\xd3\xff\xbf<nops><shellcode>"
Это создает строку длиной 479 символов. Однако я не могу найти объяснение тому, как %479d
обходит ограничение %400s
. Как этот ввод позволяет sprintf записывать строку длиннее 400 символов?