
x64용 Gargoyle의 변종으로, ROP만 사용하고 PIC를 사용하여 메모리 아티팩트를 숨깁니다.
ROP와 PIC만을 사용하여 메모리 아티팩트를 숨기기 위한 x64용 Gargoyle 변형입니다.
큰 감사를 @waldoirc에게 전합니다. 그는 자신의 블로그에서 이 기술의 많은 부분을 문서화했습니다.
이 구현은 APC를 전혀 사용하지 않고 완전히 PIC로 구현되었다는 점에서 다릅니다.
x64에서 Gargoyle과 유사한 기술을 사용하여 메모리 아티팩트를 회피하는 방법을 더 잘 이해하기 위해 이 도구를 만들었습니다. 아이디어는 VirtualProtect() -> Sleep() -> VirtualProtect()를 호출하는 ROPChain을 설정하여 Sleep 중에 내 페이지를 N/A로 표시하는 것입니다.
Gargoyle 및 다른 Gargoyle 유사 구현과 달리, 나는 ROP에 전적으로 의존하고 APC를 큐에 넣지 않습니다. DeepSleep 자체는 완전히 PIC로 구현되어 있어, 스캐너로부터 숨겨야 할 메모리 페이지를 열거하기가 더 쉽습니다.
스레드가 활성화되어 있는 동안에는 MessageBox가 나타나고 DeepSleep의 페이지는 실행 가능으로 표시됩니다. Sleep 중에는 페이지가 N/A로 표시됩니다.
이는 DeepSleep이 주입되고 실행 스레드의 기본 주소가 전용 커밋 메모리를 가리키지 않을 경우, 현재 시점에서 Moneta를 효과적으로 우회합니다.
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에서 테스트되었습니다.
의존하는 ROPgadgets가 다른 Windows 버전의 ntdll.dll에 존재하지 않을 수 있습니다. 더 작고 일반적인 ROPgadgets를 사용하고 ntdll.dll 외에 더 많은 DLL에서 가젯을 열거하는 것이 좋은 생각일 수 있습니다.
DelayExecution 상태에 있는 스레드의 호출 스택에는 알 수 없거나 변조된 메모리 영역이 포함되며, 추가로 VirtualProtect()에 대한 주소도 포함됩니다. Hunt-Sleeping-Beacons가 이를 감지합니다.
이 지표를 콜백 사이의 대기를 위해 다른 기술을 사용하는 다른 C2에 적용하는 것도 가능할 수 있습니다.

@waldoirc - 기술의 많은 부분을 여기에 문서화해 주셨습니다.
@forrest Orr - Moneta를 제작해 주셨습니다.
Josh Lospinoso - 원본 Gargoyle 기술을 제작해 주셨습니다.