Как падают программы
19 сентября 2019
Недавно мы писали о zip-бомбах. Они достаточно разнообразны (и даже не всегда используют формат zip). Один из видов бомб – это архив с огромным количеством вложений таких же архивов внутри. При распаковке должна получиться папка с огромным числом уровней вложенности подпапок. И в этом случае исчерпывается не место на жестком диске – программа «падает» при распаковке. Давайте рассмотрим немного теории, чтобы понять, как это происходит.
Любая программа – это не просто некий код. Программа работает динамически. Например, создает временные переменные. Естественно, эти переменные должны где-то размещаться.
- Стек (stack) – это область памяти, в которой программа хранит информацию о вызываемых функциях, их аргументах и каждой локальной переменной в функциях. Размер области может меняться по мере работы программы. При вызове функций стек увеличивается, а при завершении – уменьшается.
- Куча (heap) – это область памяти, в которой программа может делать всё, что заблагорассудится. Размер области может меняться. Программист имеет возможность воспользоваться частью памяти кучи с помощью функции malloc(), и тогда эта область памяти увеличивается. Возврат ресурсов осуществляется с помощью free(), после чего куча уменьшается. Кодовый сегмент (code) – это область памяти, в которой хранятся машинные инструкции скомпилированной программы. Они генерируются компилятором, но могут быть написаны и вручную. Обратите внимание, что эта область памяти также может быть разделена на три части (текст, данные и BSS). Эта область памяти имеет фиксированный размер, определяемый компилятором. В нашем примере пусть это будет 1 Кб.
Кодовый сегмент (code) – это область памяти, в которой хранятся машинные инструкции скомпилированной программы. Они генерируются компилятором, но могут быть написаны и вручную. Обратите внимание, что эта область памяти также может быть разделена на три части (текст, данные и BSS). Эта область памяти имеет фиксированный размер, определяемый компилятором. В нашем примере пусть это будет 1 Кб.
Картинка очень сильно упрощена, в реальной жизни сегментов больше (подробнее об этом можно почитать, например, тут), но для простоты понимания мы используем ее.
То есть когда вы или система запускаете некую программу, то под нее создается место в памяти, где размещается код, а также выделяются области памяти. В том числе стек и куча. Первоначально в этих областях ничего нет, но постепенно программа начинает заполнять их данными. Нас пока интересует только стек.
Как происходит распаковка архива с вложенными архивами?
Архиватор, найдя файл архива и проведя все необходимые проверки, запускает определенную процедуру (в данном случае распаковку). Если в ходе распаковки найден еще архив (вложенный в распаковываемый), то распаковка текущего уровня приостанавливается, окружение сохраняется, и вызывается та же самая процедура, которая уже работала.
В стеке элементов элементы располагаются один поверх другого в том порядке, в котором они были там размещены, и вы можете удалить только верхнюю часть (без опрокидывания всей вещи).
(Да, вы можете утверждать, что у вас на столе не завалы бумаги, а стек ☺)
Когда вложенная распаковка завершит работу, то при возврате из процедуры окружение восстановится автоматически и продолжится прерванная распаковка. Но если встретится еще уровень и еще... Всё время в вызове процедуры распаковки сохраняется текущее окружение. И сохраняется это окружение в стек. И область, указанная на картинке как Free, – сжимается. И в конечном итоге данные «наедут» на границу сегмента стека.
И далее возможны два варианта. Или данные продолжат записываться в соседний сегмент, перекрывая находящиеся в нем данные, или (чаще всего) ситуация будет отслежена, и будет выдана ошибка. Возникает так называемое исключение, и если программа отслеживает исключения, то распаковка аварийно завершается – вирус внутри остается ненайденным.
Это, конечно, обычные программы. Но опасность в том, что подобная бомба может отлично скрыть вредоносную программу. Стандартный архиватор просто не сможет распаковать файл до нее. Антивирус обязан распаковывать до упора.
#бомбаАнтивирусная правДА! рекомендует
Надеемся, вам стало немного понятнее, почему бомбы действительно опасны и за что их так любят злоумышленники.
Нам важно ваше мнение
Чтобы оставить комментарий, нужно зайти через свой аккаунт на сайте «Доктор Веб». Если аккаунта еще нет, его можно создать.
Комментарии пользователей
Filip_s
10:10:00 2021-01-06
Dmur
16:12:53 2019-09-29
Toma
21:07:21 2019-09-25
EvgenyZ
19:47:36 2019-09-25
tigra
18:30:23 2019-09-20
Lia00
16:34:48 2019-09-20
Неуёмный Обыватель
08:49:36 2019-09-20
Схема интересная
Sasha50
07:17:06 2019-09-20
achemolganskiy
04:31:52 2019-09-20
Korney
23:16:30 2019-09-19
Masha
22:50:16 2019-09-19
Любитель пляжного футбола
22:45:10 2019-09-19
Вот только теорию и после двух стаканов не понял. :) В следующий раз надо будет налить что-то покрепче минералки. :)))
Татьяна
22:41:42 2019-09-19
Пaвeл
21:55:28 2019-09-19
vinnetou
21:32:40 2019-09-19
I46
21:16:22 2019-09-19
anatol
21:11:53 2019-09-19
Lenba
21:00:43 2019-09-19
Zserg
20:57:33 2019-09-19
robot
20:34:36 2019-09-19
I23
19:59:04 2019-09-19
ka_s
19:54:08 2019-09-19
kozinka.ru
17:42:40 2019-09-19
Roman
16:55:22 2019-09-19
orw_mikle
15:27:41 2019-09-19
Денисенко Павел Андреевич
15:07:03 2019-09-19
Lex
15:03:13 2019-09-19
marisha-san
15:02:25 2019-09-19
ЕК
14:29:58 2019-09-19
AlexDS
14:16:43 2019-09-19
Спасибо что Вы это способны выявить.
Ведь зазипованными пакетами документов и программ часто приходится пользоваться, но всегда обращал внимание на содержимое такого файла. Подобные, описанным, пакеты - всегда вызывали подозрения и старался интуитивно ими не пользоваться.
Alexander
13:05:06 2019-09-19
Приятно осознавать, что у Dr.Web Security Space имеется хитрый способ всё же найти упакованную "вошь", и поступить с ней как должно.
Спасибо за популярное изложение варианта возможного "падения" программы.
DoctorW
13:03:11 2019-09-19
Tanya086
13:00:22 2019-09-19
Саня
12:58:29 2019-09-19
razgen
12:24:04 2019-09-19
Vlad X
11:38:03 2019-09-19
лес,но для общего развития прочитал.
vkor
11:33:26 2019-09-19
Oleg
11:16:07 2019-09-19