Primero, antes de que pueda abordar su problema, debe comprobar si el ejecutable se ejecuta bajo ASLR ( enlace )
Si ese es el caso, tendrá que encontrar una manera de filtrar la dirección del programa, ya que la dirección de libc será diferente cada vez. Puede verificar esto fácilmente ejecutando los mapas de gdb - > b main - > info proc un par de veces y comparando las compensaciones. Si son diferentes, su ejecutable probablemente se ejecuta bajo ASLR.
Suponiendo que no hay protección ASLR, el uso de las asignaciones gdb - > b main - > info proc debería darle la dirección base de libc SO. Para encontrar el desplazamiento de la función a la que le gustaría saltar, puede usar muchos métodos, pero el uso de readelf -s debería funcionar bien. Esto le dará el desplazamiento de la función calculada desde la base del SO (base dirección de SO + offset = posición del código en tiempo de ejecución).
Para encontrar la dirección base del módulo ejecutable en tiempo de ejecución, puede usar gdb o cualquier otro depurador y buscar el punto de entrada del ejecutable (o simplemente buscar su cadena después de que el ejecutable se cargue en la memoria). .). Básicamente, cualquier programa que cargue su ejecutable en la memoria y le permita ver la memoria funcionará.
La dirección de un ejecutable bajo linux suele ser 0x400000 para ejecutables de 64 bits y 0x08048000 para ejecutables de 32 bits, según lo define el enlazador gnu. Pero no hay nada que impida que alguien cambie el punto de entrada a una dirección diferente.
Una vez que hayas descubierto las asignaciones de memoria, deberás encontrar los gadgets en el código, lo dejaré para que investigues ... enlace
Quizás pueda encontrar más respuestas mirando los ejercicios en exploit-exercises.com
por ejemplo, protoestrella stack6 debe tratar con ret2libc, puedes buscar un tutorial
editado: parece que ldd no siempre te dará la dirección correcta, incluso ignora la desactivación de ASLR en mi sistema. Probablemente sea mejor usar gdb