Ghidra-Study
지난 시간에 이어서 Window Backdoor 분석을 진행하였다.

아직 분석하지 않은 FUN_00402850함수를 분석해 보자.

먼저 현재 Main문이다. 함수 명은 기능에 맞게 변경하였다.
이제 여기서 분석하지 않은 함수 FUN_00402c10를 분석해보자.


이 함수는 백도의 명령처리기다. C2 서버로부터 받은 명령 코드에 따라 어떤 악성 동작을 수행할지 결정한다.
각 명령 코드별로 어떠한 동작을 하는지 분석하면
| 명령 코드 (Hex) | 호출 함수 | 추정 기능 | 근거 |
|---|---|---|---|
| 0x001 | Sleep | sleep | 프로세스 일시 정지 |
| 0x002 | ExitProcess | 자가 종료 | 프로세스를 즉시 종료함 |
| 0x104 | FUN_00401be0 | 윈도우 제어 | HWND(핸들)를 인자로 받아 특정 창 조작/종료 |
| 0x203 / 0x204 | FUN_00401a20 | 파일/경로 조작 | LPCWSTR 경로를 받아 파일 실행 및 삭제 |
| 0x301 ~ 0x305 | FUN_00402150 등 | 파일 업로드/다운로드 | 문자열 경로와 세션 정보(param_1)를 함께 사용 |
| 0x402 | FUN_004026b0 | 쉘 실행 / 페이로드 주입 | 버퍼 데이터(param_2 + 2)와 크기 인자로 받음 |
| 0x403 | FUN_004025a0 | 시스템 정보 수집 | 인자 없이 호출되는 정보 탈취형 함수 |
위 표와 같다. 이제 함수들을 하나씩 살펴 보자.
명령 코드 0x001

함수를 따라가면 Sleep 함수를 전달받은 파라미터로 호출한다. 1000을 곱하는 것으로 보아 입력은 초 단위인 것을 알 수 있다.
명령코드 0x0101

해당 함수는 감염된 시스템의 드라이브 정보를 수집하여 C2 서버로 전송하는 기능을 수행한다.
공격자가 이 PC에 어떤 하드디스크나 USB가 꽂혀 있고, 용량이 얼마나 남았는지 파악하기 위하여 사용하는 함수다.
명령코드 0x102

해당 함수는 감염된 PC의 로컬 IP 주소 정보를 수집하여 C2 서버로 전송하는 기능을 수행한다.
gethostname API를 호출하여 현재 감염된 PC의 컴퓨터 이름을 가져온다.getaddrinfo를 통해 위에서 얻은 호스트 이름과 연결된 모든 네트워크 주소 리스트를 불러온다.2 (AF_INET, IPv4)이거나 0x17 (AF_INET6, IPv6)인 유효한 IP 데이터만 선별하여 수집한다.WSAAddressToStringW를 사용해 바이너리 형태의 IP 주소를 읽기 쉬운 유니코드 문자열(예: 192.168.0.1)로 변환한다.FUN_004011d0 (realloc 역할)을 호출해 저장 공간을 0x8000 바이트씩 동적으로 늘린다.[주소 체계 코드(4바이트) + IP 문자열] 순서로 데이터를 차곡차곡 쌓아 전송 패킷을 구성한다.communicate_c2 함수를 호출하여 서버로 패킷을 전송한다.0xab3이라는 고유 코드를 사용하여 서버에 로컬 IP 목록임을 알린다.freeaddrinfo)와 메모리(DeallocateMemory)를 모두 해제하여 흔적을 정리한다.명령코드 0x103

이 함수는 시스템에서 활성화된 모든 윈도우 창의 정보를 수집하여 C2 서버로 보고하는 기능을 수행한다.
0x8000 바이트 크기의 버퍼를 할당한다.local_1c)를 EnumWindows 함수의 인자로 전달하여 콜백 함수가 데이터를 기록할 수 있게 한다.EnumWindows API를 통해 현재 시스템의 모든 최상위 윈도우를 순회한다.lpEnumFunc_00401a60 콜백 함수를 호출하여 창 제목 등의 세부 정보를 버퍼에 채운다.0xab2 식별자와 함께 C2 서버로 전송한다.DeallocateMemory)를 해제하여 시스템 리소스를 정리한다.콜백 함수 lpEnumFunc_00401a60를 분석해 보자.

시스템의 모든 윈도우를 하나씩 확인하면서, 사용자가 현재 어떤 창을 띄워놓고 무엇을 하고 있는지 상세 정보를 긁어모으는 역할을 한다.
IsWindowVisible을 호출하여 현재 화면에 실제로 보이고 있는 창을 찾는다.
GetWindowThreadProcessId를 통해 해당 창을 실행중인 프로세스 ID를 가져온다.
GetWindowTextW를 호출하여 웹브라우저 제목, 메신저 대화 상대 이름, 문서 파일명 등이 담긴 창 타이틀을 추출한다.
수집한 정보를 담을 가변 메모리를 생성하고 저장하여 C2서버로 전송한다.
명령코드 0x104

내부 동작한 PostMessageW만 호출하는 것을 볼 수 있다.
PostMessageW는 특정 창의 핸들을 대상으로 메시지를 보낸다. 상수로 들어가 있는 인자를 분석하면 0x10은 WM_CLOSE를 의미한다. 공격자가 틍정 창의 핸들을 알아낸 뒤 이 함수를 호출하여 해당 프로그램 창을 닫는 동작을 수행한다. 첫 번째 인자는 HWND(창의 고유번호)가 된다.
이번 시간에는 공격자가 C2 서버를 통해 실행할 명령어를 보내면 어떻게 동작이 수행되는지 알아 보았다.
디스패처 구조를 통해 공격자가 입력한 명령 코드에 해당하는 명령들이 수행하며, 디스크 정보, IP 정보, 윈도우 정보 등을 얻는 공격을 수행한다.