Как записать значение в адрес при атаке форматной строки - PullRequest
8 голосов
/ 31 января 2011

Я прохожу курс по безопасности, который требует от нас атаки форматной строки на виртуальной машине Unix.Уязвимость - это строка формата, использующая аргумент командной строки.

Мой вопрос заключается в том, как записать значение в адрес в строке формата (например, записать адрес кода оболочки в адрес возврата функции)?

ДляНапример, я пытаюсь записать значение 987654 в адрес возврата 0xaabbccdd.Я пробовал некоторые строки, например "AAAA_%10$x", и это может привести к тому, что программа напечатает AAAA_41414141.

Затем я заменяю буквы своим адресом и пытаюсь перезаписать его.

\xdd\xcc\xbb\xaa_%10$x_%54321x_%n"

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

примечание: среда имеет старую версию gcc, поэтому нет необходимости беспокоиться о том, что значение слишком велико.Какие-либо предложения?Спасибо.

Ответы [ 3 ]

2 голосов
/ 31 января 2011

printf не может нигде писать без использования спецификатора формата %n.Это тот, кого ты скучаешь.Что-то вроде %.987654d%n запишет число 987654 (количество выводимых символов) по адресу, указанному вторым аргументом, где первый аргумент - int.Этого должно быть достаточно, чтобы вы начали.

0 голосов
/ 11 февраля 2016

вы должны указать смещение стека для записи в формататоре% n, например %[offset]\$n

пример: %23\$n

убедитесь, что правильно получили правильный адрес, отметив результат \ xdd \ xcc \xbb\xaa_%54321x_%[offset]\$x ", это можно сделать с помощью скрипта на python или bash

вы должны получить адрес aabbccdd

0 голосов
/ 22 мая 2014

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

...