Как работает% NNN $ hhn в строке формата? - PullRequest
0 голосов
/ 02 октября 2011

Я пробую классическую уязвимость строки формата. Я хочу знать, как именно работает следующая строка формата:

"% NNN $ hhn", где 'N' - любое число.

Например: printf ("% 144 $ hhn", ....);

Как это работает и как использовать это, чтобы перезаписать любой адрес, который я хочу, произвольным значением?

Спасибо и всего наилучшего,
Хришикеш Мурали

1 Ответ

0 голосов
/ 15 ноября 2011

Это расширение POSIX (не найдено в C99), которое просто позволит вам выбрать, какой аргумент из списка аргументов использовать для источника данных.

При обычном printf каждый спецификатор формата % извлекает текущий аргумент из списка и перемещает «указатель» к следующему. Это означает, что если вы хотите напечатать одно значение двумя разными способами, вам нужно что-то вроде:

printf ("%c %d\n", chVal, chVal);

Используя позиционные спецификаторы, вы можете сделать это следующим образом:

printf ("%1$c %1$d\n", chVal);

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

Другой пример на странице википедии:

printf ("%2$d %2$#x; %1$d %1$#x",16,17);

, который даст вам вывод:

17 0x11; 16 0x10

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

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

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

...