Ho scritto un semplice programma in C, l'ho compilato, aperto in gdb, impostato un breakpoint alla riga 11 e controllato lo stack.
1 #include<stdio.h>
2
3 int main(int argc, char *argv[]){
4 char arr[4] = "AABB";
5 int square = foo(2);
6 exit(0);
7 }
8
9 int foo(int x){
10 char buff[4] = "CCDD";
11 printf("Enter a value:"); // set breakpoint for this line
12 gets(buff);
13 return x*x;
14 }
15
16 void bar(){
17 printf("This program was hacked");
18 }
19
Quando ho guardato lo stack ho scoperto che dopo che la funzione principale è stata inizializzata ma prima che foo (x) venisse chiamata, posto 2 stack per __libc_csu_init sullo stack. Capisco che ogni programma chiama init e fini, ma questi riferimenti non dovrebbero essere messi in pila prima che venga chiamata la funzione principale?
(gdb) x/16a $esp
0xbffff110: 0x8000 0x44444343 0xbffff148 0x8048442 <main+48>
0xbffff120: 0x2 0xb7fbe000 0x804a000 0x80484c1 <__libc_csu_init+33>
0xbffff130: 0xb7fbe3bc 0x8048218 0x80484a9 <__libc_csu_init+9> 0x0
0xbffff140: 0x1 0x42424141 0x0 0xb7e0c5a6
Perché 0x42424141 ha un indirizzo più alto di __libc_csu_init?