Раздел: Документация
0 ... 18 19 20 21 22 23 24 ... 102 вирусьВ«!ИЕ 67 обстоят иначе. Кратность выравнивания, установленная на величину от 08Ь до 1 Oh байт, с легкостью вмещает в себя вирус средних размеров. в качестве примера приведен фрагмент дпзассемблерного листинга утн-иты PING, зараженной вирусом UNIX.NuxBe.quilt (модификация известного внрУса NuxBee, опубликованного в электронном журнале, выпускаемом грун-,ой"#29А) (листинг 2.7). Даже начинающий исследователь легко обнаружит присутствие вируса в теле программы. Характерная цепочка jmpoB, протянувшаяся через весьсегмеитданных, не может не броситься в глаза. В «честных» программах такого практически никогда не бывает (хитрые конвертные защиты и упаковщики исполняемых файлов, построенные на полиморфных движках, мы оставим в стороне). Листинг 2.7. Фрагмент файла, зараженного вирусом UNIX.NuxBe.quilt, «размазывающим» себя по кодовой секции ,text:C80C0BD9 ,text:C80CCBDB .text:C80008DD хог eax. eax xor eDx. ebx jmp short loc 8000C01 .text:08000C01 .text:C8000C01 .text:08000CTj3 .text:08000C08 .text:08000C0A -text:08C00C0D loc 8000C0; mov mov ini add esp 90h ebx. eax. eo:-- esp. 18h loc 8000D18 CODE XREF: .text:0800BDDTj LINUX - sysjrisync .text:08000D18 .text:08000D18 text:08000D19 text:C8C00D!B oc 8000D18: dec eax jns short loc 80C0U53 jmp short loc 8000D2B CODE XREF: .text:08000COQTj -text:08000D53 text:08000D53 •text.:C8000D54 text:08000D5A text:08000D5C oc 8000D53: inceax mov[ebp+800C466h]. eax movedx. eax jmpsnort loc 8CC0D6C CODE XREF: .text:08000D19Tj Отметим, что фрагменты вируса не обязательно должны следовать линейно. Напротив, вирус (если только его создатель не даун) предпримет все усилия, чтобы замаскировать факт своего существования. Вы должны быть готовы к тому, что jmpbi будут блохой скакать по всему файлу, используя «левые» эпилоги и прологи для слияния с окружающими функциями. Но этот обман легко Разоблачить по перекрестным ссылкам, автоматически генерируемым дизассемблером IDA Pro. На подложные прологи/эпилоги перекрестные ссылки отсутствуют! Кстати говоря, рассмотренный нами алгоритм не совсем корректен. Цепочка ов может встретиться в любом месте программы (например, внутри функции), и тогда зараженный файл перестанет работать. Чтобы этого не произошло. NOP Увы! Какой бы могучей IDA ни была — она все-таки не всесильна, и над ким полученным листингом вам еще предстоит поработать. Впрочем, при котором опыте дезассемблирования многие машинные команды распознаются в hex-дампе с первого взгляда. Пользуясь случаем, отсылаю вас к «Техниц. и философии хакерских атак/дизассемблирование в уме», ставшей уже библц0 графической редкостью, так как ее дальнейших переизданий не планируется а появившаяся в продаже «Техника и философия хакерских атак II — записки мыщъха» представляет собой совсем другую книгу. Однако требуемого количества междустрочных байт удается наскрести далеко не во всех исполняемых файлах, и тогда вирус может прибегнуть к поиску бц. лее или менее регулярной области с последующим ее сжатием. В простейшем случае ищется цепочка, состоящая из одинаковых байт, сжимаемая по алгоритму RLE. При этом вирус должен следить за тем, чтобы не нарваться на мину перемещаемых элементов (впрочем, ни один из известных автору вирусов этого не делал). Получив управление и совершив все, что он хотел совершить, вирус забрасывает на стек распаковщик сжатого кода, отвечающий за приведение файла в исходное состояние. Легко видеть, что таким способом заражаются лишь секции, доступные как для записи, так и для чтения (то есть наиболее соблазнительные секции . rodata и .text уже не подходят, ну разве что вирус отважится изменить их атрибуты, выдавая факт заражения с головой). Наиболее настырные вирусы могут поражать и секции неинициализированных данных. Нет, это не ошибка, такие вирусы действительно есть. Их появление объясняется тем обстоятельством, что полноценный вирус в «дырах», оставшихся от выравнивания, разместить все-таки трудно, но вот вирусный загрузчик туда влезает вполне. Секции неинициализированных данных, строго говоря, не только не обязаны загружаться с диска в память (хотя некоторые UNIXbi их все-таки загружают), но могут вообще отсутствовать в файле, динамически создаваясь системным загрузчиком налету. Однако вирус и не собирается искать их в памяти! Вместо этого он вручную считывает их непосредственно с самого зараженного файла. Правда, в некоторых случаях доступ к текущему выполняемому файлу предусмотрительно блокируется операционной системой, но этот запрет достаточно легко обойти, и тот же чувак ZOmbie не раз писал, как. Па первый взгляд, помещение вирусом своего тела в секции неинициализированных данных ничего не меняет (если даже не демаскирует вирус), но при попытке ноимки такого вируса за хвост он выскользнет из рук. Секция неиниш1 ализированных данных визуально ничем не отличается от всех остальных секций файла, и содержать она может все что угодно: от длинной серии нуле1 до копирайтов разработчика. В частности, создатели дистрибутива FreeBSD 4•> именно так и поступают (листинг 2.9). Листинг 2.9. Так выглядит секция .bss большинства файлов из комплекта поставки Free BSD СС00Е530:00 СО СО 00 FF FF FF FF00 00 00 00 FF FF FF FF СС00Е540:00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 0000Г550:00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 О0С0Е560:00 47 43 43 ЗА 20 28 474Е 55 29 20 63 20 32 2Е GCC: (GNU) с 2. 39 35 2Е 33 20 32 30 30 j 31 30 33 31 35 20 28 72 95.3 20010315 (г 0О0ОЕ570:73 g5 29 20 , 5В 46 72 65 65 42 53 4Л elease) [FreeBSD ООООЕ580: 65 6С - ,Е 55 29 20 63 20 32 2Е 39 35 2Е 33 20 32 30 30 MU) С 2.95.3 200 0000F2B0: 2g , уз (release) OOO0F2C - 72 ffi 65 42 53 4Л , 5[) 0[) С8 0[) 0[) 00 0[) 0[) [freeBSD] • oo00SV ПО 00 01 00 00 00 30 з: 2Е 30 31 00 00 00 08 00 © 01.С1 • OO00F2t>J- ии шзассемблеров (и IDA Pro в том числе) по вполне логичным соображени-Яне загружает содержимое секций неинициализированных данных, явно отмечая это обстоятельство двойным знаком вопроса (листинг 2.10). Приходится исследовать файл непосредственно в HIEWe или любом другом hex-редакто-с разбирая a.out/elf-формат «вручную», так как популярные hex-редакторы его не поддерживают. Скажите честно: готовы ли вы этим реально заниматься? Так что, как ни крути, а вирусы этого типа имеют все шансы на выживание, пусть массовых эпидемий им никогда не видать. Листинг 2.10. Так выглядит секция .bss в дизассемблере IDA Pro и большинстве других дизассемблеров bss 08057560 7777 77 77 7??7????-?? ?? ?? ?? ?? ?? ????"????????????????" bss08057570 7777 77 77 77779779-?? ?? ?? ?? ?? ?? 7???"77??????????????" bss 08057580 ??77 ?7 7? ?7??????-?? ?? ?? ?? ?? ?? ????"????????????????" DSS08057590 ?777 77 77 777777?7-7? 77 77 ?? ?? ?? 77?7"???>??????????" .bSS:080575A0 ???? ?7 ?? ????????-?? ?? ?? ?? ?? ?? ????"????????????????" .bsS:080575BO ???? ?? ?? ????????-?? ?? ?? ?? ?? ?? ????"?7??????????????" .bss:080575СС ???? 77 ?7 9777777?-?? 77 77 ?? ?? ???9"????????????????" .bss:080575DG ???? ?7 7? 777797??-°? ?? ?? ?? ?? ?? ?"> .bss:080575FO ???? ?? 7? ?779">??9-?? ?? 9? ?? ?? ?? Т79т?????????????" ЗАРАЖЕНИЕ ПОСРЕДСТВОМ РАСШИРЕНИЯ КОДОВОЙ СЕКЦИИ ФАЙЛА Наибольшую скрытность вирусу обеспечивает внедрение в кодовую секцию заражаемого файла, находящуюся глубоко в середине последнего. Тело вируса, с-тиваясь с исходным машинным кодом, виртуально становится совершенно неотличимым от «нормальной» программы, и обнаружить такую заразу можно •"ишь анализом ее алгоритма (см. далее раздел «Основные признаки вирусов»). Безболезненное расширение кодовой секции возможно лишь в elf- и coff-фай-Лах (Под «безболезненностью» здесь понимается отсутствие необходимости в перекомпиляции файла-жертвы), и достигается оно за счет того замечательного ныСТОЯТСЛЬСТВа ЧТ° стаРтовые виртуальные адреса сегментов/секций отделе-от их физических смещений, отсчитываемых от начала файла. фай1™ заРажения е-файла в общем виде выглядит так (внедрение в coff- лы осУществляется аналогичным образом): Вирус открывает файл и, считав его заголовок, убеждается, что это действи- тельио elf-файл. 0 ... 18 19 20 21 22 23 24 ... 102
|