Escribí un programa simple en C, lo compilé, lo abrí en gdb, establecí un punto de interrupción en la línea 11 e inspeccioné la pila.
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
Cuando miré la pila, descubrí que después de que se inicializaba la función principal pero antes de llamar a foo (x), colocaba 2 direcciones para __libc_csu_init en la pila. Entiendo que cada programa llama a init y fini, pero ¿no deberían colocarse esas referencias en la pila antes de llamar a la función principal?
(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
¿Por qué 0x42424141 está en una dirección más alta que __libc_csu_init?