Раздел: Документация
0 ... 21 22 23 24 25 26 27 ... 102 78 Глава 2. Вирусы в UNIX, или Гибель "Пит - ----ика Листинг 2.13 (продолжение) .rodata 08С021В8 08С0295Вbyte0005puttCONSTYFFFFFFFFC006FFFFFfff .data 0800295C 08002A08dword0006publDATAYFFFFFFFF0006FFFFFFFF .Ctors 08002AC8 08002AI0dword0007publDATAYFFFFFFFF0CC6FFFFFFFF .dtors 08002AI0 08002A18dwo>"d0008publDATAYFFFFFFFF0006FFFFffff .got 08002A18 08002AB0Gword0009publDATAYFFFFFFFF0006FFFfFFFF .bSS 08C02B38 08013CC8qwo-dС00АpublBSSYFFFFFFFF0006FFFFF-FF .datal 08013CC8 08014CC8qword000ApublDATAYFFFFFFFF0006FFFFFFFF ВНЕДРЕНИЕ МЕЖДУ ФАЙЛОМ И ЗАГОЛОВКОМ Фиксированный размер заголовка a.out-файлов существенно затруднял эво люцию этого в общем-то неплохого формата и в конечном счете привел к его гибели. В последующих форматах это ограничение было преодолено. Так, в el(-файлах длина заголовка хранится в двухбайтовом поле eehize, оккупировавшем 28h и 29h байты, считая от начала файла. Увеличив заголовок заражаемого файла на величину, равную длине своего тела, и сместив оставшуюся часть файла вниз, вирус сможет безболезненно скопировать себя в образовавшееся пространство между концом настоящего заголовка и началом Program Header Table. Ему даже не придется увеличивать длину кодового сегмента, поскольку в большинстве случаев тот начинается с самого первого байта файла. Единственное, что будет вынужден сделать вирус сдвинуть поля pof fset всех сегментов на соответствующую величину вниз. Сегмент, начинающийся с нулевого смещения, никуда перемешать не надо, иначе вирус не будет спроецирован в память. (Смещения сегментов в файле отсчитывают-ся от начала файла, но не от конца заголовка, что нелогично и идеологически неправильно, зато упрощает программирование.) Поле ephoff, задающее смещение Program Head Table, также должно быть скорректировано. Аналогичную операцию следует проделать и со смещениями секций, в противном случае отладка/дизассемблнрование зараженного файла станут невозможными (хотя файл будет нормально запускаться). Существующие вирусы забы вают скорректировать содержимое полей shoffset, чем и выдают себя, однако следует быть готовым к тому, что в следующих поколениях вирусов этот недо статок будет устранен. Впрочем, в любом случае такой способ заражения слишком заметен. В н°Рма) ных программах исполняемый код никогда не попадает в elf-заголовок, наличие там красноречиво свидетельствует о вирусном заражении. 3aip> исследуемый файл в любой hex-редактор (например, HIEW) и проанализЩ, значение поля eehize. Стандартный заголовок, соответствующий гскУпЫ пгТ-сиям elf-файла, на платформе Х86 (кстати, недавно переименованной в форму Intel) имеет длину, равную 34 байтам. Другие значения в <<чсстИХиЛов файлах мне видеть пока не доводилось (хотя я и не утверждаю, что таких ф действительно нет — опыт работы с UNIX у меня небольшой). Только таитесь загрузить зараженный файл в дизассемблер. Это бесполезно. >oJ> 1[ЯС-{ь ство из них (и IDA PRO в том числе) откажутся дизассемблировать заголовка, и исследователь о факте заражения ничего не узнает! СЫВСЗК уд Ниже приведен фрагмент файла, зараженного вирусом UNIX.inheader.6666 (р„с. 2.8). Обратите внимание на поле длины elf-заголовка, обведенное квадра-т„ком. Вирусное тело, начинающиеся с 34h байта, залито серым цветом Сюда же направлена точка входа (в данном случае она равна 8048034b): 00000028: ВС F8 00 00-00 00 00 Z-Ш ffi %Й Й 8 6 00000830 : 0f 00 0Е 00-** ж" SSTB&-S& £Й> eg-@3 00 28 00 *тgf у ( 00000040 00000050 00000060 00000070 рис. 2.8. Фрагмент НЕХ-дампа файла, зараженного вирусом UNIX.inheader.6666, внедряющимся в elf-заголовок. Поля elf -заголовка, модифицированные вирусом, взяты в рамку, а само тело вируса залито цветом Как вариант, вирус может вклиниться между концом elf-заголовка и началом program Header Table. Заражение происходит так же, как и в предыдущем случае, однако длина elf-заголовка остается неизменной. Вирус оказывается в «сумеречной» области памяти, формально принадлежащей одному из сегментов, но де-факто считающейся «ничейной» и потому игнорируемой многими отладчиками и дизассемблерами. Если только вирус не переустановит на себя точку входа, дизассемблер даже не сочтет нужным заругаться по этому поводу. Поэтому какой бы замечательной IDA PRO ни была, а просматривать исследуемые файлы в HIE We все-таки необходимо! С учетом того, что об этом догадываются далеко не все эксперты по безопасности, данный способ заражения рискует стать весьма перспективным. К борьбе с вирусами, внедряющимися в заголовок elf-файлов, будьте готовы! ПЕРЕХВАТ УПРАВЛЕНИЯ ПУТЕМ КОРРЕКЦИИ ТОЧКИ ВХОДА Успешно внедриться в файл — это только полдела. Для поддержки своей жизнедеятельности всякий вирус должен тем или иным способом перехватить на себя нить управления. Классический способ, активно использовавшийся еще во времена MS-DOS, сводится к коррекции точки входа — одного из нолей elf/ соп7а.оиг-заголовков файлов. В elf-заголовке эту роль играет поле eentry, в а.ощ-заголовке — aentry. Оба поля содержат виртуальный адрес (не смещение, отсчитываемое от начала файла) машинной инструкции, на которую долж- но быть При передано управление. внедрении в файл вирус запоминает адрес оригинальной точки входа и пе- устанавливает ее на свое тело. Сделав все, что хотел fP Явление программе-носителю, используя «"5 Димой безупречности этой методики она не лишена изъянов, обеспечивающих ЫстР°е разоблачение вируса. Дов°и секции файла. Внедриться сюда трудно, и вес у внедрения связаны с риском необратимого искажения исполняемого ,i приводящего к его полной неработоспособности. Точка входа, «вылета,, за пределы секции .text, — явный признак вирусного заражения.ая° Во-вторых, анализ всякого подозрительного файла начинается в первуюoi , с окрестностей точки входа (и ею же обычно и заканчивается), поэтому nL симо от способа вторжения в файл вирусный код сразу же бросается в глаза " В-третьих, точка входа — объект пристального внимания легиона дисковых визоров, сканеров, детекторов и всех прочих антивирусов." Использовать точку входа для перехвата управления — слишком нрнмитивн и, но мнению большинства создателей вирусных программ, даже позорно Со временные вирусы осваивают другие методики заражения, и закладываться на анализ точки входа может только наивный (вот так н рождаются байки о неуловимых вирусах...). ПЕРЕХВАТ УПРАВЛЕНИЯ ПУТЕМ ВНЕДРЕНИЯ СВОЕГО КОДА В ОКРЕСТНОСТИ ТОЧКИ ВХОДА Многие вирусы никак не изменяют точку входа, но внедряют но данному адресу команду перехода на свое тело, предварительно сохранив его оригинальное содержимое. Несмотря на кажущуюся элегантность этого алгоритма, он довольно капризен в работе и сложен в реализации. Начнем с того, что для сохранения оригинальной машинной инструкции, расположенной в точке входа, вирус должен определить ее длину, но без встроенного дизассемблера это сделать невозможно. Большинство вирусов ограничивается тем, что сохраняет первые 16 байт (максимально возможная длина машинной команды на платформе Intel), а затем восстанавливает их обратно, так или иначе обходя запрет на модификацию кодового сегмента. Кто-то снабжает кодовый сегмент атрибутом write, делая его доступным для записи (если не трогать атрибуты секций", то кодовый сегмент все равно будет можно модифицировать, но I DA PRO об этом не расскажет, так как с атрибутами сегментов она работать не умеет), кто-то использует функиию mprotect для изменения атрибутов страниц на лету. И тот, и другой способ слиш ком заметны, а инструкция перехода на тело вируса заметна без очереди. Более совершенные вирусы сканируют стартовую процедуру заражаемого в поисках инструкций call или jmp. А найдя таковую — подменяют вызываем адрес на адрес своего тела. Несмотря на кажущуюся неуловимость, обнар} такой способ перехвата управления очень легко. Первое и главное — внрУ(-личие от легально вызываемых функций, никак не использует нереданнь в стеке аргументы. Он не имеет никаких понятий об их числе и наЛНЧ"Н ц,щ шинный анализ количества переданных аргументов немыслим без и"тьИыМ в вирус полноценного дизассемблера, оснащенного мощным интеллект) с;1-апализатором). Вирус, тщательно сохраняет все изменяемые регистры, ясь, что функции могут использовать регистровую передачу аргументов известным ему соглашением. Самое главное — при передаче управле» .,1. гинальной функции вирус должен либо удалить с верхушки стека адрес во- 0 ... 21 22 23 24 25 26 27 ... 102
|