Pourquoi l'adresse PE ImageBase change-t-elle en mémoire?

Aug 17 2020

J'inverse un exécutable Windows x86 32 bits malveillant. En examinant statiquement les en-têtes PE dans Ghidra, je vois que cela ImageBaseest défini 0x400000comme prévu. Cependant, lorsque le binaire est chargé en mémoire, le RVA initial ne correspond pas à celui ImageBasedéfini dans le fichier. Par exemple, j'ai vu l'adresse de base en mémoire définie sur 0x4B0000et 0x900000. Ce problème se produit sur une machine virtuelle propre et lors du débogage avec Immunity et x32dbg ainsi qu'avec IDA Free.

Je crois comprendre que le chargeur Windows lit ImageBaseet utilise ce décalage pour commencer à mapper des sections dans l'espace d'adressage virtuel. Étant donné que le code système gère le chargement et que mon système est propre lors de la première exécution, je suppose que l'inhabituel ImageBaseest le symptôme d'une nuance de chargeur plutôt que d'une falsification. Je n'ai jamais rencontré ce scénario et j'apprécierais toutes les idées.

MD5: 1f63d04ee95ea041f2f6b1e818d94a7c

SHA1: 823ad6abb05f2393c44cf4b7f1d00e32ac04d1d1


ImageBasedéfini sur 0x400000lors de l'affichage des en-têtes PE dans Ghidra:


ImageBasedans l'en-tête PE mappé en mémoire ( 0x4B0000) ne correspond pas à la valeur ImageBasedéfinie dans le fichier statique:


Sections PE mappées en mémoire avec ImageBaseat0x4B0000

Réponses

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

Ceci est juste une adresse préférée. Windows peut charger le binaire à presque n'importe quelle adresse et le rebaser à ce nouvel emplacement.

ImageBase: L'adresse préférée du premier octet de l'image lors du chargement en mémoire; doit être un multiple de 64 K. La valeur par défaut pour les DLL est 0x10000000. La valeur par défaut pour les EXE Windows CE est 0x00010000. La valeur par défaut pour Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 et Windows Me est 0x00400000.

Source: MSDN