Ошибка форматной строки - PullRequest
3 голосов
/ 03 марта 2012

У меня есть простая программа на C:

char user_input[100];
scanf("%s", user_input);
printf(user_input);

Насколько я понимаю, это представляет уязвимость безопасности;например, ввод связки% x распечатает содержимое стека.

Но как можно распечатать выбранную ячейку памяти?

Я прочитал, что:

\x10\x01\x48\x08_%08x.%08x.%08x.%08x.%08x|%s|

Следуетвыгрузить содержимое памяти по адресу 0x08480110 из этой статьи .Но вместо этого он печатает следующие 4 байта в строку формата в стеке.Я пытаюсь понять, почему.

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Сама строка формата будет в стеке (как вы объявили user_input в качестве локальной переменной). Поэтому, если вы пройдете по стеку достаточно далеко (что именно %08x заставляет printf сделать), то в конечном итоге вы попадете в начало строки формата. %s говорит printf прочитать адрес из стека, а затем распечатать строку, найденную в этом месте. Поэтому он читает первые 4/8 байтов строки формата и использует их в качестве адреса.

Конечно, чтобы это работало, вам нужно точно знать, как далеко нужно прочитать стек, чтобы попасть в строку формата. Таким образом, вам может потребоваться настроить число %08x.

Кроме того, пользователь, вводящий \x10 во время выполнения, отличается от строкового литерала в исходном коде, который содержит \x10 ...

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

Это подробно объясняется в Использование уязвимости формата строки.

Если вам нужна картинка, см. Раздел 4.4 этих примечаний к лекции .

...