Как стать автором
Обновить

Ошибка резидента

Время на прочтение4 мин
Количество просмотров899
Недавно мне пришло письмо примерно следующего содержания:
Уважаемый Х. Ваша кандидатура очень нас заинтересовала, поэтому мы бы не прочь познакомиться поближе. Предварительно вам нужно скачать наш фирменный бланк резюме resume.exe, заполнить его, и отослать нам обратно. С уважением, сетевые злодеи.

Что характерно, линк на резюме был именно так и написан. resume.exe (не кликайте, ссылка для примера). Они вообще, что ли?

Скачиваем, смотрим. Файл размером 159744 байтов, на первый взгляд запакован. Касперскому программа знакома под именем "Trojan.Win32.Srizbi.v".

Ида страшно матерится на поврежденную таблицу импорта. Оно и понятно — в ней совсем хорошо видно, что файл запакован.

6,09 КБ

Код (синий участок) занимает процентов пять от размера программы, зато данных — навалом. Эти данные и есть, скорее всего, упакованный код. Особенно пугают названия сегментов: "_67D&NEk&" или "_uoeWPJ3" вместо чего-то привычного типа ".code". Точка входа не где-то в начале файла, а в какой-то заднице.

Пробуем пару распознавалок упаковщиков, типа PEID — безрезультатно, этот упаковщик им не знаком. Поэтому сразу переходим к активным действиям. Мы не будем анализировать, как программа упакована. Раз она умеет распаковываться, дадим сделать ей это самой. (Этот случай оказался довольно простым, в других запуск программы может привести к Ужасным Вещам).

Загружаем файл в дебагер, ставим точку останова на CreateFile. Логично ведь — любая вредоносная программа должна ее использовать? (На самом деле, тут мы можем совершить несколько больших промахов. Например, если программа использовала бы «родную» функцию ZwCreateFile, которая находится уровнем ниже CreateFile).

… и запускаем на выполнение. Тут нас ожидает сюрприз номер 1. Проходит секунд 15-20 (!), прежде чем выполнение останавливается на входе в CreateFile. Видать, программа упакована и переупакована вдоль и поперек и не один раз. Постарались от души, что и сказать.

Остановившись на входе в CreateFile, смотрим название открываемого файла:
kernel32!CreateFileA:
7c801a24 8bff            mov     edi,edi
0:000> da poi(esp+4)
0012fe70  "C:\WINDOWS\system32\drivers\gran"
0012fe90  "de48.sys"

Драйвер! Дело пахнет руткитами. Пока программа стоит, делаем дамп чем-нибудь вроде PE Tools, и рассматриваем в дизассемблере. Он все ще ругается, теперь уже на IAT, но это несмертельно. В дебагере смотрим на call stack, находим, откуда была вызвана функция, возвращаемся в дизассемблер, находим этот код. Вызов CreateFile выглядит примерно как
call ds:42C1C8

что нам ничего особо не говорит. Поэтому используя команду dds в windbg находим адреса реальных функций, руками переносим в иду (из немного, что-то около двадцати). Теперь у нас есть названия вызываемых функций (как бы восстановленная руками таблица импорта), и мы можем проанализировать код в дизассемблемере. Он оказывается очень простым, линейным, почти без ветвлений. Приведу полностью код главной функции:

; Attributes: bp-based frame
Main_40164F proc near
var_32C= dword ptr -32Ch
String1= byte ptr -228h
Windir= byte ptr -124h
var_20= dword ptr -20h

push ebp
mov ebp, esp
sub esp, 32Ch
call unxor_401040
call SetupImports_401248

call ds:GetTickCount_0
mov ds:TickCount_42C1AC, eax
push 104h ; uSize
lea eax, [ebp+Windir]
push eax ; lpBuffer
call ds:GetWindowsDirectoryA
lea eax, [ebp+Windir]
push eax
lea eax, [ebp+String1]
push eax
call ds:lstrcpyA
lea eax, [ebp+Windir]
push eax
lea eax, [ebp+var_32C]
push eax
call ds:lstrcpyA
push ds:lpString2
lea eax, [ebp+var_20]
push eax
call ds:lstrcpyA
push ds:dword_42C16C
lea eax, [ebp+Windir]
push eax
call ds:lstrcatA
lea eax, [ebp+Windir]
push eax
call ExtractDriver_4015E4
lea eax, [ebp+var_20]
push eax
lea eax, [ebp+Windir]
push eax
call LoadDriver_4014CB
add esp, 0Ch
call KillMySelf_40139F
call CleanUp_401000
leave
retn
Main_40164F endp

Как видно, все просто. Сначала подготавливаются строки, затем восстанавливается импорт, после чего драйвер извлекается из тела программы, сохраняется в папку с драйверами и загружается.
ADVAPI32!CreateServiceA:
77e37071 6a30            push    30h
0:000> da poi(esp+8)
0012ff74  "grande48"


Здесь хочу напомнить об одном простом, но очень действенном способе борьбы с такого рода заражениями. Достаточно запретить себе запись в системные директории и большая половина вирусов работать просто не будет.

На этапе загрузки драйвера нас ждет второй сюрприз. Он не загружается. Можно сидеть и ждать часами с отладчиком в руках, когда же вызовется этот долгожданный IoCreateDevice, но этот момент не наступает. Через несколько часов бесплодных попыток загрузить драйвер, оказывается, что он сделан для Windows 2000! Поэтому большинству windows пользователей, которое пользуется XP, эта зараза не страшна. Вполне возможно, что это только данная модификация себя так ведет, так что точно не скажу.

Кстати о драйвере. Размер 167936. Определяется Касперским как Rootkit.Win32.Agent.aih. Внутри содержит массу разнообразного кода, который рассылает спам. Кроме прочего содержит IP адрес управляющего сервера: 208.66.195.172. Судя по всему, это co-location, а сам сервер арендован. Не очень, правда, понятно, как это можно арендовать сервер для управления ботнетом ) А может быть, сервер легальный, просто вредоносный код на него внедрен, а админы прозевали. Вобщем туманно тут все.

Возвращаемся обратно. Функция KillMySelf создает бат-файл _it.bat в папке Temp и затем его запускает:
kernel32!CreateFileA:
7c801a24 8bff            mov     edi,edi
0:000> da poi(esp+4)
0012fb58  "C:\DOCUME~1\dev\LOCALS~1\Temp\_i"
0012fb78  "t.bat"

Вот его полный текст:

:abc
del «C:\sandbox\Trojan.Win32.Srizbi.v\resume.exe.txt»
if exist «C:\sandbox\Trojan.Win32.Srizbi.v\resume.exe.txt» goto abc
rmdir «C:\sandbox\Trojan.Win32.Srizbi.v»
del «C:\DOCUME~1\dev\LOCALS~1\Temp\_it.bat»

То есть пытается удалить программу, папку, ее содержащую, и самого себя напоследок.

Вывод

Srizbi — никакой не троян, а переносчик настоящей вредоносной программы. Его цель — максимально быстро (хоть и получается медленно) выгрузить из своего тела настоящий вирус, запустить его на выполнение, после чего исчезнуть, оставив минимум следов. Код его несложный и необъемный, и начинающим (как я:), довольно просто в нем разобраться. Из-за дурацкой ошибки, вся работа Srizbi.v идет на смарку: он не проверяет версию операционной системы на соответствие содержащемуся в нем драйверу. В результате система просто отказывается грузить драйвер. Заглянуть в драйвер полезно, там руткит, который прячет файлы, ключи реестра, сетевые соединения и прослушиваемые порты.
Теги:
Хабы:
+155
Комментарии108

Публикации

Истории

Работа

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн