
Windows 디버깅 API를 이용한 셸코드 주입
DbgNexum은 Windows 디버깅 API와 공유 메모리(파일 매핑)를 사용하여 셸코드를 주입하기 위한 Proof-of-Concept입니다. 원격 메모리를 직접 읽고 쓰는 대신 컨텍스트 조작을 사용하여 대상 프로세스가 페이로드를 스스로 로드하고 실행하도록 강제합니다.
인젝터는 대상 프로세스에 연결하고 일시 중단된 스레드를 생성합니다. 디버그 루프를 통해 하드웨어 중단점을 설정하고, 특정 반환 주소에서 실행이 트랩되도록 합니다. 각 트랩에서 인젝터는 CPU 레지스터를 수정하여 함수 호출을 모방하며, 대상 프로세스 내부에서 일련의 Windows API 함수 호출을 조율합니다.
이 README를 작성하는 시점에, 저는 이 기법을 MDE와 Elastic을 대상으로 테스트했으며, 둘 다 이를 탐지하지 못했습니다.
WriteProcessMemory / VirtualAllocEx 불필요: 페이로드는 CreateFileMapping 및 MapViewOfFile을 통해 전송됩니다.ReadProcessMemory 불필요: 이 접근 방식은 모든 주요 정보를 스레드 컨텍스트에서 얻습니다.이 PoC는 "calc.exe"를 실행하는 XOR 처리된 msfvenom 셸코드를 사용합니다. 하지만 여러분만의 셸코드를 사용하세요!
shellcode.h에 셸코드(및 XOR 키)를 포함하세요.DbgNexum.exe <PID>
예제 출력:
[i] Section 'MZ' created and shellcode copied
[+] Bait thread created. Setting HWBP on FileTimeToSystemTime
[i] Execution Redirected:
|-> [0] Preparation & anchoring stack
|-> [1] Setting HWBP & buffer alloc
|-> [2] Copying File-Mapping name
|-> [3] Zeroing stack slot
|-> [4] Opening handle to named file mapping
|-> [5] Mapping payload into mem. with exec. perm.
|-> [6] Cleanup & shellcode execution
[+] Successfully detached from process 19256
[i] Orchestration complete.
실행 흐름은 인젝터의 디버그 루프와 대상 프로세스 사이를 끊임없이 오갑니다.
인젝션 단계
DebugLoop 함수에는 주요 인젝션 로직이 포함되어 있으며 "상태 머신"을 조율합니다.
0. 준비:
ret 호출로 설정합니다.1. 할당:
LocalAlloc을 호출하도록 준비하고 강제합니다.2. 데이터 설정:
MZ를 복사하기 위해 스레드가 memcpy를 호출하도록 준비하고 강제합니다.3. 스택 준비:
memset을 호출하여 스택 슬롯을 0으로 만들도록 강제합니다. 이는 MapViewOfFile을 호출할 5단계를 준비하기 위한 것입니다. 이 함수는 4개 이상의 인수를 사용하므로 5번째 인수는 스택을 통해 전달됩니다(여기서 설정합니다).4. 매핑 열기:
MZ 이름을 사용하여 스레드가 OpenFileMappingA를 호출하도록 강제합니다.5. 페이로드 매핑:
MapViewOfFile을 호출하도록 강제합니다. 이는 셸코드를 포함하는 공유 메모리 섹션을 EXECUTE 권한으로 대상의 주소 공간에 매핑합니다.6. 실행:
RIP를 MapViewOfFile이 반환한 주소로 리디렉션합니다.