IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Demande d'explications, code simple


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut Demande d'explications, code simple
    Bonjour,

    J'ai un petit travail à faire pour expliquer ce code et j'ai besoin d'aide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    00520600  push		 ebp  				;Push contents of ebp to the stack
    00520601  mov         	ebp,esp 			; ebp=esp
    00520603  mov         	dword ptr [pointer],80706050h 	; pointer=80706050h
    0052060A  push        	ebx  				;Push contents of ebx to the stack
    0052060B  push        	1    				;Push 1 to the stack
    0052060D  call        	foobar (0x005100F2h) 
    00520612  add         	esp,4 				; esp=esp+4
    00520615  mov         	ebx,dword ptr [pointer] 	; ebx=pointer
    00520618  mov         	dword ptr [ebx],eax 		; the value pointed by ebx = eax
    ...
    Que fait ce code?
    Expliquer ce qu'il y a de faux dans ce code qui va causer un plantage.
    Quelle est la convention utilisée– stdcall, cdecl, fastcall ou thiscall?

    Donc j'ai rajouté les commentaires.
    J'ai un peu de mal à voir le but général.
    Je pense que le problème vient du fait qu'on essaye en quelque sorte de passer un argument à la fonction foobar alors que ce n'est pas la syntaxe.
    Je pense que c'est la convention cdecl car la pile est nettoyé après.

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Mise en place du cadre de pile (stack frame). c'est un prologue de fonction classique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    00520600  push		 ebp  				; function prologue - set up stack frame (save base pointer)
    00520601  mov         	ebp,esp 			; function prologue (set esp as current base pointer)
    On met la valeur 0x80706050 quelque part en mémoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    00520603  mov         	dword ptr [pointer],80706050h 	; pointer=80706050h
    On sauvegarde EBX. Le piège à éviter: EBX n'est pas un argument de foobar!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    0052060A  push        	ebx  				; save ebx register on stack
    Appelle foobar(). La fonction prend un seul argument, qui est la valeur 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    0052060B  push        	1    				;Push 1 to the stack
    0052060D  call        	foobar (0x005100F2h)
    foobar() est a une convention d'appel de type cdecl. Ca nous est donné par le "add esp,4", qui "nettoie" 1 seul paramètre (d'où le fait qu'EBX ne puisse être un paramètre de foobar()).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    00520612  add         	esp,4 				; caller cleanup
    Récupère la valeur 0x80706050 depuis la mémoire (depuis pointer). EBX vaut donc 0x80706050.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    00520615  mov         	ebx,dword ptr [pointer] 	; ebx=0x80607050
    Met le retour de la fonction foobar(), situé dans EAX, à l'adresse pointée par EBX (0x80706050). Dit autrement: le code tente de mettre la valeur de EAX à l'adresse 0x80706050.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    00520618  mov         	dword ptr [ebx],eax 		; set eax into [0x80706050]
    Expliquer ce qu'il y a de faux dans ce code qui va causer un plantage.
    L'adresse 0x80706050 n'est pas atteignable pour un processus en mode utilisateur sous Windows. La ligne 0x00520618 va lever une exception de type ACCESS_VIOLATION en écriture. Ceci dit, sous Linux où l'espace d'adressage est morcelé différemment, cette réponse n'est pas valide.

    Autre hypothèse: La fonction foobar() prend réellement deux arguments en entrée, mais pour une raison x ou y, l'appelant (caller) ne nettoie qu'un seul paramètre ("add esp, 4"). Du coup, en épilogue de fonction, le stack frame est faussé et on retourne (au moment du RET donc) sur une adresse arbitraire.

    Sincèrement - et il est tout à fait possible que je me trompe - je ne vois pas d'autre point qui poserait un réel problème avec le code donné.

    Quelle est la convention utilisée– stdcall, cdecl, fastcall ou thiscall?
    Pour foobar() c'est du cdecl. Pour l'appelant (la partie de code examinée), c'est difficile à déterminer, il faudrait voir l'épilogue de fonction.

    Je pense que le problème vient du fait qu'on essaye en quelque sorte de passer un argument à la fonction foobar alors que ce n'est pas la syntaxe.
    Je ne comprends pas très bien ta réponse, désolé. Pourrais-tu l'expliciter un peu plus ?

    Je pense que c'est la convention cdecl car la pile est nettoyé après.
    Ouep

    P.S: Au cas où, l'article sur les conventions d'appel x86 sur Wiki (en) est bien fichu: http://en.wikipedia.org/wiki/X86_calling_conventions

  3. #3
    Membre régulier Avatar de Chacha35
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 264
    Points : 114
    Points
    114
    Par défaut
    Merci beaucoup pour tes explications.

    En effet, je pense que tu as raison pour le problème. Le nombre est trop grand pour tenir dans un dword.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. demande d'explication sur un code
    Par Zilfi63 dans le forum VBA Access
    Réponses: 4
    Dernier message: 08/06/2009, 18h05
  2. demande d'explication sur du code
    Par olaxius dans le forum wxPython
    Réponses: 2
    Dernier message: 17/01/2008, 09h40
  3. demande d'explication de code
    Par fox1976 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/09/2006, 23h34
  4. utilisation de code barre - demande d'explication
    Par cortex024 dans le forum Windows
    Réponses: 15
    Dernier message: 16/02/2006, 17h37
  5. Explication de code simple
    Par Clad3 dans le forum OpenGL
    Réponses: 3
    Dernier message: 20/03/2005, 12h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo