2015-04-22 1 views
1

J'ai cette fonction simple C:code x86 expliqué pour petit programme c

void vulnerable(char *arg){ 
    char buf[100]; 
    strcpy(buf, arg); 
} 

Quand je démonte dans GDB je reçois ceci:

0x08048ee0 <+0>: push %ebp 
0x08048ee1 <+1>: mov %esp,%ebp 
0x08048ee3 <+3>: sub $0x88,%esp 
=> 0x08048ee9 <+9>: mov 0x8(%ebp),%eax 
0x08048eec <+12>: mov %eax,0x4(%esp) 
0x08048ef0 <+16>: lea -0x6c(%ebp),%eax 
0x08048ef3 <+19>: mov %eax,(%esp) 
0x08048ef6 <+22>: call 0x8048200 
0x08048efb <+27>: leave 
0x08048efc <+28>: ret 

Je ne comprends pas vraiment ces lignes.

0x08048ee3 <+3>: sub $0x88,%esp #why is 136 bytes being subtracted? Buf is only 100 
0x08048ee9 <+9>: mov 0x8(%ebp),%eax #I didnt think anything was in eax to move to ebp 
0x08048eec <+12>: mov %eax,0x4(%esp) #whats being moved here 
0x08048ef0 <+16>: lea -0x6c(%ebp),#eax #loading from the stack to ebp? 
0x08048ef3 <+19>: mov %eax,(%esp) # now back to eax? 

Et je veux connaître l'adresse de buf. Quand j'essaye p &buf il revient avec une adresse mais c'est vide même si je casse après la ligne d'appel. Est-ce que quelqu'un peut m'aider à mieux comprendre le code? Merci!

Répondre

3
0x08048ee3 <+3>: sub $0x88,%esp #why is 136 bytes being subtracted? Buf is only 100 

buf est à seulement 100 octets, mais il y a aussi l'espace nécessaire sur la pile pour les deux arguments à strcpy() - 4 octets, de sorte que 108 octets est. Ajoutez 4 octets supplémentaires pour aligner le pointeur de la pile 8 octets et vous obtenez 112. C'est encore loin des 136 octets réellement alloués par le compilateur - probablement le compilateur a alloué de l'espace de pile pour certains temporaires et/ou des registres de sauvegarde, puis optimisé les temporaires réels et enregistrer les déversements.

0x08048ee9 <+9>: mov 0x8(%ebp),%eax #I didnt think anything was in eax to move to ebp 

C'est AT & syntaxe T, qui a la source suivie par destination. Donc, cela se déplace 0x8(%ebp), qui est la valeur du premier argument de la fonction arg, à %eax.

0x08048eec <+12>: mov %eax,0x4(%esp) #whats being moved here 

La valeur de arg est ensuite copié sur la pile, le second argument de strcpy().

0x08048ef0 <+16>: lea -0x6c(%ebp),%eax #loading from the stack to ebp? 

lea est l'adresse de chargement efficace. Cela charge l'adresse de -0x6c(%ebp), qui est le tableau local buf, en .

0x08048ef3 <+19>: mov %eax,(%esp) # now back to eax? 

L'adresse de buf est copiée à partir de la %eax à la pile, le premier argument de strcpy().

+0

Génial merci !! Une question rapide. Quand je fais 'x/2wx $ esp' il imprime deux adresses. Je suppose que le second mot est arg et le premier est buf. Est-ce correct car buf est ajouté à la pile en second lieu. @caf – Kierchon

+0

@Kierchon: Oui, 'buf' est à' (% esp) 'et' arg' à '4 (% esp)'. – caf