Je mène des recherches déversoirs tampons (sur l'architecture IA32) et je voudrais préciser une chose en particulier avec cet exemple programme:Stack Overflow - Tampon emplacement en mémoire
int main(int argc, char **argv) {
char array[512];
if(argc > 1)
strcpy(array, argv[1]);
}
Je suivais le ebp, inscrivez-vous esp changement au cours de l'exécution du code d'assemblage: Dump de code assembleur pour fonction principale:
0x080483c4 <+0>: push ebp
0x080483c5 <+1>: mov ebp,esp
0x080483c7 <+3>: sub esp,0x208
0x080483cd <+9>: cmp DWORD PTR [ebp+0x8],0x1
0x080483d1 <+13>: jle 0x80483ed <main+41>
0x080483d3 <+15>: mov eax,DWORD PTR [ebp+0xc]
0x080483d6 <+18>: add eax,0x4
0x080483d9 <+21>: mov eax,DWORD PTR [eax]
0x080483db <+23>: mov DWORD PTR [esp+0x4],eax
0x080483df <+27>: lea eax,[ebp-0x200]
0x080483e5 <+33>: mov DWORD PTR [esp],eax
0x080483e8 <+36>: call 0x80482f4 <[email protected]>
0x080483ed <+41>: leave
0x080483ee <+42>: ret
l'esp, les valeurs de registre ebp étaient les suivants:
program start
esp: 0xbffff24c
ebp: 0xbffff2c8
push ebp
esp: 0xbffff248
ebp: 0xbffff2c8
mov ebp,esp
esp: 0xbffff248
ebp: 0xbffff248
sub esp,0x208
esp: 0xbffff040
ebp: 0xbffff248
strcpy call (ebp is overwritten)
esp: 0xbffff250
ebp: 0x41414141
lorsque j'ai entré 520 caractères «a», ce qui a entraîné EBP, EIP survolé. Et la mémoire ressemble à ceci:
Lower Memory Addresses
0xbffff070: 0xbffff078 0xbffff492 0xaaaaaaaa 0xaaaaaaaa
0xbffff080: 0xaaaaaaaa 0xaaaaaaaa 0xaaaaaaaa 0xaaaaaaaa
0xbffff090: 0xaaaaaaaa 0xaaaaaaaa 0xaaaaaaaa 0xaaaaaaaa
0xbffff0a0: 0xaaaaaaaa 0xaaaaaaaa 0xaaaaaaaa 0xaaaaaaaa
0xbffff0b0: 0xaaaaaaaa 0xaaaaaaaa 0xaaaaaaaa 0xaaaaaaaa
...
0xbffff270: 0xaaaaaaaa 0xaaaaaaaa 0xaaaaaaaa 0xaaaaaaaa
Higher Memory Addresses
La chose qui me intéresse est: Pourquoi tampon commence à l'adresse 0xbffff078, si l'ESP pointe à l'adresse 0xbffff040 (lorsque la place variable locale - tampon - est réservé sur la empiler). Le tampon aurait dû être enregistré à l'adresse 0xbffff040. Quelqu'un peut-il expliquer pourquoi ce n'est pas?
Comment vos caractères ''a'' se sont-ils transformés en' 0xaaaaaaaa'? Est-ce que vous nous montrez le programme entier? –
Etes-vous sûr que l'adresse de 'array' était 0xbffff078, pas 0xbffff048? Peut-être que l'postlude de 'strcpy' a essayé de faire des choses de pile qui ont écrasé les 8 octets à 0xbffff070? – aschepler
La mémoire est-elle vidée de la même invocation du programme que la trace du registre? – aaz