본문 바로가기

My Study/Malware&Vulnerabilities

CodeEngn Malware Analysis Level5

int Malware_L03(char *StartOfData,char *Output,int SizeOfData)
{
	int encoded=0,i,l=0;
	char Table[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	long buffer,buffer2;
	do
	{
		...
		for(i=3;i>=0;i--,l++)
		{
			buffer2=buffer;
			buffer2 &= 0x3f;
			*(Output + i)=Table[buffer2];
			buffer>>=6;
		}
		Output+=4;
		encoded+=4;
		SizeOfData-=3;
		if(l==76 && SizeOfData>3)
		{
			*Output=0xd;
			Output++;
			*Output=0xa;
			Output++;
			encoded+=2;
			l=0;
		}
		...
		
	}while(SizeOfData!=0);
	return encoded;
}
위 코드가 문제입니다. 
어떠한 일을 하는건지 알아맞추어야하는데 코드를 딱 봐도 어떠한 문자열을 encoding해서 하나의 수를 리턴합니다.
그렇다고 encoding이 답이 아니니 어떠한 encoding방법인지 알아보도록 하겠습니다.
Table에는 총 64개의 문자가 들어있습니다. 이것만 봐도 어떠한 encoding방법인지 필이 오는군요.
그 아래는 0x3F와 &연산을 하고 있는 걸로보아 총 64개의 문자안에서 표현을 하려고 하는 것 같습니다.
그러면 어떠한 encoding방법일까요?? Base64 Encoding입니다.
여기서 그러면 Base64 Encoding방법에 대해서 잠깐 알아보도록 하겠습니다.
Base64는 64진수를 기본으로 정보를 표현하게 됩니다.
그렇기 때문에 2의 6승이 64이므로 최소 6비트를 가지게 됩니다.
그리고 Base64는 24bit를 기준으로 정보를 표현합니다. 그렇기 때문에 24 / 6 = 4로
Base64 Encoding의 길이는 4의 배수의 길이를 가지게 됩니다.
몇가지 예를 적어보겠습니다.
1 = MQ==
123 = MTIz
1234 = MTIzNA==
123456 = MTIzNDU2
1234567 = MTIzNDU2Nw==
위 예를 보시면 아시겠지만 24bit가 기준이므로 3글자까지는 똑같이 4글자로 encoding되지만
4글자부터는 8글자로 encoding되는 것을 알 수 있습니다.
간단하게  Base64 Encoding에 대해서 알아보았습니다.

'My Study > Malware&Vulnerabilities' 카테고리의 다른 글

CodeEngn Malware Analysis Level7  (2) 2010.05.07
CodeEngn Malware Analysis Level6  (0) 2010.05.07
CodeEngn Malware Analysis Level4  (0) 2010.04.28
CodeEngn Malware Analysis Level3  (0) 2010.04.27
CodeEngn Malware Analysis Level2  (0) 2010.04.27