• XSS.stack #1 – первый литературный журнал от юзеров форума

Разбор матрешки или патриотизм в банк малвари.

kruf

floppy-диск
Пользователь
Регистрация
13.06.2014
Сообщения
9
Реакции
0
Известный специалист по информационной безопасности Брайан Крэбс открыто заявил о своей нетрадиционной ориентации. Пруф:

https://exploit.in/forum/pda/index.php/t78524.html


Часть 1.

Раслабьтесь, это ссылка всего лишь для того чтобы эффектно начать обзор.

Реверсинг занятие интересное, интригующее но в большинстве случаев утомительное и долгое. Но иногда проскакивают образцы
малвари разбирая которые на лице невольно возникает улыбка перерастающая в истерический смех.

Примерно такой сэмпл попался мне на кухню. Имя ему Win32/Dyzap.A. Представляет собой зевсоподнобое семейство неся на борту
формграббер, инжектор, внц модуль и прочие мелкие радости заливщиков. Криптованный представляет собой .scr файл (скринсейвер) с хэшем c2d73485095efdbd7ab625e469affb11. Вес 241 кб, запомните это число. Имеет 5 секций (криптовщик хорошо постарался).

84a1ab40e127.jpg


Как подсказывает женская статья http://lover.ru/psychology/personality/Gla..._soblaznitelja/ многие парни не инициативны. Скажем нет бабской ереси и будем главным инициатором загрузки файла в отладчик. После загрузки мы видим, что
стаб криптора хитер, умен и лихо притворяется обычным файлом от visual studio. Что ж, инстинктивно ищем функцию WinMain. Кстати, есть замечательный плагин для OllyDbg - OllyMapConv. Суть - грузим файл в IDA, генерируем с пмощью него map файл и грузим этот файл в отладчик через этот плагин. Результат - функции получают имена распознанный дизассемблером.

47eb88d6cfa5.jpg


Переходим по функции и нас ждет настолько скучный код, что игра Бразилии покажется интереснее. Что ж обычный просмотр функций не дал должного результата, поэтому перейдем к более агресивным методам распаковки.

72fe6b00d2ae.jpg


Прежде чем как перейти к этому пункту, немного лирики о работе крипторов: исходный файл преобразуется (???) сжимается (???). При запуске стаб грузит в память исходный файл, решает все вопросы связанные с корректоной работой pe, а дальше не интересно. Для нас самое важное здесь - загрузка образа в память. Соответственно, отладчик должен уловить этот момент. Возвращаемся в отладчик и ставим брейкпоинты на api с работой памятью. VirtuallAlloc. Что говоришь маленький мальчиК: лучше ставить на Zw/Nt заглушки? Конечно ты прав, но так как я уже отреверсил сие чудо, то можем спокойно обойтись VirtualAlloc.

Ставим брейкпойнты на api: VirtualAlloc, VirtualProtect, MapViewOfFile. Попивая кофе, спокойно нажимаем на F9 (запуск файла, мы же работаем в виртуалке, да?). И сразу же ловим вызов VirtualProtect c флагом PAGE_EXECUTE_READWRITE.

a05f5995bcf0.jpg


дабы узнать, кто вызвал ее давим окоченевшими пальцами (+18, а на улице лето) Ctrl+F9, F8 и прямиком попадаем на место вызова аки бравый полицейский после реформы. Но ничего интересного нет. Давим дальше F9. Ловим вызов VirtualAlloc. Чтобы посмотреть, что находится в выделенной памяти (пока там пусто), переходим к окну регистров, выбираем регистр EAX - правая кнопка - Follow in Dump. Програма зря памяти выделять не станет и поэтому надо проконтролировать, что туда будет скопировано. Переходим к окну дампа памяти: выбираем первый байт - правая кнопка - breakpoint - memory, on access. Это значит, брейкпойнт сработает при попытке доступа к участку памяти.

07cae1c00a86.jpg



Что ж верим мне на слово и давим F9. И ловим удачу: код останавливаетс на инструкциях

REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] -

на простом человеческом - заполнить память (???). Дабы не утомлять вас я пропущу цикл телодвижений связанные с повтором вышесказанных слов. И так, несколько раз повторив, наконец то в окне регистров видим, что заметное. Присмотревшись, вытираем слезу счастья (мужики не плачут, Хатико не в счет), видим указатель на структуру PE.

46cd035e695f.jpg



Далее следует скучный и пропущенный обзор связанный с распаковкой файла.

Распаковав файл, грузим его в дизассемблер. Распакованный файл весит порядком выше одного мегабайта, ловим себя на мысли, что то он до хрена весит. Окрестности точки входа не предвещают беды, разве что автор малвари был патриотом Украины

452622320baf.jpg


Идем дальше по дизассемблеру. Видим обычный код копирования себя любимого в Roaming, регистрации в ключе реестра для автозапуска. Скучно. Но пролистываю дальше натыкаемся на весьма интересный момент. Код извлекает из себя ресурсы:

47f657b6f2f1.jpg


. В зависимости от разрядности (32/64) извлекается нужный ресурс (бинарный код), далее этот окд запускается с помощью инжекта в процесс устаревшой техникой

43226527a9da.jpg


Часть 2.

Вспоминаем момент про инициативных мужчин и сами ResHAcker'ом извлекаем ресурсы.

d8bdfb153bde.jpg


Грузим файл PAYLOAD32 в дизассемблер. Увиденное заставит немного поломать голову. Это PE файл, но точка входа отсутсвует. В начале присутствует код очень похожий на запуск из памяти. Что ж, если это pe файл, то постараемся найти доказательства этому. Что маленький мальчик, говоришь ида уже корректно загрузила и это доказательство? Вообщем то ты прав. Листая код находим: This program cannot be run in DOS mode. Окей, дальше идея такова: вырезаем все что находится до PE хидера. Сказано - сделано и загружено в дизассемблер. Ииииии - бинго! Мы явно подобрались к чемц то интересному, судя по срокам:

Код:
.rdata:10008A5C 0000000E C Full Cone NAT                                                   
.rdata:10008F20 0000000D C IPHLPAPI.DLL                                                    
.rdata:10009618 0000000D C KERNEL32.dll                                                    
.rdata:10008A54 00000007 C No NAT                                                          
.rdata:100082C8 0000000B C Opera/9.80                                                      
.rdata:10008A7C 00000014 C Port restricted NAT                                             
.rdata:10008C08 00000014 C RtlCreateUserThread                                             
.rdata:1000832C 0000001A C RtlTimeToSecondsSince1970                                       
.rdata:10009652 0000000C C SHELL32.dll                                                     
.rdata:10009032 0000000C C SHLWAPI.dll                                                     
.rdata:10008AA8 0000000E C Symmetric NAT                                                   
.rdata:10008BA8 00000005 C TRUE                                                            
.rdata:10008A6C 0000000D C UDP Firewall                                                    
.rdata:10009632 0000000B C USER32.dll                                                      
.rdata:10008B8C 0000000A C VNCModule                                                       
.rdata:10008B44 0000000F C VncStartServer                                                  
.rdata:10008B54 0000000E C VncStopServer                                                   
.rdata:10009102 0000000C C WININET.dll                                                     
.rdata:10008FF6 0000000B C WS2_32.dll                                                      
.rdata:10008368 00000009 C Wget/1.9                                                        
.rdata:10008214 00000006 C Win_7                                                           
.rdata:1000821C 0000000A C Win_7_SP1                                                       
.rdata:10008230 00000006 C Win_8                                                           
.rdata:10008238 00000008 C Win_8.1                                                         
.rdata:10008240 00000010 C Win_Server_2003                                                 
.rdata:10008260 0000000E C Win_Vista_SP1                                                   
.rdata:10008250 0000000E C Win_Vista_SP2                                                   
.rdata:10008228 00000007 C Win_XP                                                          
.rdata:10008405 00000007 C \r8STs\ne                                                       
.rdata:10008278 00000007 C _32bit                                                          
.rdata:100082F0 00000009 C backconn                                                        
.rdata:100084E4 00000006 C botid                                                           
.rdata:10008BC4 0000000F C cannot get VNC                                                  
.rdata:10008B04 00000011 C canot get config                                                
.rdata:10008560 00000007 C config                                                          
.rdata:1000820C 00000006 C empty                                                           
.rdata:10008A3C 00000015 C http://icanhazip.com                                            
.rdata:10008518 00000009 C no\r\n\r\n\r\n                                                  
.rdata:100082D4 0000000A C publickey                                                       
.rdata:100082E8 00000008 C replace                                                         
.rdata:100081F4 0000000A C srv_alias                                                       
.rdata:10008B28 0000000B C start fail                                                      
.rdata:10008BB0 0000000D C start failed                                                    
.rdata:10008B18 0000000E C start success                                                   
.rdata:10008270 00000008 C unknown                                                         
.rdata:10008AB8 0000000C C unknown NAT                                                     
.rdata:100082E0 00000006 C vnc32    

Анализ содержимого и что он делает будет в дальнейшей части. Медленно пролистываем список импорта файл и глаз от увиденного начинает судорожно моргать.


Да, да: этот файл опять содержит ресурсы. Но кроме ресурсов здесь есть и еще интересные вещи: rsa ключ, конфиг и бинарный файл

6744c24a0e51.jpg


Грузим файл в дизассемблер, анализируем. И сука, бинго!! Файл не содержит ресурсов)) Шутка, на самом деле мы подорались к самомоу главному компоненту матрешки судя по строкам внутри.

172e07ed9bd2.jpg

7208f779cf89.jpg


Дальнейший анализ будет выкладываться в этой же теме. Все файлы, включая распакованные: https://www.sendspace.com/file/ndi071
 
За долгое время не считая постов крема что-то интересное по реверсу. Чтож, это не может не радовать) Пишите еще!
 
скрипт для расшифровки DEFCONFIG из ресурсов http://www.everfall.com/paste/id.php?lrt7xn0x5lnl

в PAYLOAD32.exe в DEFCONFIG содержится следующее:
Код:
name: cho1118
ips:
188.165.216.217:19000
94.23.221.154:19000
216.55.182.19:19000
94.23.2.19:19000
188.165.216.217:19000
94.23.221.154:19000
216.55.182.19:19000
94.23.2.19:19000
 
кусок кода с ровникса
Код:
//
//	Searches the resource with the specified name within the current image resources.
//	Loads the resource found, unpacks it and tries to install as client DLL.
//
static BOOL InstallClientRsrc(
	LPTSTR	ClientName,
	ULONG	Flags
	)
{
	HRSRC	hResource;
	HGLOBAL	hRes;
	BOOL	Ret = FALSE;

	Flags |= INJECT_FLAG_AUTORUN;

	// Looking for the specified client resource
	if (hResource = FindResource(NULL, ClientName, RT_RCDATA))
	{
  // Loading the resource
  if (hRes = LoadResource(NULL, hResource))
  {
  	// Unpacking the resource data
  	PAP_FILE_HEADER pHeader = (PAP_FILE_HEADER)LockResource(hRes);
  	PCHAR	Packed = (PCHAR)pHeader + pHeader->HeaderSize;
  	PVOID	Unpacked = (PVOID)Alloc(pHeader->OriginalSize);
  	if (Unpacked)
  	{
    if (aP_depack(Packed, Unpacked) == pHeader->OriginalSize)
    	// Installing the DLL
    	Ret = InjectClient(Unpacked, pHeader->OriginalSize, Flags);

    Free(Unpacked);
  	}	// if (Unpacked)
  }	// if (hRes = LoadResource(NULL, hResource))
	}	// if (hResource = FindResource(NULL, ClientName, RT_RCDATA))

	return(Ret);
}
о том что, ресурсы можно хранить в секции, авторы видимо позабыли
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх