2011-04-19 2 views
0

J'essaye de désosser un binaire désassemblé. Je ne comprends pas ce qu'il fait quand il fait un appel comme:Que se passe-t-il lorsque vous insérez une adresse de mémoire dans l'assemblage?

pousser $ 0x804a254

Ce qui rend encore plus déroutant est que cette adresse n'est pas et l'adresse d'une instruction ni dans la table de symbole. Qu'est-ce que ça fait?

+2

Il pousse une sorte de nombre de 32 bits sur la pile. Sans une sorte de contexte, il est complètement impossible de dire quoi que ce soit d'autre. –

+0

Oui, postez une pièce du démontage, pas une seule instruction. –

Répondre

2

Ceci est l'un des 3 cas: soit une constante (hash, nombre, bitflags ou adresse typée), soit l'adresse d'une variable ou d'un tampon (y compris les littéraux) allouée statiquement à n'importe quelle portée ou un opérande mal analysé (en raison d'un cryptage/dièdre). Sa véritable signification est relative à son utilisation (que ce soit un argument d'appel ou une méthode indirecte de définition d'un mem/reg).

1

La valeur que vous voyez ici n'est pas dans une table ni dans une instruction car c'est une variable locale. (Variables locales à ne pas maintenir un nom associé à une table de symboles, car ils ne sont « en vie » alors que vous êtes dans une méthode spécifique) L'adresse équivaut à quelque chose comme

void somefunc() 
{ 
    int t; //t may have address 0x804a254 since this is a local variable. 
} 

Pour variable locale mémoire correctement libre sont alloués sur la pile du système au lieu d'ailleurs en mémoire. ils sont poussés lorsque la fonction est créée et désactivée lorsque la fonction revient, c'est ce que vous voyez.

+0

Les variables de fonction locales ne sont-elles pas référencées en utilisant esp (ou ebp) à la place sur x86? Je pense que 0x804a254 pourrait être plutôt une adresse de variable globale ou une constante qui est plus tard sortie ... –

+0

Les variables locales sont adressées par rapport au pointeur de la pile (par exemple ebp ou esp), pas par l'adresse absolue. Donc je doute que c'est ce qui se passe ici. –

+0

Donc, est-ce une variable globale parce qu'ils n'ont pas simplement poussé 0x4 ou% eax ou quelque chose? Si c'est le cas, il ne serait pas logique de le rendre global s'il n'est plus jamais référencé. En outre, que signifie jmp * 0x804b0fc lorsque cette adresse n'est pas référencée ailleurs dans la table de désassemblage ou de symboles? – Gabe

1

Cette instruction pousse simplement la constante 32 bits (0x804a254) dans la pile.

Cette instruction seule ne suffit pas pour nous de dire comment elle est utilisée plus tard. Pourriez-vous fournir plus de désassemblage du code? Surtout, je voudrais voir où cette valeur est sortie, et comment cette valeur est utilisée plus tard. Avant de commencer toute ingénierie inverse, je recommande de lire ce manuel (Reverse Engineering secrets) puis le manuel du jeu d'instructions X86 (Intel ou AMD). Je suppose que vous êtes Reverse Engineering pour le processeur x86.

Questions connexes