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
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