[Перевод] Что каждый программист должен знать о переполнении стекового буфера
Прикладное руководство, помогающее с азов понять, как организованы атаки с переполнением стекового буфера под Windows. Ведь по Unix‑подобным системам таких разборов уже...
Прикладное руководство, помогающее с азов понять, как организованы атаки с переполнением стекового буфера под Windows. Ведь по Unix‑подобным системам таких разборов уже хватает.
Все знают, что ничем не ограниченный код scanf — это плохо. Но почему?
Это вполне ясно и оправданно: действительно, так делать нельзя. Если размер буфера не указать, то scanf запишет данные и за его пределами, если ввод не умещается в буфер. Из‑за такой ошибки, именуемой «переполнением буфера» (buffer overflow), агрессивный злоумышленник может наделать самых гнусных дел.
Но каких именно? Что случится, если кто‑то точно не вы заронит что‑то подобное в базу кода?
Согласно сайту cppreference.com, спецификатор формата %s в scanf подбирает последовательность символов, не содержащих пробелов и сохраняет их в буфере, предоставленном пользователем, добавляя нулевой символ (‘\0’). Так формируется строка, завершённая нулём.
Таким образом, если кто‑то введёт строку в формате «ABCDEFG» при length=7 — всё нормально. Вот как она расположится в памяти:
Если в подаваемую на вход строку вставить дополнительный символ, например, ‘H’, то scanf спровоцирует переполнение буфера. Если не учитывать размер буфера (buff), то scanf легко запишет данные сверх выделенного объёма. Поэтому она затрёт нулём первый байт ‘0x5b’ смежной структуры данных, следующей далее:
Переполнение буфера — серьёзная проблема, поскольку при этом затирается прилегающая память. Поскольку память непрерывна, могут быть повреждены чувствительные данные, сохранённые вплотную к буферу — например, пароли или финансовая информация. Это само по себе опасно, но злоумышленник может и далее эксплуатировать допущенное переполнение, например, для выполнения произвольного кода.
Прежде, чем продолжать тему, давайте кратко рассмотрим, как именно объекты занимают области памяти.
Память можно представить как огромный массив байт и для удобства изобразить в виде прямоугольника. На отдельные байты можно ссылаться по их адресу, обеспечивая таким образом доступ для чтения/записи:
«Я не тяну на сеньора»: когда своим сомнениям стоит верить
Когда разработчик говорит: «Похоже, меня рано повысили», мне хочется спросить: «А что теперь от тебя ждут?» Допустим, раньше он сам доводил задачу до релиза, а теперь ещё разбирает чужой код…
Как я на 4-й день пентеста чуть не принял 500-ку за RCE
Здравствуйте, дорогие читатели! Это моя первая и надеюсь, что не последняя, публикация на Habr. Буду очень рад возможной конструктивной критике и обратной связи. Эта статья стала итогом моег…
Дыра в iOS позволила приложениям подглядывать за чужими файлами — под угрозой ключи криптокошельков
В операционной системе Apple iOS обнаружена уязвимость, позволяющая вредоносным приложениям читать файлы других программ. Из-за этого под угрозой могут оказаться ключи криптовалютных кошельк…
Binance призвала срочно обновить iPhone: уязвимость iOS позволяет красть пароли от криптокошельков
Вредоносные приложения могут считывать файлы других программ, получая доступ к seed-фразам, закрытым ключам и учётным данным Криптобиржа Binance призвала владельцев iPhone срочно обновить iO…