
Overlord RAT의 전체 정적 및 메모리 분석: Go 에이전트 아키텍처, HTTP/2 + WebSocket C2, 반사적 DLL 인젝션, 브라우저 키로깅, 그리고 IOC. 실습 중심의 악성코드 리버스 엔지니어링 워크스루.
Process Hacker로 Overlord RAT(PID 7488)의 메모리 문자열을 스캔한 결과, 런타임에 해석되는 다수의 Windows API 호출과 내부 문자열이 드러났다. 이 중 http2dialCall은 C2 통신을 수립하는 데 사용되는 HTTP/2 기반 콜백 루틴으로 두드러진다. crypto, input-capture, graphics 관련 API의 존재는 키로깅, 화면 캡처, 암호화된 C2 기능을 갖춘 완전한 기능의 RAT임을 나타낸다.
http2dialCall – HTTP/2 콜백 함수; HTTP/2(포트 443)를 통해 C2 채널을 열어 정상적인 HTTPS 트래픽에 섞이도록 하는 데 사용된다. http2clientConnPool – HTTP/2 C2 세션용 연결 풀; C2 서버와 지속적이고 다중화된 통신을 가능하게 한다. maxIdleConnsPerHost / GetEvictionPriority / SetEvictionPriority – 연결 수명 주기 관리; 유휴 C2 채널을 타임아웃을 회피하면서 활성 상태로 유지한다. CreateCryptoSession /GetEncryptionBltKey – DirectX/GPU 기반 암호화 세션 생성; 암호화된 화면 캡처 또는 GPU 가속 작업에 사용된다. capture._Ctype_int / capture.monCapture / capture.scaledPart / capture.mfActivate – 화면 캡처 및 데스크톱 모니터링 루틴. GetInputCurrentType / GetImmediateContext – 입력 및 렌더링 컨텍스트 검색; 키로깅과 화면 스크래핑을 지원한다. CreateTrueColorCondition – 화면 캡처 작업을 위한 디스플레이 조건 설정.
HTTP/2 C2: http2dialCall과 http2clientConnPool의 사용은 RAT이 HTTP/2를 통해 통신함을 보여주며, 이는 일반 HTTP보다 탐지하기 어렵고 현대 웹 트래픽에 섞인다. 암호화된 유출: CreateCryptoSession과 GetEncryptionBltKey는 암호화된 데이터 전송을 나타내며, 이는 탈취된 파일이나 스크린샷을 위한 것일 가능성이 높다. 완전한 RAT 기능: 화면 캡처(capture.) + 입력 캡처(GetInputCurrentType) = 키로깅 및 원격 감시. Living-off-the-Land 스타일: API 문자열의 런타임 해석(난독화된 저장)은 정적 문자열 분석을 무력화하기 위한 일반적인 회피 기법이다. 지속성 및 회피: 연결 풀 관리(maxIdleConnsPerHost, GetEvictionPriority)는 탐지를 피하면서 C2 채널을 안정적으로 유지한다.

동일한 Overlord RAT 프로세스에 대한 두 번째 문자열 스캔은 입력 캡처, WebSocket C2, 메모리/리플렉션 조작과 관련된 별개의 문자열 집합을 드러낸다. HTTP/2와 화면 캡처에 초점을 맞춘 첫 번째 집합과 달리, 이 집합은 키로깅, 지속적인 WebSocket 통신, 메모리 내 실행 기법을 가리킨다.
capture.rawWin – 원시 창 캡처 루틴; 활성 창 스크린샷에 사용된다. captureKeyStrokes – 직접적인 키로깅 함수; 피해자 머신에서 입력되는 모든 키 입력을 캡처한다. map[uintptr]bool – 런타임 맵 구조; 후킹된 API나 캡처된 핸들을 추적하는 데 사용될 가능성이 높다. websocket.noCopy / websocket.header / websocket.opcode – WebSocket 구현 문자열; RAT이 (HTTP/2에 더해) WebSocket을 보조 C2 채널로 사용함을 나타낸다. writeFramePayload/ readCloseFrameErr / setCloseErrLocked – WebSocket 프레임 처리; 활성 WebSocket 기반 C2 통신을 확인한다. reflectlite.Type / abi.UncommonType/ abi.PCLnTabMagic – Go 런타임 리플렉션/ABI 문자열; 페이로드가 리플렉션을 사용하는 Go 기반 바이너리임을 나타낸다. msgpack.isZeroer / msgpack.field – MessagePack 직렬화; C2 메시지를 효율적으로 팩/언팩하는 데 사용된다. sync.poolDequeue / poolLocalInternal – Go sync 풀 관리; 고성능 메모리 재사용에 사용된다.
이중 C2 채널: HTTP/2(http2dialCall) + WebSocket(websocket.) = 한 채널이 차단되면 자동 장애 조치되는 중복 C2. 키로깅 기능: captureKeyStrokes는 RAT이 활성 키 입력 캡처를 수행함을 확인한다 — 자격 증명, 채팅, 비밀번호가 위험에 노출된다. Go 기반 페이로드: reflectlite, abi.PCLnTabMagic, msgpack 문자열은 이것이 Go로 컴파일된 RAT임을 드러내며, 이는 리버싱이 더 어렵고 종종 AV 시그니처를 우회한다. MessagePack 직렬화: *msgpack.*은 압축된 바이너리 C2 메시징을 나타내며, 네트워크 흔적을 줄이고 DPI를 회피한다. 메모리 내 리플렉션: *reflectlite.Type과 *abi.UncommonType은 동적 함수 해석에 사용된다 — 정적 임포트를 피하기 위한 일반적인 회피 기법이다. 은밀한 WebSocket C2: 포트 443을 통한 WebSocket 트래픽은 정상적인 웹 앱에 섞여 네트워크 모니터링에 의한 탐지를 더 어렵게 만든다.

Overlord RAT 프로세스의 Process Hacker 메모리 문자열에서 추출한 덤프된 바이너리 connectstart.bin을 정적 분석을 위해 Binary Ninja에 로드했다. 문자열 뷰는 페이로드에 내장된 완전히 구조화된 키로거 모듈과 명확한 에이전트 명령 네임스페이스(overlord-client/cmd/agent/keylogger.*)를 드러낸다. 이는 Overlord RAT이 키로거가 C2 명령으로 제어되는 전용 하위 시스템인 모듈식 에이전트 아키텍처와 함께 제공됨을 확인한다.
모듈 경로: overlord-client/cmd/agent/keylogger.* – 키로거 에이전트를 위한 명확한 Go 패키지 네임스페이스. (Keylogger).Start/ .Stop – C2 명령으로 키로거를 시작하고 중지한다. (Keylogger).IsRunning – 키로거가 이미 활성 상태인지 확인한다. (Keylogger).captureLoop – 키 입력을 지속적으로 캡처하는 메인 루프. (*Keylogger).logKey – 원시 키 입력 캡처 함수. (Keylogger).getWindowTitle – 활성 창 제목을 가져온다(각 키 입력에 대한 컨텍스트). (Keylogger).flushBuffer / .flushLoop / .FlushNow – 캡처된 키 입력을 디스크나 C2로 주기적으로 플러시한다. (Keylogger).ListFiles / .ReadFile / .DeleteFile / .ClearAll (Keylogger).rotateFile / .cleanupOldLogs – 탐지를 피하기 위한 로그 로테이션 및 정리.
모듈식 에이전트 아키텍처: overlord-client/cmd/agent/ 경로는 깔끔하고 모듈식인 Go 에이전트를 보여준다 — 각 기능(키로거, 화면 캡처, 셸 등)은 별도의 명령 모듈이다. 활성 키로깅: captureLoop, logKey, getWindowTitle은 창 컨텍스트(사용자 이름, 비밀번호, 채팅)와 함께 실시간 키 입력 캡처를 확인한다. 안티 포렌식: rotateFile, cleanupOldLogs, DeleteFile은 로그 축적을 방지하고 포렌식 흔적을 줄인다. ROT13을 통한 회피: rot13 문자열은 캡처된 데이터가 문자열 기반 탐지를 무력화하기 위해 저장/유출 전에 난독화됨을 보여준다. 권한 게이팅: NeedsPermissionGate / RequestPermission은 RAT이 키로거를 활성화하기 전에 환경 조건(UAC, 관리자 권한)을 확인함을 시사한다. 명령 기반 동작: Start/Stop/IsRunning은 키로거가 C2에 의해 원격으로 토글됨을 증명한다 — 자동 실행이 아니므로 탐지 흔적이 줄어든다.

Binary Ninja에서 동일한 connectstart.bin 덤프의 두 번째 문자열 뷰는 Overlord RAT의 브라우저 주입 하위 시스템을 드러낸다. 패키지 경로 overlord-client/cmd/agent/capture.*에는 디버그 권한 활성화, 크래시 모니터링, 브라우저 주입, 브라우저 프로세스 관리를 위한 함수가 포함되어 있다. 이는 Overlord RAT이 키로깅만 하는 것이 아니라 — 자격 증명, 세션, 웹 트래픽을 가로채기 위해 설치된 브라우저에 적극적으로 코드를 주입함을 확인한다.
모듈 경로: overlord-client/cmd/agent/capture.* – 전용 캡처/주입 에이전트. capture.enableDebugPrivilege – 다른 프로세스에 접근하고 주입하기 위해 SeDebugPrivilege를 활성화한다. syscall.(LazyDLL).NewProc – 정적 임포트를 회피하기 위해 Windows API(LazyDLL)를 동적으로 해석한다. capture.StartbackstageBrowserInjected – RAT을 브라우저 프로세스에 주입하는 메인 루틴. StartbackstageBrowserInjected.func1 … func24 – 주입 체인을 지원하는 다수의 헬퍼 함수(24개 이상). capture.CheckInstalledBrowsers – 설치된 브라우저(Chrome, Edge, Firefox, Brave 등)를 열거한다. capture.findBrowserExe – 브라우저 실행 파일 경로를 찾는다.
브라우저 자격 증명 탈취: StartbackstageBrowserInjected는 RAT이 저장된 비밀번호, 쿠키, 활성 세션을 훔치기 위해 브라우저에 주입함을 증명한다. SeDebugPrivilege 악용: enableDebugPrivilege는 주입을 위해 다른 프로세스에 대한 PROCESS_ALL_ACCESS를 얻는 고전적인 기법이다. 동적 API 해석: LazyDLL.NewProc은 런타임에 Windows API 호출을 해석하여 정적 임포트 기반 탐지를 무력화한다. 광범위한 브라우저 지원: CheckInstalledBrowsers + findBrowserExe는 하나가 아닌 여러 브라우저를 지원함을 시사한다. 강제 재주입: isProcessRunning + killProcess는 브라우저가 재시작되면 RAT이 프로세스를 종료하고 재주입할 수 있음을 보여준다. 안정성 및 크래시 방지: monitorProcessCrash와 describeExitCode는 주입된 브라우저가 자주 크래시하지 않도록(의심을 불러일으킬 수 있음) 보장한다.

Binary Ninja에서 connectstart.bin의 추가 문자열 뷰는 Overlord RAT의 주입 엔진을 노출한다. overlord-client/cmd/agent/capture.* 패키지에는 완전한 프로세스 주입 툴킷이 포함되어 있다: 일시 중단된 프로세스 생성, 환경 블록 스푸핑, 리플렉티브 DLL 주입, 브라우저 API 패칭. 이 섹션은 RAT이 단순한 키로거가 아니라 — 완전한 기능을 갖춘 코드 주입 프레임워크임을 증명한다.
capture.createSuspendedProcessOnDesktop – 주입을 위해 대상 프로세스를 일시 중단 상태로 생성한다. capture.buildEnvironmentBlock / .readRawEnvironmentBlock / .appendEnvironmentOverrides – EDR 도구를 오도하기 위해 가짜 환경 블록을 만든다. capture.environmentBlockEntries / capture.isRDIEnvironmentEntry – 환경에서 리플렉티브 DLL 주입(RDI) 마커를 확인한다. capture.injectIntoProcess – 메인 주입 디스패처. capture.stageInjectionDLL – 주입을 위해 페이로드 DLL을 준비한다. capture.loadLibraryInject – 고전적인 LoadLibrary 기반 주입. capture.reflectiveInject / .findReflectiveLoaderOffset / .isBackstageLoaderExport – 페이로드를 전적으로 메모리에서 로드하는 리플렉티브 DLL 주입(디스크 흔적 없음).