¿Por qué mi pila contiene la dirección de retorno a __libc_csu_init después de inicializar main?

0

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?

    
pregunta Hugh Pearse 21.10.2018 - 13:34
fuente

1 respuesta

2

Por lo que yo sé, __libc_csu_init y main son argumentos empujados en la pila en orden inverso antes de la llamada a __libc_start_main .

Esta ilustración de ejemplo también muestra la imagen principal en una dirección inferior:

    
respondido por el user189437 21.10.2018 - 23:26
fuente

Lea otras preguntas en las etiquetas