dimanche 14 mai 2017

Shellcode en X64 "MessageBoxA"

Nous allons utiliser les mêmes techniques que sous X32 en portant les fonctions en X64

Disposer d'une fonction pour obtenir le HMODULE sur Kernel32.dll
cela grâce à une GetKernel32(..) en X64 que l'on nommera GetKernel32InX64
pour la partie API obtention des APIs qui nous serons utile
nous utiliserons des HASH et la fonction GetProcAddressByHashROR13Additive(..) en X64
Que l'on nommera  GetProcAddressByHashROR13AdditiveInX64V1

le pseudo code du shellcode sera

// Obtention du HMODULE de kernel32.dll
RAX = GetKernel32InX64(void)
// Obtention de la fonction "LoadLibraryA"
RAX = GetProcAddressByHashROR13AdditiveX64(RAX,0xEC0E4E8E )
// Appeler la fonction charger "user32.dll" et obtenir son HMODULE
RAX = LoadLibraryA("user32.dll")
// Obtenir la fonction "MessageBoxA"
RAX = GetProcAddressByHashROR13AdditiveInX64V1(RAX,0xBC4DA2A8 )
// Enfin appeler la fonction
// MessageBoxA(NULL,">X64 Sample: MessageBoxA<","<9B113D1A>",MB_OK);

Pour cela nous avons besoin d'une fonction HMODULE GetKernel32InX64(void) en X64

Dont voici le code assemble en X64 ( Intel )

PUSH RSI
PUSH RDI
PUSH RBX
XOR RBX,RBX
PUSH 30h
POP RAX
MOV RSI,QWORD PTR gs:[RAX]
MOV RAX,QWORD PTR[RSI+60h]
MOV RAX,QWORD PTR[RAX+18h]
MOV RSI,qword ptr [RAX+10h]
NextModule:
MOV RDI,QWORD PTR[RSI+60h]
MOV RAX,QWORD PTR[RSI+30h]
MOV RSI,[RSI]
CMP BYTE PTR[RDI+18h], BL
JNZ NextModule
POP RBX
POP RDI
POP RSI
RET

Pour la fonction

DWORD64 GetProcAddressByHashROR13AdditiveInX64V1(HMODULE hMod,
                                                                                                              DWORD dwHash);

Nous expliquerons dans un autre article comment la crée, mais étant un peut longue l'intérêt assez limité. Pour le principe, elle a été généré à partir d'un code C via Microsoft Visual Studio qui est une technique très utilisé pour générer des bloques de Shellcode dans le monde Windows.

Nous avons mis le shellcode résultant globale dans un tableau en C avec des couleurs pour vous permettre de bien distinguer les différents blocs du Shellcode X64

unsigned char MessageBox64bitV1_sc[] =
"\x48\x83\xEC\x28"
"\x48\x83\xE4\xF0"
"\xE8\xE9\x01\x00\x00"
"\xBA\x8E\x4E\x0E\xEC"
"\x48\x89\xC1"
"\xE8\x68\x00\x00\x00"
"\xEB\x27"
"\x59"
"\xFF\xD0"
"\xBA\xA8\xA2\x4D\xBC"
"\x48\x89\xC1"
"\xE8\x56\x00\x00\x00"
"\x48\x89\xC3"
"\x4D\x31\xC9"
"\xEB\x1F"
"\x41\x58"
"\xEB\x3A"
"\x5A"
"\x48\x31\xC9"
"\xFF\xD3"
"\x48\x83\xC4\x28"
"\xC3"
"\xE8\xD4\xFF\xFF\xFF"
"\x75\x73\x65\x72\x33\x32\x2E\x64\x6C\x6C\x00"
"\xE8\xDC\xFF\xFF\xFF"
"\x3E\x58\x36\x34\x20\x53\x61\x6D\x70\x6C\x65\x3A\x20\x4D\x65\x73"
"\x73\x61\x67\x65\x42\x6F\x78\x41\x3C\x00"
"\xE8\xC1\xFF\xFF\xFF"
"\x3C\x39\x42\x31\x31\x33\x44\x31\x41\x3E\x00"
"\x89\x54\x24\x10\x48\x89\x4C\x24\x08\x48\x83\xEC\x68\x48\xC7\x44"
"\x24\x18\x00\x00\x00\x00\x48\x8B\x44\x24\x70\x48\x89\x44\x24\x08"
"\x48\x8B\x44\x24\x08\x48\x63\x48\x3C\x48\x8B\x44\x24\x08\x48\x03"
"\xC1\x48\x89\x04\x24\x48\x8B\x04\x24\x48\x05\x88\x00\x00\x00\x48"
"\x89\x44\x24\x10\x48\x8B\x44\x24\x10\x83\x38\x00\x0F\x84\x18\x01"
"\x00\x00\x48\x8B\x44\x24\x10\x8B\x08\x48\x8B\x44\x24\x08\x48\x03"
"\xC1\x48\x89\x44\x24\x20\x48\x8B\x44\x24\x20\x8B\x48\x20\x48\x8B"
"\x44\x24\x08\x48\x03\xC1\x48\x89\x44\x24\x30\x48\x8B\x44\x24\x20"
"\x8B\x48\x24\x48\x8B\x44\x24\x08\x48\x03\xC1\x48\x89\x44\x24\x28"
"\x48\x8B\x44\x24\x20\x8B\x48\x1C\x48\x8B\x44\x24\x08\x48\x03\xC1"
"\x48\x89\x44\x24\x38\xC7\x44\x24\x40\x00\x00\x00\x00\xEB\x0B\x8B"
"\x44\x24\x40\x83\xC0\x01\x89\x44\x24\x40\x48\x8B\x44\x24\x20\x8B"
"\x40\x18\x39\x44\x24\x40\x0F\x83\x9E\x00\x00\x00\x8B\x4C\x24\x40"
"\x48\x8B\x44\x24\x30\x8B\x0C\x88\x48\x8B\x44\x24\x08\x48\x03\xC1"
"\x48\x89\x44\x24\x48\xC7\x44\x24\x50\x00\x00\x00\x00\x48\x8B\x44"
"\x24\x48\x0F\xBE\x00\x85\xC0\x74\x3E\x48\x8B\x44\x24\x48\x0F\xBE"
"\x00\x89\x44\x24\x54\x48\x8B\x44\x24\x48\x48\x83\xC0\x01\x48\x89"
"\x44\x24\x48\x8B\x44\x24\x50\xC1\xE8\x0D\x8B\x4C\x24\x50\xC1\xE1"
"\x13\x0B\xC1\x89\x44\x24\x50\x8B\x4C\x24\x54\x8B\x44\x24\x50\x03"
"\xC1\x89\x44\x24\x50\xEB\xB6\x8B\x44\x24\x78\x39\x44\x24\x50\x75"
"\x24\x8B\x4C\x24\x40\x48\x8B\x44\x24\x28\x0F\xB7\x0C\x48\x48\x8B"
"\x44\x24\x38\x8B\x0C\x88\x48\x8B\x44\x24\x08\x48\x03\xC1\x48\x89"
"\x44\x24\x18\xEB\x05\xE9\x45\xFF\xFF\xFF\x48\x8B\x44\x24\x18\x48"
"\x83\xC4\x68\xC3"
"\x56\x57\x53\x48\x33\xDB\x6A\x30\x58\x65\x48\x8B\x30\x48\x8B\x46"
"\x60\x48\x8B\x40\x18\x48\x8B\x70\x10\x48\x8B\x7E\x60\x48\x8B\x46"
"\x30\x48\x8B\x36\x38\x5F\x18\x75\xF0\x5B\x5F\x5E\xC3";


 Nous avons passer dans un outil pour vous faire sortir les blocs de couleur

Pour le test du shellcode X64


Créer à partir de visual studio un projet "StarterShellcodeX64_MessageBoxA"

New Project\Win32 - Projet Win32 ( Projet Vide )

Puis ajouter un fichier code .cpp nommé "StarterShellcodeX64_MessageBoxA.cpp"

et copier le code dans le fichier

 

#define WIN32_LEAN_AND_MEAN             // Exclure les en-têtes Windows rarement utilisés
// Fichiers d'en-tête Windows :
#include <windows.h>

// Fichiers d'en-tête C RunTime
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
                unsigned char MessageBox64bitV1_sc[] =
                "\x48\x83\xEC\x28"
                "\x48\x83\xE4\xF0"
                "\xE8\xE9\x01\x00\x00"
                "\xBA\x8E\x4E\x0E\xEC"
                "\x48\x89\xC1"
                "\xE8\x68\x00\x00\x00"
                "\xEB\x27"
                "\x59"
                "\xFF\xD0"
                "\xBA\xA8\xA2\x4D\xBC"
                "\x48\x89\xC1"
                "\xE8\x56\x00\x00\x00"
                "\x48\x89\xC3"
                "\x4D\x31\xC9"
                "\xEB\x1F"
                "\x41\x58"
                "\xEB\x3A"
                "\x5A"
                "\x48\x31\xC9"
                "\xFF\xD3"
                "\x48\x83\xC4\x28"
                "\xC3"
                "\xE8\xD4\xFF\xFF\xFF"
                "\x75\x73\x65\x72\x33\x32\x2E\x64\x6C\x6C\x00"
                "\xE8\xDC\xFF\xFF\xFF"
                "\x3E\x58\x36\x34\x20\x53\x61\x6D\x70\x6C\x65\x3A\x20\x4D\x65\x73\x73\x61\x67\x65\x42\x6F\x78\x41\x3C\x00"
                "\xE8\xC1\xFF\xFF\xFF"
                "\x3C\x39\x42\x31\x31\x33\x44\x31\x41\x3E\x00"
                "\x89\x54\x24\x10\x48\x89\x4C\x24\x08\x48\x83\xEC\x68\x48\xC7\x44"
                "\x24\x18\x00\x00\x00\x00\x48\x8B\x44\x24\x70\x48\x89\x44\x24\x08"
                "\x48\x8B\x44\x24\x08\x48\x63\x48\x3C\x48\x8B\x44\x24\x08\x48\x03"
                "\xC1\x48\x89\x04\x24\x48\x8B\x04\x24\x48\x05\x88\x00\x00\x00\x48"
                "\x89\x44\x24\x10\x48\x8B\x44\x24\x10\x83\x38\x00\x0F\x84\x18\x01"
                "\x00\x00\x48\x8B\x44\x24\x10\x8B\x08\x48\x8B\x44\x24\x08\x48\x03"
                "\xC1\x48\x89\x44\x24\x20\x48\x8B\x44\x24\x20\x8B\x48\x20\x48\x8B"
                "\x44\x24\x08\x48\x03\xC1\x48\x89\x44\x24\x30\x48\x8B\x44\x24\x20"
                "\x8B\x48\x24\x48\x8B\x44\x24\x08\x48\x03\xC1\x48\x89\x44\x24\x28"
                "\x48\x8B\x44\x24\x20\x8B\x48\x1C\x48\x8B\x44\x24\x08\x48\x03\xC1"
                "\x48\x89\x44\x24\x38\xC7\x44\x24\x40\x00\x00\x00\x00\xEB\x0B\x8B"
                "\x44\x24\x40\x83\xC0\x01\x89\x44\x24\x40\x48\x8B\x44\x24\x20\x8B"
                "\x40\x18\x39\x44\x24\x40\x0F\x83\x9E\x00\x00\x00\x8B\x4C\x24\x40"
                "\x48\x8B\x44\x24\x30\x8B\x0C\x88\x48\x8B\x44\x24\x08\x48\x03\xC1"
                "\x48\x89\x44\x24\x48\xC7\x44\x24\x50\x00\x00\x00\x00\x48\x8B\x44"
                "\x24\x48\x0F\xBE\x00\x85\xC0\x74\x3E\x48\x8B\x44\x24\x48\x0F\xBE"
                "\x00\x89\x44\x24\x54\x48\x8B\x44\x24\x48\x48\x83\xC0\x01\x48\x89"
                "\x44\x24\x48\x8B\x44\x24\x50\xC1\xE8\x0D\x8B\x4C\x24\x50\xC1\xE1"
                "\x13\x0B\xC1\x89\x44\x24\x50\x8B\x4C\x24\x54\x8B\x44\x24\x50\x03"
                "\xC1\x89\x44\x24\x50\xEB\xB6\x8B\x44\x24\x78\x39\x44\x24\x50\x75"
                "\x24\x8B\x4C\x24\x40\x48\x8B\x44\x24\x28\x0F\xB7\x0C\x48\x48\x8B"
                "\x44\x24\x38\x8B\x0C\x88\x48\x8B\x44\x24\x08\x48\x03\xC1\x48\x89"
                "\x44\x24\x18\xEB\x05\xE9\x45\xFF\xFF\xFF\x48\x8B\x44\x24\x18\x48"
                "\x83\xC4\x68\xC3"
                "\x56\x57\x53\x48\x33\xDB\x6A\x30\x58\x65\x48\x8B\x30\x48\x8B\x46"
                "\x60\x48\x8B\x40\x18\x48\x8B\x70\x10\x48\x8B\x7E\x60\x48\x8B\x46"
                "\x30\x48\x8B\x36\x38\x5F\x18\x75\xF0\x5B\x5F\x5E\xC3";

                int len = sizeof(MessageBox64bitV1_sc);

                void *pvBuffer;
                pvBuffer = malloc(len);

                memcpy(pvBuffer,(void*)&(MessageBox64bitV1_sc[0]),len);

                DWORD oldProtect;
                if (VirtualProtect(pvBuffer, len, PAGE_EXECUTE_READWRITE, &oldProtect))
                {
                               (*((int (__stdcall *)(void))pvBuffer))();
                }       

                return 0;
}

 Vous devriez avoir une vue comme celle en dessous , configurer la compilation en X64


Suite à la compilation, vous aurez un executable X64 avec votre shellcode MessageBoxA


 

 


Aucun commentaire:

Enregistrer un commentaire