Автор: | Bokiv [AHTeam] |
Уровень: | Для опытных |
Программа: | Cетевой червь Win32.Mytob.D |
Инструменты: | OllyDbg 1.10, PE Tools 1.5, ImpREC 1.6, PEiD v0.93, Yoda Crypter 1.3 |
[Программы и файлы, используемые в статье]
Сам червь: mytob.rar (46.5 Кб) - осторожнее! Пароль на архив: 000 В целях безопасности у файла удалено расширение ".exe"
OllyDbg 1.10 PE Tools 1.5 Import REConstructor 1.6 final PEiD v0.93 Yoda Crypter 1.3
[Вступление]
Нынче мода пошла такая: написал чувак вируса или червяка на HLL, и давай его паковать и защищать чем-нибудь навесным. Вирусмейкер надеятся тем самым для аверов анализ вредоносного кода затруднить, да и жизнь простым смертным реверсерам подпортить, чтобы не поняли они, что плод злого гения делает, куда пишется и т.п. Нас такими дешевыми уловками не проведешь, мы протекторы в раз снимем!
[паразит]
Взять, к примеру, довольно популярного зверя Mytob.D. Попадет к тебе такой, и что ты будешь делать? На аверов молиться? Это не наши методы, Шура! Его надо своими средствами вскрыть, исследовать и нафиг из системы удалить. Однако пассивным дизассемблированием тут не обойдешься. Ida Pro тебе не выплюнет ничего членораздельного в ответ на скормленного ей червяка. В данном случае такая шняга произойдет потому, что вирус долго и усердно паковали и защищали. Благо, мы знаем, как в таких случаях поступать: грузим PEiD. Порывшись в своей базе сигнатур замечательная тулза выдаст нам верхний слой защиты - yoda's Protector 1.3 -> Ashkbiz Danehkar. Этот протектор, по правде говоря, просто обожают разработчики разного рода нечести. Вот, посмотри, что о нем пишут:
- поддержка большинства форматов PE-файлов; - маленький размер дистрибутива; - быстрота работы; - полиморфное шифрование; - проверка CRC-суммы; - переадресация API-функций; - удаление заголовков PE; - антиотладчик;
И со всем этим предстоит разобраться. Но это еще не все. Если внимательно посмотреть на название секций (UPX0, UPX1, UPX2, yC), можно сделать один не самый утешительный вывод. Под йодой живет UPX. Ок, нет проблем, и его порвем. Вспоминаем основы снятие защит и принимаемся за работу.
1. Нахождение оригинальной точки входа (OEP). 2. Снятие дампа программы. 3. Восстановление таблицы импорта.
[нахождение оригинальной точки входа]
Первое, что нам необходимо - это найти ЕР упакованного червя, а затем уже ОЕР самого червя. Надеюсь, у тебя уже стоит замечательный ОllyDbg. Запускаем и открываем в нем червя. Стоп! Чуть не забыл. Советую проводить все опыты на виртуальной машине, так как активный анализ (то есть с запуском) вирусного кода - штука достаточно опасная. Итак, отладчик попросит проанализировать файл - нажимаем "нет". Курсор отладчика стоит здесь на EP:
0041B060 PUSH EBP 0041B061 MOV EBP, ESP 0041B063 PUSH EBX 0041B064 PUSH ESI 0041B065 PUSH EDI 0041B066 PUSHAD Почти все распаковщики перед своей работой сохраняют все значения регистров в стеке командой PUSHAD, а после работы восстанавливают их командой POPAD. То есть нужно найти ниже команду POPAD и поставить на ней брейкпоинт. Если мы начнем трассировку программы или просто запустимся по F9, то сработает исключение, в результате которого отладчик или выдаст ошибку, или просто закроется. Причина кроется в распаковщике: он получает информацию о том, что программа отлаживается в данный момент. Ключом является функция Windows под названием IsDebuggerPresent, благодаря чему нас и обнаруживает распаковщик. Данная функция возвращает единицу, если отладчик обнаружен, и ноль — если нет. Вбиваем в командной строке Оли bp IsDebuggerPresent и нажимаем Enter. Если у тебя командная строка не активирована - нажимай Alt+F1. Остается запустить программу и надеяться на то, что бряк заработает. Как ни странно, он сработал, и мы оказываемся здесь.
7C812E03 MOV EAX,DWORD PTR FS:[18] 7C812E09 MOV EAX,DWORD PTR DS:[EAX+30] 7C812E0C MOVZX EAX,BYTE PTR DS:[EAX+2] 7C812E10 RETN Пройдем до RETN по F8. Вот посмотри: значение регистра EAX равно единице - это результат работы функции IsDebuggerPresent, то есть отладчик обнаружен. Кликни по регистру EAX в отладчике и введи вместо единицы ноль. Дальше можешь выходить из функции по F8. Вышел? Смотрим дальше - видим код:
0041B88C JE SHORT Mytob.0041B890 0041B88E POPAD 0041B88F RETN Интересное место. Если отладчик обнаружен, то переходим на команду POPAD, где искусственно создается исключение, так как POPAD отработал раньше времени! Но мы обманули протектор и поэтому спокойно перепрыгиваем ловушку. Теперь давай искать дальше POPAD’ы. Сразу скажу это примерно на 40 строк вниз.
0041B8F9 POPAD <- ставим брейкпоинт 0041B8FA JMP SHORT Mytob.0041B8FE 0041B8FC INT 1 0041B8FE RETN Посмотрим еще ниже и опять:
0041B975 POPAD <- ставим брейкпоинт 0041B976 PUSH EAX 0041B977 XOR EAX, EAX 0041B979 PUSH DWORD PTR FS:[EAX] 0041B97C MOV DWORD PTR FS:[EAX],ESP 0041B97F JMP SHORT Mytob.0041B982 Как видишь, я установил брейкпоинты на два найденных мной вызова POPAD. Делай то же самое и запускай программу. Оля остановилась на 0041B975, а дальше (0041B982) идут команды, которых не было, когда мы смотрели код после остановки на IsDebuggerPresent (полиморфный код для сокрытия ЕР upx)! Команда POPAD отработала, а значит, где-то рядом должен быть нужный нам переход. Пройдемся по F8 и посмотрим, что же будет дальше. По адресу 0041B982 происходит исключительная ситуация, проходим ее по Shift+F8 и попадаем в системную библиотеку ntdll:
7C90EAF0 MOV EBX,DWORD PTR SS:[ESP] 7C90EAF3 PUSH ECX 7C90EAF4 PUSH EBX 7C90EAF5 CALL ntdll.7C9377C1 7C90EAFA OR AL,AL 7C90EAFC JE SHORT ntdll.7C90EB0A 7C90EAFE POP EBX 7C90EAFF POP ECX 7C90EB00 PUSH 0 7C90EB02 PUSH ECX 7C90EB03 CALL ntdll.ZwContinue Скажу сразу: если пройти CALL (7C90EB03) по F8, то программа запустится, значит, мы дойдем до адреса 7C90EB02 (F8) и посмотрим содержимое стека. Если не знаешь что это такое, то тебе рановато еще читать эту статью. Будем искать адрес, который меньше, чем EP протектора (0041B060). Просмотрим правое нижнее окно Оли (стек):
0012FD7C 7C910738 ntdll.7C910738 0012FD80 FFFFFFFF 0012FD84 20008332 0012FD88 7C90EB94 ntdll.KiFastSystemCallRet 0012FD8C 0012FFB0 0012FD90 00000000 0012FD94 0012FFC0 0012FD98 00419910 Mytob.00419910 <- этот адрес нам подходит! 0012FD9C 0000001B 0012FDA0 00010246 UNICODE "_HOST_CHECK=NO" Итак, сравним:
00419910 - найденный нами адрес.
0041B060 - EP протектора.
Ух, я уже на ЕР UPX! Ты еще нет? Тогда быстрей ставь брейкпоинт на 00419910 (bp 00419910), дави Enter, потом F9 — и ты со мной. Если ты видишь кучу нулей, то нажми Ctrl+A — Оля проанализирует код. Тут уже совсем все просто: надо всего лишь распаковать UPX.
00419910 PUSHAD <- стоим здесь 00419911 MOV ESI,Mytob.0040F000 00419916 LEA EDI,DWORD PTR DS:[ESI+FFFF2000] 0041991C PUSH EDI 0041991D OR EBP,FFFFFFFF 00419920 JMP SHORT Mytob.00419932 Опять знакомая команда PUSHAD! Теперь крутим мышкой вниз, пока не увидим:
00419A67 POPAD 00419A68 JMP Mytob.0040A0EB <- это OEP "червя" 00419A6D ADD BYTE PTR DS:[EAX],AL <-а куча этих строк не даст ошибиться! 00419A6F ADD BYTE PTR DS:[EAX],AL Ставим брейкпоинт на POPAD 00419A67, нажимаем F9 и два раза F7. Все мы находимся на OEP
"червя". Запишите это значение (у меня это 0040A0EB).
[дамп]
Для дампа воспользуемся программой PE Tools. Перед тем как снять дамп, давай проведем некоторую настройку самой программы. Заходи в Options программы и смотри. Внутри панели Task Viewer должен стоять флажок только напротив Full dump: fix Header. После того как ты это сделаешь (а я это уже сделал) мы с тобой продолжим. Выбираем из списка процессов червя -->, в контекстном меню жмем Dump Full. Думаю, с вводом имени файла проблемы возникнут только у безруких инвалидов :). Сперва необходимо провести небольшую оптимизацию данных. Как ты знаешь, наш протектор переименовал имена всех секций, однако тут все понятно: первые две секции – это секции кода протектора и распаковщика UPX, остальное – нормальная программа, просто переименованная. Нажимаем меню Tools->PE Editor и указываем червя. Теперь обрежем лишние секции протектора и упаковщика, про которые я только что сказал. Видишь кнопку Sections? Нажимай и обрезай две нижние секции с именами UPX2, yC кнопкой в меню Kill section (from file). Ну вот, теперь мы снова вместе. После восстановления импорта, описанного ниже, можно сделать rebuild (кнопка rebuild pe), при этом оптимизируется PE-заголовок файла, что может уменьшить его размер на несколько килобайт, к тому же происходит оптимизация внутренней структуры и расположения данных в файле. Также можно воспользоваться rebuild для восстановления файла после распаковки протекторов и упаковщиков.
[восстановление импорта]
Импорт мы будем восстанавливать с помощью одной замечательной программы - Import Recontructor. После запуска найди в списках процессов нашего червя (если ты уже все закрыл, то придется запускать файл С:\WINDOWS\system32\wfdmgr.exe).
Теперь нам необходимо указать RVA OEP (в ImpRec он просто OEP). Формула тут проста, как int 21h - "RVA OEP = VA OEP - ImageBase". Это надо знать наизусть! Image Base находится все в том же PETools, в главном окне. В нашем случае RVA = 01006420 – 01000000 = 6420. Вводим это значение в поле OEP и нажимаем кнопку IAT AutoSearch (то есть автопоиск). Программа найдет ссылки на функции таблицы импорта, затем мы получим саму таблицу, нажав на кнопку «Get Imports» (Получить импорты). Мы должны увидеть строки с функциями и надписью YES напротив. Если все так, а так и должно быть, то кнопка Fix Dump направляет нас на путь истинный. Указывай наш дамп в появившемся окне — и вуаля. Все готово!
[уроки анатомии]
Что теперь? Теперь приступаем к исследованию. Перед нами, как ты видишь, голый вирус. Если не веришь, то запусти PEiD. Надо отметить, что до этого мы занимались крэкингом, то есть распаковывали файл, снимали защиту. Сейчас же перейдем к реверс-иженерингу. Реверс – далеко не крэкинг. Это более фундаментальное понятие, которое заключается в (да простят меня боги за тавтологию) понимании работы программы, исходя из дизассемблерного листинга. Углубляться в это дело мы сейчас не будем, так как нас интересуют только некоторое моменты: как существует вирус, что он делает и где живет в системе. Конечно, есть множество антиотладочных ухищрений, но в этом случае все не так просто. Прежде всего в таблице импорта содержатся функции работы с сетью. Сперва идут функции работы с файлами — вот их-то мы и рассмотрим для начала. Давай поставим бряки на CreateFile и CopyFile. Запускаем! Видим перед собой очень хорошую строку:
00407BA4 FF15 24114100 CALL DWORD PTR DS:[<&kernel32.CopyFileA>>; kernel32.CopyFileA Если посмотрим в стек, то можем увидеть новое имя файла: NewFileName = "C:\WINDOWS\system32\wfdmgr.exe". Теперь понятно: вирус проверяет, где он находится, и если он не в системной директории, то копирует себя в нее. Далее следует запуск вышеуказанного файла и завершение исходного процесса. Для дальнейшего продолжения исследования следует обмануть вирус. Можно скопировать его, куда он просит, а можно просто-напросто обойти функцию проверки — это как тебе будет угодно. Я лично скопировал. Так, едем дальше - DeleteFile. Что же он удаляет? Нашел или подсказать? Первой же функцией он удаляет C:\WINDOWS\system32\msnmsgr.exe, затем копирует себя в эту папку и открывает сокетное соединение. Кроме этого, червяк гадит в реестре. О, вижу ты уже совсем вошел в раж и поставил бряки на RegOpenKey. Замечательно, так ему, гаду, и надо!
00403F90 51 PUSH ECX 00403F91 68 19000200 PUSH 20019 00403F96 6A 00 PUSH 0 00403F98 52 PUSH EDX 00403F99 68 01000080 PUSH 80000001 00403F9E FF15 08104100 CALL DWORD PTR DS:[<&advapi32.RegOpenKey>; advapi32.RegOpenKeyExA Угу, функция есть, смотрим стек:
00E7FE44 80000001 |hKey = HKEY_CURRENT_USER 00E7FE48 00E7FE60 |Subkey = "Software\Microsoft\WAB\WAB4\Wab File Name" 00E7FE4C 00000000 |Reserved = 0 00E7FE50 00020019 |Access = KEY_READ 00E7FE54 00E7FE58 \pHandle = 00E7FE58 Следует ли объяснять, что происходит в этот момент? Червь ищет WAB-файлы. Это же файлы адресных книг аутглюка! Да-да, червь грабит все мыльники и рассылает себя по ним. Дальше уже просто: все делаем аналогично, так что писать тут про остальные функции я не буду. Однако мы пропустили работу червя с сетью… Извини, но в эту статью уже не поместится полный анализ. Думаю, дома ты с легкостью теперь сможешь и сам это проанализировать. Каркас действий мы с тобой разработали. Итак, мы сделали простейший анализ за 15 минут, не правда ли здорово? Еще 15-20 минут таким темпом — и вирус у нас полностью обезврежен. Может быть, пора сделать свою антивирусную лабораторию?
[вместо заключения]
Да, теперь мода пошла писать всякую зараазу. Но нашаа сс тобой задача - опережать это движение, пускай лишь на один шаг, но все же, быть впереди. Внедряйся!
Net_Worm.Win32.Mytob.D – вот как пишут антивирусные лаборатории.
Сетевой вирус-червь, заражающий компьютеры под управлением Windows.
Вирус распространяется, используя уязвимость в сервисе Windows LSASS (MS04-011).
Также он распространяется через Интернет в виде вложений в зараженные электронные письма и рассылается по всем найденным адресам электронной почты. Вместо файла %System%\msnmsgr.exe червь создает %System%\wfdmgr.exe. Он регистрирует данный файл в ключах автозапуска системного реестра:
[HKCU\Software\Microsoft\Windows\CurrentVersion\Run] [HKLM\Software\Microsoft\Windows\CurrentVersion\Run] [HKLM\Software\Microsoft\Windows\CurrentVersion\RunServices] [HKCU\SYSTEM\CurrentControlSet\Control\Lsa] [HKCU\Software\Microsoft\OLE]
"LSA"="wfdmgr.exe"
WARNING!
Если ты распаковывал "червя", то не забудь уничтожить процесс wfdmgr.exe и удалить файл C:\WINDOWS\system32\wfdmgr.exe.
21.04.2006 by Bokiv [AHTeam]
|
|