Здарова барни, опять яя.
Статья публикуется только для данного форума(LIMB.cc)
В статье не использовалась чатГОПОТА.
Погнали.
Статья публикуется только для данного форума(LIMB.cc)
В статье не использовалась чатГОПОТА.
Погнали.
Спойлер: Важная INFO
Статья писалась как введение в статический анализ малварей для начинающих. Я сознательно не углублялся в низкоуровневый ассемблерный разбор, чтобы сделать материал более доступным, решил поработать со псевдокодом просто)..
Разделил статьи на главы:I глава. Немного о малваре который будем анализировать
II глава. Анализ шифровальщика WannaCry
Заключение
I глава. Немного о малваре который будем анализировать
Я думаю читающий эту статью человек, слышал про такой шифровальщик как WannaCry
Работает он по подобному принципу:
1) Массовая шифровка файлов
2) Запускается окно с шантажом, просьба скинуть BTC на определённый кошелек для дальнейшего предоставления дешифровщика для расшифровки файлов.
Подобные хакерские группировки атаковали большие компании, с целью получения большой прибыли. Последствия ужасные,
В нашем случае WannaCry использовали уязвимость EternalBlue для распространения.
Также, немножко теории про то, как работает шифровальщик в системе:
1) Малварь может внедрить свой вредоносный код в процесс svchost.exe, с целью запустить себя на уровне SYSTEM(к примеру svchost.exe).
Малварю важно чтобы он работал именно на уровне SYSTEM(потому что больше возможностей работы с системой)
2) Если малварь успешно запустился на уровне SYSTEM, он начинает массово шифровать файлы. Шифрование файлов может проходить фоново, пока вы играйте в игры,либо заняты работой. После того как малварь зашифрует все важные для системы в том числе и для файлы, он выводит окно с требованием об оплате выкупа.
Если человек оплачивает выкуп он получает ключ к расшифровке файлов.
А то и вовсе после оплаты могут ключ не выдать.
Но в нашем случае WannaCry запускается как обычный процесс!
Ii глава. Анализ шифровальщика WannaCry
Переходим к практике, я тянуть не буду.
Для статического анализа WannaCry я буду использовать дизассемблер - IDA PRO версии 9.0.
Малварь скачал отсюда - https://github.com/limiteci/WannaCry.
Начинаем анализ!
Открыв файл в иде, можно сразу заметить такие переменные как:
Эти переменные созданы для заполнения значениями WinAPI функции.
После перевода кода в псевдо, можно заметить множество WinAPI функций, о них чуть позже. Memset заполняет уже выделенную память определенным значением (обычно нулями, как в нашем случае). Память для локальной переменной Filename была выделена в стеке в момент входа в функцию.
Если кратко, memset здесь используется для зануления этого буфера перед использованием:
Весь буфер Filename имеет размер больше 516 байт. Код зануляет часть буфера, начиная со второго байта длиной 516.
Но при этом, первый байт Filename[0] не зануляется(вопрос, почему?)
Далее обращаем внимание на API функцию GetModuleFileNameA.
Ей передается переменная Filename и 516 байт:
Данная функция используется для извлечения полного пути к исполняемому файлу модуля, который загружен в текущий процесс. Но опять же, непонятно зачем столько байт.
Также просьба обратить внимание на другие функции:
CopyFileA - копирует один файл, в другой файл.
В этом случае малварь читает оригинальный файл, который хранится в Filename, после чего шифрует его в памяти, а ПОСЛЕ чего перезаписывает оригинальный файл зашифрованными данными.
После чего сразу же вызывается функция GetFileAttributesA.
Чаще всего этой функции присваивается значение NULL.
Также можно заметить функцию SetCurrentDirectoryA которая предназначена для изменения каталога текущего процесса.
Это может быть малварь запущенным под видом системного процесса, к примеру: svhost.exe.
Также, можно предположить что малварь написан на С/С++ потому-что используется strrrchr:
Обратите внимание на ( strrchr(Filename, 92) )
Эта функция ищет последнее вхожение символа с кодом ASCII 92 в строке Filename. Если переводить это число с ASCII то 92 соотвествует обратному слэшу (``)
Как мы знаем обратный слэш используется в путях к файлами Windows.
Условие проверяет, найдено ли послее вхождение обратного слэша в строке Filename, если оно найдена, то условие истинно.
Можно предположить, что этот участок кода используется для получения пути к каталогу, содержащему файл.
Давайте же перейдем к самому интересному.
А именно к шифрованию, созданию ключей для шифрования и также для расшифровки файлов.
В строках ищем функции начинающие на crypt и видим:
Переходим по функции CryptEncrypt задача которой является шифрование файлов:
Кстати, к моему удивлению, тут нету джанк-кода, протектор тоже не наложен, что довольно странно.
Видим вот такой дизассемблерный код после чего начинаем его анализировать:
Кликнув по функции CryptAcquireContextA мы замечаем форматы файлов, которые, по моему предположению будут шифроваться:
Кстати, функция CryptAcquireContextA, получается сам шифровальщик довольно древний, на то и видно.
Нету никакой обфускации.
Нету MBA-обфускации как в нынешних малварях.
Нету банального джанк кода(логической защиты кода)
Далее у нас идет функция CryptImportKey которая используется для импорта криптографического ключа из ключа BLOB в поставщика служб шифрования - CSP
CSP позволяет генерировать уникальные ключи для шифрования.
К стек заноситься hModule функции.
Обратите ВНИМАНИЕ на последовательность функций.
CryptAcquireContextA -> CryptImportKey(генерация ключа) -> CryptDestroyKey(эта функция используется для уничтожения дескриптора ключа) -> CryptEncrypt(шифровка файлов) -> CryptDecrypt(расшифровка файлов).
Все эти функции импортируются из библиотеки advapi32.dll
Я думаю вы поняли.
Также малварь обращается advapi32.dll библиотеки, после чего вызывает функцию LoadLibraryA которая используется с целью загрузки advapi32.dll.
advapi вызывается малварем на просто так, дело в том что функции для работы с шифрование заложены именно в нем.
Двумя словами это - криптографическое ядро.
Кстати, название исполняемого файла шифровальщика - это taskche.exe:
Также были найдены BICTOIN кошельки для требования о выкупе:
1) 115p7UMMngoj1pMvkpHijcRdfJNXj6LrLn
2) 12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw
3) 13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94
Также найдено, как малварь выбирает путь до файла.
В нашем случае это либо
'%s\Intel',0
'%s\ProgramData',0
Также прошу вас обратить внимание на адрес 0040F42C
А именно попытка выполнить что-то, также испольузется спецификатор %s
%s - это спецификатор для указания типа данных string.
также используется /c, опять же, малварь что-то пытается выполнить в CMD-шке.
Кстати, мы только что выяснили что малварь писался на Си, т.к используется спецификатор %s
Пример как он выглядит на си:
В си важно указывать спецификаторы чтобы компилятор понял, какой тип данных используется.
Малварь оказывается импортирует не только advapi.
Естественно для выполнения других API функций, помимо связанных с шифрованием, малварю нужно импортировать такие важные системные dll-лки как:
kernel32.dll
user32.dll
Msvcrt.dll(библиотека для работы с с/с++)
Также в малваре используется динамическое выделение памяти(free, malloc)
Это уже сто процентов подтверждает наше утверждение, о том, что малварь был написан на Си.
Потому-что в тех же плюсах динамическое выделение памяти используется без free/malloc. А через операторы new и delete, а также умные указатели, такие как shared_ptr и unique_ptr.
Подробнее тут - тык.
Также в малваре имеются много других функций винды, но разбирать мы их не будем.
Т.к наша цель как реверсеров была выяснить: является ли программа вирусом или нет, мы свою задачу выполнили.
Вердикт: Ransomware
Также на последок разберем один моментик:
В wcscat хранится название шифровальщика, который скорее всего будет выведен на экран, а именно: WanaCrypt0r.
Также малварь работает с реестром, пытаясь вписать себя в автозагрузку:
Я думаю читающий эту статью человек, слышал про такой шифровальщик как WannaCry
Работает он по подобному принципу:
1) Массовая шифровка файлов
2) Запускается окно с шантажом, просьба скинуть BTC на определённый кошелек для дальнейшего предоставления дешифровщика для расшифровки файлов.
Подобные хакерские группировки атаковали большие компании, с целью получения большой прибыли. Последствия ужасные,
В нашем случае WannaCry использовали уязвимость EternalBlue для распространения.
Также, немножко теории про то, как работает шифровальщик в системе:
1) Малварь может внедрить свой вредоносный код в процесс svchost.exe, с целью запустить себя на уровне SYSTEM(к примеру svchost.exe).
Малварю важно чтобы он работал именно на уровне SYSTEM(потому что больше возможностей работы с системой)
2) Если малварь успешно запустился на уровне SYSTEM, он начинает массово шифровать файлы. Шифрование файлов может проходить фоново, пока вы играйте в игры,либо заняты работой. После того как малварь зашифрует все важные для системы в том числе и для файлы, он выводит окно с требованием об оплате выкупа.
Если человек оплачивает выкуп он получает ключ к расшифровке файлов.
А то и вовсе после оплаты могут ключ не выдать.
Но в нашем случае WannaCry запускается как обычный процесс!
Ii глава. Анализ шифровальщика WannaCry
Переходим к практике, я тянуть не буду.
Для статического анализа WannaCry я буду использовать дизассемблер - IDA PRO версии 9.0.
Не удалось прогрузить медиа
Малварь скачал отсюда - https://github.com/limiteci/WannaCry.
Начинаем анализ!
Не удалось прогрузить медиа
Открыв файл в иде, можно сразу заметить такие переменные как:
Code:
Filename= byte ptr -20Ch
var_20B= byte ptr -20Bh
var_4= dword ptr -4
hInstance= dword ptr 8
hPrevInstance= dword ptr 0Ch
lpCmdLine= dword ptr 10h
nShowCmd= dword ptr 14h
Эти переменные созданы для заполнения значениями WinAPI функции.
После перевода кода в псевдо, можно заметить множество WinAPI функций, о них чуть позже. Memset заполняет уже выделенную память определенным значением (обычно нулями, как в нашем случае). Память для локальной переменной Filename была выделена в стеке в момент входа в функцию.
Если кратко, memset здесь используется для зануления этого буфера перед использованием:
Не удалось прогрузить медиа
Весь буфер Filename имеет размер больше 516 байт. Код зануляет часть буфера, начиная со второго байта длиной 516.
Но при этом, первый байт Filename[0] не зануляется(вопрос, почему?)
Далее обращаем внимание на API функцию GetModuleFileNameA.
Ей передается переменная Filename и 516 байт:
Не удалось прогрузить медиа
Данная функция используется для извлечения полного пути к исполняемому файлу модуля, который загружен в текущий процесс. Но опять же, непонятно зачем столько байт.
Также просьба обратить внимание на другие функции:
Не удалось прогрузить медиа
CopyFileA - копирует один файл, в другой файл.
В этом случае малварь читает оригинальный файл, который хранится в Filename, после чего шифрует его в памяти, а ПОСЛЕ чего перезаписывает оригинальный файл зашифрованными данными.
Не удалось прогрузить медиа
После чего сразу же вызывается функция GetFileAttributesA.
Чаще всего этой функции присваивается значение NULL.
Также можно заметить функцию SetCurrentDirectoryA которая предназначена для изменения каталога текущего процесса.
Это может быть малварь запущенным под видом системного процесса, к примеру: svhost.exe.
Также, можно предположить что малварь написан на С/С++ потому-что используется strrrchr:
Не удалось прогрузить медиа
Обратите внимание на ( strrchr(Filename, 92) )
Эта функция ищет последнее вхожение символа с кодом ASCII 92 в строке Filename. Если переводить это число с ASCII то 92 соотвествует обратному слэшу (``)
Как мы знаем обратный слэш используется в путях к файлами Windows.
Условие проверяет, найдено ли послее вхождение обратного слэша в строке Filename, если оно найдена, то условие истинно.
Можно предположить, что этот участок кода используется для получения пути к каталогу, содержащему файл.
Давайте же перейдем к самому интересному.
А именно к шифрованию, созданию ключей для шифрования и также для расшифровки файлов.
В строках ищем функции начинающие на crypt и видим:
Не удалось прогрузить медиа
Переходим по функции CryptEncrypt задача которой является шифрование файлов:
Кстати, к моему удивлению, тут нету джанк-кода, протектор тоже не наложен, что довольно странно.
Не удалось прогрузить медиа
Видим вот такой дизассемблерный код после чего начинаем его анализировать:
Кликнув по функции CryptAcquireContextA мы замечаем форматы файлов, которые, по моему предположению будут шифроваться:
Не удалось прогрузить медиа
Кстати, функция CryptAcquireContextA, получается сам шифровальщик довольно древний, на то и видно.
Нету никакой обфускации.
Нету MBA-обфускации как в нынешних малварях.
Нету банального джанк кода(логической защиты кода)
Далее у нас идет функция CryptImportKey которая используется для импорта криптографического ключа из ключа BLOB в поставщика служб шифрования - CSP
CSP позволяет генерировать уникальные ключи для шифрования.
К стек заноситься hModule функции.
Обратите ВНИМАНИЕ на последовательность функций.
CryptAcquireContextA -> CryptImportKey(генерация ключа) -> CryptDestroyKey(эта функция используется для уничтожения дескриптора ключа) -> CryptEncrypt(шифровка файлов) -> CryptDecrypt(расшифровка файлов).
Все эти функции импортируются из библиотеки advapi32.dll
Я думаю вы поняли.
Также малварь обращается advapi32.dll библиотеки, после чего вызывает функцию LoadLibraryA которая используется с целью загрузки advapi32.dll.
Не удалось прогрузить медиа
advapi вызывается малварем на просто так, дело в том что функции для работы с шифрование заложены именно в нем.
Двумя словами это - криптографическое ядро.
Кстати, название исполняемого файла шифровальщика - это taskche.exe:
Не удалось прогрузить медиа
Также были найдены BICTOIN кошельки для требования о выкупе:
Не удалось прогрузить медиа
1) 115p7UMMngoj1pMvkpHijcRdfJNXj6LrLn
2) 12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw
3) 13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94
Не удалось прогрузить медиа
Также найдено, как малварь выбирает путь до файла.
В нашем случае это либо
'%s\Intel',0
'%s\ProgramData',0
Также прошу вас обратить внимание на адрес 0040F42C
А именно попытка выполнить что-то, также испольузется спецификатор %s
Не удалось прогрузить медиа
%s - это спецификатор для указания типа данных string.
также используется /c, опять же, малварь что-то пытается выполнить в CMD-шке.
Кстати, мы только что выяснили что малварь писался на Си, т.к используется спецификатор %s
Пример как он выглядит на си:
C:
char name[] = "Гемфори";
printf("Привет, %s!", name);
// ВЫВЕДЕТ Привет Гемфори.
В си важно указывать спецификаторы чтобы компилятор понял, какой тип данных используется.
Не удалось прогрузить медиа
Малварь оказывается импортирует не только advapi.
Естественно для выполнения других API функций, помимо связанных с шифрованием, малварю нужно импортировать такие важные системные dll-лки как:
kernel32.dll
user32.dll
Msvcrt.dll(библиотека для работы с с/с++)
Не удалось прогрузить медиа
Также в малваре используется динамическое выделение памяти(free, malloc)
Это уже сто процентов подтверждает наше утверждение, о том, что малварь был написан на Си.
Потому-что в тех же плюсах динамическое выделение памяти используется без free/malloc. А через операторы new и delete, а также умные указатели, такие как shared_ptr и unique_ptr.
Подробнее тут - тык.
Также в малваре имеются много других функций винды, но разбирать мы их не будем.
Т.к наша цель как реверсеров была выяснить: является ли программа вирусом или нет, мы свою задачу выполнили.
Вердикт: Ransomware
Не удалось прогрузить медиа
Также на последок разберем один моментик:
Не удалось прогрузить медиа
В wcscat хранится название шифровальщика, который скорее всего будет выведен на экран, а именно: WanaCrypt0r.
Также малварь работает с реестром, пытаясь вписать себя в автозагрузку:
- HKEY_CURRENT_USER — автозагрузка только для текущего пользователя
- HKEY_LOCAL_MACHINE — автозагрузка для всех пользователей системы
- Для того чтобы малварь вписал что-то в HKEY_CURRENT_USER не требуются права администратора.
- А с HKEY_LOCAL_MACHINE все наоборот, права администратора требуются, но, как мы знаем малварь работает на уровне SYSTEM покрываясь определённым системным процессом, что позволяет ему вписывать в автозагрузку для всех пользователей системы:
C:
if ( v10 )
RegCreateKeyW(HKEY_CURRENT_USER, (LPCWSTR)Destination, &phkResult);
else
RegCreateKeyW(HKEY_LOCAL_MACHINE, (LPCWSTR)Destination, &phkResult);
На этом моменте любому реверсеру стало бы понятно, что это ransomware.
Заключение
В этой мини-главе я разобрал шифровальщик WannyCry.
Если кто-то не поймет, прошу написать под этой статьей что именно непонятно.
Если я что-то не так объясняю, всегда есть комменты.
Также, профи которые имеют больший опыт, тоже ожидаю вас в комментариях.
Всем удачи
👍52
❤️3
😁9
😮7
😢16
💯13
LIMB