Вы используете устаревший браузер!

Страница может отображаться некорректно.

СпецНаз (специальные названия)

СпецНаз (специальные названия)

Другие выпуски этой рубрики (56)
  • добавить в избранное
    Добавить в закладки

Как падают программы

Прочитали: 4779 Комментариев: 38 Рейтинг: 61

19 сентября 2019

Недавно мы писали о zip-бомбах. Они достаточно разнообразны (и даже не всегда используют формат zip). Один из видов бомб – это архив с огромным количеством вложений таких же архивов внутри. При распаковке должна получиться папка с огромным числом уровней вложенности подпапок. И в этом случае исчерпывается не место на жестком диске – программа «падает» при распаковке. Давайте рассмотрим немного теории, чтобы понять, как это происходит.

Любая программа – это не просто некий код. Программа работает динамически. Например, создает временные переменные. Естественно, эти переменные должны где-то размещаться.

#drweb

  • Стек (stack) – это область памяти, в которой программа хранит информацию о вызываемых функциях, их аргументах и каждой локальной переменной в функциях. Размер области может меняться по мере работы программы. При вызове функций стек увеличивается, а при завершении – уменьшается.
  • Куча (heap) – это область памяти, в которой программа может делать всё, что заблагорассудится. Размер области может меняться. Программист имеет возможность воспользоваться частью памяти кучи с помощью функции malloc(), и тогда эта область памяти увеличивается. Возврат ресурсов осуществляется с помощью free(), после чего куча уменьшается. Кодовый сегмент (code) – это область памяти, в которой хранятся машинные инструкции скомпилированной программы. Они генерируются компилятором, но могут быть написаны и вручную. Обратите внимание, что эта область памяти также может быть разделена на три части (текст, данные и BSS). Эта область памяти имеет фиксированный размер, определяемый компилятором. В нашем примере пусть это будет 1 Кб.

Кодовый сегмент (code) – это область памяти, в которой хранятся машинные инструкции скомпилированной программы. Они генерируются компилятором, но могут быть написаны и вручную. Обратите внимание, что эта область памяти также может быть разделена на три части (текст, данные и BSS). Эта область памяти имеет фиксированный размер, определяемый компилятором. В нашем примере пусть это будет 1 Кб.

Источник

Картинка очень сильно упрощена, в реальной жизни сегментов больше (подробнее об этом можно почитать, например, тут), но для простоты понимания мы используем ее.

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

Как происходит распаковка архива с вложенными архивами?

Архиватор, найдя файл архива и проведя все необходимые проверки, запускает определенную процедуру (в данном случае распаковку). Если в ходе распаковки найден еще архив (вложенный в распаковываемый), то распаковка текущего уровня приостанавливается, окружение сохраняется, и вызывается та же самая процедура, которая уже работала.

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

#drweb

Источник

(Да, вы можете утверждать, что у вас на столе не завалы бумаги, а стек ☺)

Когда вложенная распаковка завершит работу, то при возврате из процедуры окружение восстановится автоматически и продолжится прерванная распаковка. Но если встретится еще уровень и еще... Всё время в вызове процедуры распаковки сохраняется текущее окружение. И сохраняется это окружение в стек. И область, указанная на картинке как Free, – сжимается. И в конечном итоге данные «наедут» на границу сегмента стека.

И далее возможны два варианта. Или данные продолжат записываться в соседний сегмент, перекрывая находящиеся в нем данные, или (чаще всего) ситуация будет отслежена, и будет выдана ошибка. Возникает так называемое исключение, и если программа отслеживает исключения, то распаковка аварийно завершается – вирус внутри остается ненайденным.

Это, конечно, обычные программы. Но опасность в том, что подобная бомба может отлично скрыть вредоносную программу. Стандартный архиватор просто не сможет распаковать файл до нее. Антивирус обязан распаковывать до упора.

#бомба

Антивирусная правДА! рекомендует

Надеемся, вам стало немного понятнее, почему бомбы действительно опасны и за что их так любят злоумышленники.

Оцените выпуск

Сделайте репост

Необходимо войти на страницу выпуска через аккаунт на сайте «Доктор Веб» (или создать аккаунт). Аккаунт должен быть связан с вашим аккаунтом в социальной сети. Видео о связывании аккаунта.


Нам важно ваше мнение

Чтобы оставить комментарий, нужно зайти через свой аккаунт на сайте «Доктор Веб». Если аккаунта еще нет, его можно создать.

Комментарии пользователей