Ghidra Study
이전 포스트에 이어서 Window Backdoor를 Ghidra를 이용하여 분석하였다.
C2(Command and Control)서버는 해커가 감염된 컴퓨터에 명령을 내리고 데이터를 빼내기 위해 사용한다.
Main 함수에서 호출되는 마지막 함수를 분석해 보자.

분석한 내용을 바탕으로 함수 명을 각 기능에 맞게 변경해 주었다.

이 함수의 인자는 config이며, 해당 값을 배열에 저장한다. 이를 다시 인자로 하여 FUN_00402b00함수를 호출한다. 함수의 반환 값으로 다시 함수 2개를 호출한 뒤 대기를 한다. 이제 호출하는 함수들을 다시 살펴보자.

해당 함수 동작은 C2 서버와 연결하기 위해 HTTP 통신 채널을 여는 핵심 루틴이다.
pswzServerName에 복호화한 config에서 서버 주소를 가져온다.
WinHttpOpen을 통해 HTTP 세션을 초기화 한다. 여기서 생성한 핸들은 param_1[1]에 저장된다.
WinHttpConnect 함수를 통해 서버 연결을 시도한다.
이 함수에서 호출하는 FUN_004013a0에 대해서 분석해 보자.

이 함수는 감염된 PC의 신분증을 만두는 함수다. 리버싱 용어로는 Bot ID 생성 루틴이라고 한다.
현재 PC의 이름, 윈도우에 로그인된 사용자 계정명을 가져와 함수 호출 시 인자로 사용한다.
다시 돌아와 FUN_00402c10 함수에서 호출하는 FUN_00402b00함수를 분석하자.

이 함수는 크게 명령 수신과 복호화 두 단계로 나뉜다.
FUN_004018a0을 통해이전에 설정한 HTTP 연결을 통해 C2 서버에 접속하고, 서버가 보낸 암호화된 명령 데이터를 읽어온다.
복호화한 명령어를 인자로 RC4 알고리즘 적용하여 복호화 한다. 이 때 복호화 키는 local_c + 0x102에 위치한 것을 볼 수 있다.
FUN_004018a0함수를 분석해 보자.

이 함수는 다음과 같은 동작을 한다.
1. HTTP 요청 생성 (WinHttpOpenRequest)
2. 헤더 설정 (WinHttpAddRequestHeaders)
3. 보낼 데이터 준비 및 암호화 (do_rc4)
4. 데이터 전송 및 응답 수신 (WinHttpSendRequest)
5. 마무리 (핸들 닫기)
C2서버로 클라이언트 ID, 명령 코드, 데이터 길이를 암호화하여 보낸다.
즉, 공격자가 필요한 정보를 서버로 보고 서버와 통신하기 위하여 존재하는 함수다.
여기에 들어가는 명령 코드로는 대기하고 있거나, 행위(악성)에 대한 보고용 숫자가 들어간다 한다.

FUN_004011b0 함수 디컴파일 결과다. 보면 Heap 할당 해제 즉, free 함수인 것을 알 수 있다.
다시 이전 함수에서 호출하는 FUN_00401710함수를 분석해 보자.

이 함수는 서버에 보낸 요청에 대해 실제 응답 데이터를 수신하는 마무리 단계다.
1. HTTP 응답 상태 확인 (WinHttpReceiveResponse & WinHttpQueryHeaders)
2. 데이터 크기 파악 및 메모리 할당 (allocate_memeory) - 데이터 담을 메모리 할당
3. 실제 데이터 읽기 루프 (WinHttpReadData) - 서버로 부터 루프를 통해 데이터 읽기
앞선 함수에서는 C2서버로 정보를 보냈고, 이 함수에서는 C2서버로 부터 명령을 수신한다.
이전 포스트에서 부터 지금까지의 동작 흐름을 정리해 보면
사전 환경 점검 및 중복 실행 방지 (Survival Check)
프로그램이 실행되자마자 가장 먼저 수행.
뮤텍스 생성: CreateMutexA를 호출하여 특정 고유 이름을 가진 뮤텍스를 생성. 만약 이미 존재한다면, 현재 PC에서 동일한 백도어가 이미 실행 중인 것으로 판단하고 즉시 종료.
감염 여부 확인: 특정 레지스트리 경로를 확인하여 이미 감염된 PC인지, 혹은 자동 실행 설정이 되어 있는지 확인.
설정값 복구 및 환경 준비 (Initialization)
본격적인 활동을 위해 내부에 숨겨진 데이터를 활용.
Config 복호화 (load_config): 데이터 섹션에 암호화되어 저장된 C2 서버 주소, 포트, 통신 경로 등을 RC4 알고리즘으로 복호화.
클라이언트 고유 ID 생성 (generate_client_id): GetComputerNameA(PC 이름)와 GetUserNameA(사용자명)를 수집하고 이를 조합/해싱하여 이 PC를 식별할 고유 번호 생성.
C2 서버 연결 수립 (Network Connection)
공격자의 명령 서버(C2)에 접속을 시도.
WinHTTP 초기화: WinHttpOpen을 통해 HTTP 통신을 위한 세션 열기.
서버 연결 (ConnectToC2Server): 복호화된 설정값에서 주소와 포트를 가져와 WinHttpConnect로 서버와 통신 채널을 연결.
명령 수신 및 복호화 (Command Fetching)
서버로부터 공격자의 의도를 전달받음.
POST 요청 전송 (HttpReceiveData): 자신의 ID를 포함한 데이터를 RC4로 암호화하여 서버에 전송.
응답 패킷 수신 (HttpReadResponse): 서버가 보낸 암호화된 명령어 데이터를 메모리에 할당.
명령 복호화 (ReceiveAndDecryptCommand): 받아온 데이터를 다시 RC4로 풀어내어 실제 수행할 명령을 얻음.
명령 실행 및 무한 루프 (Execution Loop)
공격자의 명령을 수행하고 다음 명령 대기.
명령 수행 (ExecuteCommand): 복호화된 명령 코드에 따라 파일 탈취, 쉘 실행 등의 악성 행위를 수행. (분석 예정)
비컨 주기 대기 (Sleep): Config에 정의된 시간 동안 잠시 멈췄다가, 다시 3단계(명령 수신)부터 반복.