ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ASM --> C --> IDA Python Script
    tip 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 


    그럼 도움이 되셨길...

Designed by Tistory.