**Техника сокрытия вредоносного шелл-кода на основе низкой энтропии с помощью кодирования Шеннона.**
Энтропия — это мера случайности в наборе данных (в данном случае: шелл-код). Чем выше энтропия, тем более случайными являются данные. Энтропия Шеннона — это алгоритм, который выдаёт результат от 0 до 8, где 8 означает, что в данных нет закономерности, следовательно, они очень случайны, а 0 — данные подчиняются шаблону.
**Примечание:** Ознакомьтесь с моей статьёй в блоге для более подробного объяснения моего исследования, а также с простым PoC внедрения шелл-кода Vanilla.
`git clone
Создайте новый проект Visual Studio и импортируйте **Entropy.h** и **shannonEncode.cpp** , затем просто соберите его.
**Для PoC внедрения шелл-кода (с Syscalls):**
Откройте файл проекта Visual Studio, расположенный в `/Shelltropy/SyscallsExample/SyscallsExample/SyscallsExample.vcxproj`, и просто соберите его.
**Примечание:** Если вам нужен простой PoC внедрения шелл-кода с WinAPI, загляните в мой блог
**Для декодировщика (необязательно, так как он включён в PoC внедрения шелл-кода):**
Создайте новый проект Visual Studio, импортируйте **shannonDecode.cpp** и просто соберите его.
* Запустите Cobalt Strike и сгенерируйте исполняемый файл Windows (с бесстадийной или стадийной загрузкой — на ваше усмотрение). Убедитесь, что вывод имеет тип **Raw** , и сохраните его как **payload.bin**
 на сгенерированный шелл-код из Python-файла.
* Вы можете использовать полученный шелл-код с низкой энтропией в проекте Visual Studio `/Shelltropy/SyscallsExample/SyscallsExample/SyscallsExample.vcxproj`
Концепция заключается в разделении массива на блоки и вставке между ними шаблона байтов с низкой энтропией. При запуске образца мы должны восстановить исходную нагрузку в памяти, обойдя статическое обнаружение кода с высокой энтропией на данном этапе. Стоит также отметить, что вставляемый код с низкой энтропией может следовать различным шаблонам, а количество вставок может варьироваться, что позволяет обходить статическое сигнатурное обнаружение. Второй шаг — объединить блоки байтов с высокой и низкой энтропией. В конечном итоге нам необходимо восстановить обфусцированный код в его первоначальное состояние, чтобы перейти к этапу деобфускации. Третья задача восстановит исходный массив байтов путём удаления шаблонов низкой энтропии.
 Нормальный: **7.062950**
(Низкая энтропия) Закодированный: **4.527140**
~ XOR-обработанный шелл-код Cobalt Strike
(Высокая энтропия) Нормальный: **4.583139**
(Низкая энтропия) Закодированный: **3.278284**
Высокая энтропия (левая сторона) против низкой энтропии (правая сторона) для стандартного шелл-кода CS, интегрированного с Syscalls (Syswhispers2):
 скопирован из этого проекта:
The full story
This article is one source in a clustered incident — the cluster page carries the summary, timeline and every other outlet covering it.
