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!
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
@Kierchon: Oui, 'buf' est à' (% esp) 'et' arg' à '4 (% esp)'. – caf