
Вариант Gargoyle для x64, скрывающий артефакты памяти, используя только ROP и PIC
Вариант Gargoyle для x64, скрывающий артефакты памяти только с помощью ROP и PIC.
Огромная благодарность @waldoirc за документирование большей части этой техники в его блоге
Эта реализация отличается тем, что не использует APC и полностью реализована как PIC.
Я создал это, чтобы лучше понять, как скрывать артефакты памяти с помощью техники, подобной Gargoyle, на x64. Идея заключается в настройке ROP-цепочки, вызывающей VirtualProtect() -> Sleep() -> VirtualProtect(), чтобы пометить свою собственную страницу как N/A во время сна.
В отличие от Gargoyle и других реализаций, подобных Gargoyle, я полностью полагаюсь на ROP и не ставлю в очередь никакие APC. Сам DeepSleep реализован как полностью PIC, что упрощает перечисление страниц памяти, которые необходимо скрыть от сканеров.
Пока поток активен, появляется MessageBox, и страница DeepSleep помечена как исполняемая. Во время сна страница помечена как N/A.
Это эффективно обходит Moneta на момент написания, если DeepSleep внедрён, а базовый адрес исполняющего потока не указывает на приватную выделенную память.
Я проверил это с помощью техники внедрения Earlybird для внедрения DeepSleep.bin в notepad.exe

С использованием Mingw:
Введите make, и появится дикий DeepSleep.bin.
Либо используйте предварительно скомпилированный DeepSleep.bin :-)
Возможно, я выпущу загрузчик для CS или других C2-агентов. Аналогично YouMayPasser, загрузчик будет перехватывать sleep с помощью HW-брейкпоинтов, чтобы избежать подозрительных изменений kernel32.dll.
Тестировалось на 10.0.19044 N/A Build 19044
ROP-гаджеты, на которые я полагаюсь, могут отсутствовать в ntdll.dll в других версиях Windows. Вероятно, стоит использовать более мелкие и универсальные ROP-гаджеты и перечислять гаджеты в большем количестве DLL, чем просто ntdll.dll.
Стек вызовов для потока в состоянии DelayExecution включает неизвестные/изменённые области памяти, а также адреса VirtualProtect(). Hunt-Sleeping-Beacons обнаруживает это.
Возможно, применить эту метрику к другим C2, использующим другую технику ожидания между обратными вызовами.

@waldoirc за документирование большей части техники здесь
@forrest Orr за Moneta
Josh Lospinoso за оригинальную технику Gargoyle