BlogWonderHowTo

Tutorial de C orientado a la seguridad 0x0E – Funciones Parte II: Memoria

En el último tutorial, aprendimos cómo hacer funciones y cómo funcionan a alto nivel. Esta vez, volveremos a echar un vistazo bajo el capó, miraremos profundamente en su alma y veremos su fealdad cara a cara para ver cómo funciona en el nivel inferior.

El segmento de código

El segmento de código, también conocido como segmento de texto, es una sección en la memoria donde reside el código ejecutable, tiene un tamaño fijo y es de solo lectura. Este segmento se coloca debajo de la pila o encima del montón para evitar que el montón o los desbordamientos de pila lo corrompan.

Funciones en la memoria

Las funciones en la memoria están organizadas de manera similar a las variables en la pila. La función principal se carga primero en la memoria y luego las funciones definidas por el programador se apilan en la parte superior.

Código de ejemplo

Veamos nuevamente el código del tutorial anterior.

Imagen vía wonderhowto.com

Como analizaremos esto en la memoria, compilemos para depurarlo.

Compilación y depuración

Aquí está nuestro código compilado listado en GDB.

Dado que el código C es un lenguaje de alto nivel, la memoria no lo mostrará como tal, sino que se convierte en algo llamado codigo de maquina que es lo que ejecuta la CPU. GDB proporcionará una traducción del codigo de maquina a lo más legible Montaje idioma y es capaz de hacer esto porque tienen una relación uno a uno. Veamos cómo se ven cada una de estas funciones.

Aquí está la función principal.

Está bien, se ve bastante feo … (¡ya te lo dije!). Podemos ver el código ensamblador Intel x86 para nuestro código C, así que permítanme traducir algo de esto al inglés. La forma en que funciona la sintaxis de Intel es que la instrucción se escribe primero (la columna del medio) seguida por el registro de destino (los registros son una especie de variables similares para la CPU) y luego la fuente separada por una coma. En el amarillo, el mov La instrucción dice que dos valores hexadecimales se muevan a la ubicación de ESP más otro conjunto de valores hexadecimales. Hemos discutido antes que ESP se identifica con la pila, que es donde se encuentran nuestras variables.

Primero echemos un vistazo a las instrucciones antes del cuadro amarillo. sub esp, 0x20. 0x20 es el valor hexadecimal para el decimal 32 que le da suficiente espacio para almacenar nuestras tres variables: suma, num1 y num2. La primera instrucción en el cuadro amarillo. mov DWORD PTR [esp+0x14], 0xc se traduce en mueva el valor hexadecimal 0xc (decimal 12) a la dirección de ESP más (moviéndose hacia abajo en la pila) el valor hexadecimal 0x14 (decimal 20). Mirando hacia atrás en nuestro código, debe ser el num1 variable. La segunda línea hace lo mismo que la primera, excepto con una ubicación y un valor diferentes que coinciden con el num2 variable.

Las instrucciones entonces Copiar nuestras variables por emprendedor (para colocarlos en la parte superior de la pila) en la pila y luego llama a nuestra función agregar. Así que echemos un vistazo a la función.

El agregar La función mueve nuestras variables recién introducidas en dos registros: EAX y EDX (amarillo), luego las suma y las almacena en EAX (rojo). Luego, la función devuelve (azul). En el mundo del ensamblaje, el valor de retorno se almacena en el registro EAX que luego se copia en el suma variable en main. El agregar luego ejecuta la función retirado instrucción para volver a la siguiente instrucción de main que está en main + 45.

Si ha notado, las direcciones de los agregar Las instrucciones de la función son más bajas que las de main. Echemos un vistazo a nuestro segmento de código.

Sí, como expliqué antes, nuestro agregar La función se apila encima de main, algo así como las variables en la pila.

Conclusión

Trate de entender el segmento de código. Próximo tutorial en el que entraremos más detalle en funciones, sus parámetros y cómo el valor de retorno lo encuentra en el camino de regreso a casa. … y tal vez discutamos otra vulnerabilidad …

dtm.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar