Il sistema operativo riserva la quantità fissa di spazio virtuale valido per lo stack o qualcos'altro? Sono in grado di produrre un overflow dello stack usando solo grandi variabili locali?
Ho scritto un piccolo C
programma per testare il mio presupposto. Funziona su X86-64 CentOS 6.5.
#include <string.h>
#include <stdio.h>
int main()
{
int n = 10240 * 1024;
char a[n];
memset(a, 'x', n);
printf("%x\n%x\n", &a[0], &a[n-1]);
getchar();
return 0;
}
L'esecuzione del programma dà &a[0] = f0ceabe0
e&a[n-1] = f16eabdf
Le mappe proc mostrano lo stack: 7ffff0cea000-7ffff16ec000. (10248 * 1024B)
Poi ho provato ad aumentare n = 11240 * 1024
L'esecuzione del programma dà &a[0] = b6b36690
e&a[n-1] = b763068f
Le mappe proc mostrano lo stack: 7fffb6b35000-7fffb7633000. (11256 * 1024B)
ulimit -s
stampe 10240
sul mio PC.
Come puoi vedere, in entrambi i casi la dimensione dello stack è maggiore di quella che ulimit -s
dà. E lo stack cresce con una variabile locale più grande. La parte superiore dello stack è in qualche modo 3-5kB in più&a[0]
(AFAIK la zona rossa è 128B).
Quindi, come viene allocata questa mappa dello stack?