tip

ASM --> C --> IDA Python Script

Forensist 2011. 2. 7. 11:14

오늘 본 샘플 중에 아래와 같은 코드가 있었다. 악성코드들이 사용하는 문자열을 strings.exe 와 bintext.exe 와 같은 툴에 노출되는 것을 꺼려하여 문자열에 꼬아놓는 경우가 있는데, 이번에는 문자열 중간에 알파벳이 아닌 문자열을 삽입해 놓고 사용하기 전에 아래와 같은 함수를 호출하여 제거하는 것이다.








[그림] DecodeStr 함수를 사용하는 코드


DecodeStr() 함수를 리버싱 해보면 아래와 같고 그것을 C 언어로 표기해보고 IDAPython 스크립트를 사용하여 IDA 에서 꼬인 문자열을 보기 쉽게 출력하였다.

B9D0 ; int __cdecl DecodeStr(char *pLib, char *pFunc)
B9D0 LibFileName     = byte ptr -80h
B9D0 String2         = byte ptr -40h
B9D0                 sub     esp, 80h
B9D6                 mov     ecx, 10h
B9DB                 xor     eax, eax
B9DD                 push    ebx
B9DE                 push    ebp
B9DF                 push    esi
B9E0                 mov     esi, [esp+8Ch+pLib]
B9E7                 push    edi
B9E8                 lea     edi, [esp+90h+LibFileName]
B9EC                 rep stosd
B9EE                 mov     ebp, ds:isdigit
B9F4                 mov     ecx, 10h
B9F9                 lea     edi, [esp+90h+String2]
B9FD                 rep stosd
B9FF                 cmp     byte ptr [esi], 0
BA02                 jz      short locBA38
BA04                 lea     edi, [esp+90h+LibFileName]
BA08
BA08 locBA08:                         ; CODE XREF: DecodeStr+66j
BA08                 movsx   eax, byte ptr [esi]
BA0B                 push    eax
BA0C                 call    ebp ; isdigit
BA0E                 add     esp, 4
BA11                 test    eax, eax
BA13                 jnz     short locBA2B
BA15                 movsx   ecx, byte ptr [esi]
BA18                 push    ecx
BA19                 call    ds:isalpha
BA1F                 add     esp, 4
BA22                 test    eax, eax
BA24                 jnz     short locBA2B
BA26                 cmp     byte ptr [esi], 2Eh
BA29                 jnz     short locBA30
BA2B
BA2B locBA2B:                         ; CODE XREF: DecodeStr+43j
BA2B                 mov     dl, [esi]
BA2D                 mov     [edi], dl
BA2F                 inc     edi
BA30
BA30 locBA30:                         ; CODE XREF: DecodeStr+59j
BA30                 mov     al, [esi+1]
BA33                 inc     esi
BA34                 test    al, al
BA36                 jnz     short locBA08
BA38

위와 같은 어셈코드를 C 언어로 만들어 보면 다음과 같다.

int DecodeStr(char *pLib, char *pFunc)
{
	char szTemp[0x40];
	int i=0; j=0;
	char ch;

	memset(szTempp, 0x00, 0x40);

	while( (ch=pLib[i++]) != NULL )
	{
		if (isdigit(ch) || isalpha(ch) || ch == 0x2E)
			szTemp[j++] = ch;
	} 
	// ...	
}

위와 같은 C 언어를 IDAPython 스크립트 언어로 사용하기 위해서는 아래와 같은 코드를 사용하면 될 것 같다.

ea = ScreenEA()
str = ""
while True:
   b = Byte(ea)
   if b == 0:
      break;
   if b==0x2E or (b>=65 and b<=90) or (b>=97 and b<=122):
      str += chr(b)
   ea += 1
print str 


그럼 도움이 되셨길...