I. Introduction
Le Malware Vawtrak également connu sous le nom de NeverQuest
et Snifula détourne la technologie Heaven's Gate pour basculer de
l'environnement 32bits à l'environnement 64bits.
Il exploite le fait que sur un système d'exploitation
Windows 64 bits, vu que l'ensemble des composants du noyau s'exécute en mode 64
bits que ce soit l'espace d'adressage , les structure essentielles de OS ( PEB
/ TEB / EPROCESS etc.. ). En fait l'ensemble des processus sur ce type d'OS
sont des processus X64.Et il faut voir tous les processus X32 comme des
processus X64 brider et commuté en exécution du code 32 bits.
II. Le loader Windows 64 bits pour les processus 32bits
Le premier bloc de code chargé par le loader Windows en x64
qui aussi appelé en premier dans n'importe quel processus que ce soit un x32 ou
x64 est toujours le ntdll.dll(x64)
c'est ntdll.dll(X64) qui prend en charge l'initialisation du
processus en mode utilisateur et en temps que processus 64 bits. c'est
seulement plus tard que si l'image du binaire de l'exécutable est en x32 qu'il
intégrer l'interface Wow64 ( Windows to Windows) pour lui passer la main pour charge son homologue 32 bits
d'ntdll.dll et commute un segment ou un
flag pour que l'exécution bascule
réellement en 32 bits.
En fait il faut voir cette ntdll.dll 32 bits comme un
proxy vers sa jumelle en 64 bits.
De la un processus x32 ne revient plus en 64 bits. de sorte
que les appels système sont fait au travers de Ntdll 32 bits qui commute du
monde 32 bits vers 64 bits de sorte qu'elle puisse faire l'appel demandé au
système en 64 vers OS windows et au retour rebascule de 64bits en 32bits.
III. Mémoire du processus 32 bits (WOW)
Voici la représentation
mémoire d'un process 32 bits sur un OS windows 64 bits.
IV. Le sélecteur de segment CS (0x33 / 0x23 )
Tous cela repose sur un sélecteur ( d'un segment ) notre sélecteur de segment CS (0x33 / 0x23 ) est le
commutateur pour passer du mode X32(WoW64) au mode 64 bits native dans un
processus. En raison de cette propriété
spéciale, il a été baptisé sous le nom de « Heaven's Gate »
Cette technique "Heaven's Gate" permet dynamiquement de basculer en x64 et
d'effectuer des appel de code 64 bits à partir d'un processus de 32 bits.
V. Intérêt pour les Malwares de "Heaven's Gate"
Cela est utilisé par les malwares
pour d'autre raison par exemple
d'éviter les hooks sur les APIs utilisées dans les logiciel de protection ou de
sortir des sambox.
les malwares utilisent des appels à
des Apis native au lieu des Api standard. De même on peut classer Heaven's
Gate dans la catégorie de
l'obscuration du code car les débogueurs
de code existants ne sont pas les meilleurs voir incapable d'analyser du code 64 bits en exécution à partir d'un
processus de 32 bits. Car celui considère les Opcodes comme étant ce d'un
environnement X32 !
Maintenant rien interdit de faire
l'inverse "Hells's gate" de passer de X64 vers X32 pour bénéficier
des mêmes avantage sur shellcode
VI. Mise en pratique de la technique
Vous aurez toujours 4 dlls inclus dans votre process X32 sur
un OS Windows 64bits. Elles sont Ntdll.dll, wow64.dll , wow64Win.dll et
wow64cpu.dll
Nous avons crée un petit programme pour visualiser les
différents éléments
Ce programme ArchWOW64.exe permet de disposer de l'adresse
du PEB64 et donc d'accéder
au DLL. Nous avons effectué les testes sur Win7(X64) et
Win8(X64) . Nous avons trouver plus d'intérêt à l'OX Win8. Car les adresses des
de Ntdll.dll(X64) ne sont jamais dans espace adressable par un processus
X32
Un process X32 a un espace d'adressage de 0x00000000 à
0xFFFFFFFF qui contient l'image de l'exécutable et des ses DLLs 32bits
Hors les Dlls X64 étant intégré par le loader Windows en 64
bits avant le basculement en processus 32 bits. Elles peuvent et elles sont
souvent dans des plages adresses non accessible par un processus 32 bites en
tous cas pour Win8. Ce que l'on voit bien dans exemple au dessus, notre Dll
Ntdll.dll en 64 bits ce trouve à l'adresse 0x7FF95A130000
Par contre lors des testes sur Win7 l'adresse reste l'espace
d'adressage d'un processus 32bits
En premier pour listes des Dlls via le PEB64, il nous faut
connaître l'adresse du PEB64 de notre process 32 bits. Cette
opération est assez simple pour cela nous utilisons un shellcode dédié
unsigned char ShellCode_AsmGetPebX64[] =
"\x6A\x33" //
PUSH 33h Selector X64
"\xE8\x00\x00\x00\x00" // CALL Next
instruction (Conctruction de l'address start code X64)
"\x83\x04\x24\x05"
// ADD
DWORD PTR [ESP],5
"\xCB" // RETF
"\x65\x48\x8B\x04\x25\x60\x00\x00\x00" // MOV RAX,QWORD
PTR GS:[60h]
"\xE8\x00\x00\x00\x00" // CALL Next
instruction (Conctruction de l'address start code X32)
"\xC7\x44\x24\x04\x23\x00\x00\x00" // MOV DWORD PTR [ESP+4],23h
"\x83\x04\x24\x0D"
// ADD WORD PTR [ESP],0Dh
"\xCB" // RETF
"\xC3"; // RET
|
Pour l'appel rien non plus de très nouveaux
char szMemory[50];
memcpy((PBYTE)&szMemory[0],&ShellCode_AsmGetPebX64,sizeof(ShellCode_AsmGetPebX64));
DWORD dwflOldProtect=0;
VirtualProtect(&szMemory,
sizeof(ShellCode_AsmGetPebX64), PAGE_EXECUTE_READWRITE, &dwflOldProtect);
DWORD dwAddrPEBX64
=(*((DWORD (__stdcall *)(void))&szMemory))();
std::string sDisplay =
"PEB64 pPEB64:0x" + Convert_DWORD64_To_sHex(dwAddrPEBX64) ;
sApi_SetDlgItemText(this->m_hWnd,IDC_ED_REPORT,sDisplay);
|
Maintenant que nous avons l'adresse du pPEB64, nous allons
parcourir les structures LDR_MODULE64 chaîné au travers InLoadOrderModuleList.
Etant dans un environnement 64 bits les offsets sont
différents de ce utilisé dans nos autres exemple 32 bits
Nous avons Zoomé sur les parties PEB64 & PEB_LDR_DATA64
et préciser tous les offsets
Aucun commentaire:
Enregistrer un commentaire