Perché l'indirizzo di PE ImageBase cambia in memoria?

Aug 17 2020

Sto invertendo un eseguibile Windows x86 dannoso a 32 bit. Esaminando staticamente le intestazioni PE in Ghidra, vedo che ImageBaseè impostato 0x400000come previsto. Tuttavia, quando il binario viene caricato in memoria, l'RVA iniziale non corrisponde a quello ImageBasedefinito nel file. Ad esempio, ho visto l'indirizzo di base in memoria impostato su 0x4B0000e 0x900000. Questo comportamento si verifica su una VM pulita e durante il debug con Immunity, x32dbg e IDA Free.

La mia comprensione è che il caricatore di Windows legge ImageBasee utilizza tale offset per iniziare a mappare sezioni nello spazio degli indirizzi virtuali. Poiché il codice di sistema gestisce il caricamento e il mio sistema è pulito alla prima esecuzione, la mia ipotesi è che l'insolito ImageBasesia un sintomo di una sfumatura del caricatore piuttosto che di manomissione. Non ho mai incontrato questo scenario e apprezzerei qualsiasi intuizione.

MD5: 1f63d04ee95ea041f2f6b1e818d94a7c

SHA1: 823ad6abb05f2393c44cf4b7f1d00e32ac04d1d1


ImageBaseimpostato su 0x400000quando si visualizzano le intestazioni PE in Ghidra:


ImageBasenell'intestazione PE mappata in memoria ( 0x4B0000) non corrisponde a quella ImageBaseimpostata nel file statico:


Sezioni PE mappate in memoria con ImageBaseat0x4B0000

Risposte

7 PawełŁukasik Aug 17 2020 at 12:44

Questo è solo un indirizzo preferito. Windows può caricare il file binario in quasi tutti gli indirizzi e ribasarlo in questa nuova posizione.

ImageBase: l'indirizzo preferito del primo byte dell'immagine quando viene caricato in memoria; deve essere un multiplo di 64 K. L'impostazione predefinita per le DLL è 0x10000000. L'impostazione predefinita per gli EXE di Windows CE è 0x00010000. L'impostazione predefinita per Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 e Windows Me è 0x00400000.

Fonte: MSDN