2016-12-25 2 views
0

J'ai ce morceau de code assembleur x86:compréhension x86 r/instruction M32

mov edx, off_984C400 
mov eax, [edx+1E0h] 
call eax 

Les OpenSecurityTraining-Vidéos m'a appris que [something] meants que le processeur tente d'accéder à la mémoire à la position something. Cela voudrait dire move 0x984C400 into edx, add 0x1E0 to it and call whatever address there is in memory.

Mon problème maintenant est, que j'ai seulement l'analyse statique par IDA disponible et ne sais pas comment je peux savoir quelle adresse est à [0x984C400 + 0x1E0]. Est-il possible d'obtenir l'adresse statique de la fonction?

+1

Le titre pose une question différente du corps. Que ne comprenez-vous pas du mode d'adressage indirect? IDA est généralement très bon pour trouver les cibles indirectes, si elle ne suggère rien, alors probablement que la cible dépend des états du programme et le moyen le plus simple de savoir ce que c'est, se casse juste avant l'appel. Vous pouvez voir tous les renvois à * off_984c400 * et espérer que quelques résultats soient utiles. –

+0

'0x1E0' est 480 ... c'est assez décalé par rapport' off_984C400', donc les références croisées 'off_984C400' peuvent ne pas révéler le code qui prépare l'adresse (si elle est écrite dynamiquement en mémoire à '0x984C5E0' par un autre code). Si vous pouviez déboguer le code, il serait probablement plus facile d'y mettre un point d'arrêt de mémoire-écriture pour voir comment l'adresse est définie (si elle n'est pas statique, alors le breakpoint d'appel suffit pour révéler tout, comme le suggère Margaret). – Ped7g

+0

'Yat-il un moyen d'obtenir l'adresse statique de la fonction?' Improbable. S'il n'y avait qu'une seule destination possible, le code n'utiliserait probablement pas un «appel» indirect en premier lieu. L'exception à cela serait pour les appels de fonction de bibliothèque, où la liaison dynamique est faite avec un niveau d'indirection au lieu de réécrire des codages 'call rel32' dans tout l'exécutable, sur des systèmes d'exploitation typiques. –

Répondre

0

L'explication la plus probable serait que l'adresse en question est soit struct qui a un pointeur de fonction virtuelle (défini ailleurs), ou que c'est un vtable (si c'est C++). Le pointeur est probablement dans le segment de données (vérifiez que vous)

Si c'est un struct avec des fonctions virtuelles, vérifier xref s (et peut-être des adresses autour d'elle)

vtable s sont initialisés dans ctor s de l'adresse , dans ce cas xref ing l'adresse devrait vous rendre à ctor. Quoi qu'il en soit, rappelez-vous que cet appel peut être traduit en plusieurs fonctions possibles.