NOTA IMPORTANTE: El delito informático está severamente castigado por la ley. Esta página no promueve el delito informático, es divulgativa y muestra los mecanismos que utilizan los cibercriminales para poder identificar el ataque si has sido victima de uno de ellos. En el caso de que hayas sido victima de un ataque te recomendamos que busques recursos legales en la sección Cibercrime Law o en la página del Instituto Nacional de Ciberseguridad: https://www.incibe.es/

BlogWonderHowTo

Tutorial de C orientado a la seguridad 0x19 – Funciones Parte V: Pasar por referencia

¡Hola a todos! Este será probablemente el tutorial final sobre funciones donde veremos un método llamado pasar por referencia. Esta técnica nos permite modificar grandes cantidades de datos sin la sobrecarga y devolver múltiples valores. ¡Vamos!

Pasando por valor

Hasta ahora, hemos estado usando argumentos de función con un método llamado pasar por valor que esencialmente copia los datos de la persona que llama a la persona que llama a través de la pila. Si lo ha olvidado, aquí están los detalles en el Tutorial 0x0F. Algunos problemas que podríamos enfrentar es que debemos copiar todo el valor en la pila para que se use y, si esos datos fueran grandes, podrían consumir recursos valiosos. Además, si tuviéramos que devolver varios valores, probablemente necesitaríamos una estructura para poder hacer esto.

Pasando por referencia

Pasar por referencia es una solución a los problemas que enfrentamos en el escenario anterior. En lugar de copiar valores completos en la pila, todo lo que se le da a la función es la referencia a los datos. Al hacerlo, podemos alterar directamente el valor original en lugar de una copia del valor original.

Código de ejemplo

Podemos ver que nuestro intercambio la función no devuelve un valor. En lugar de pasar a nuestra función los valores de nuestras variables num1 y num2, le estamos dando su direcciones. Dentro de nuestra función, declaramos una variable temporal para contener uno de los valores mientras realizamos el cambio. Para hacer esto, necesitamos desreferenciar los punteros para acceder a los valores.

Compilación y ejecución

¡Luciendo bien!

Echemos un vistazo a lo que sucede dentro de la memoria.

Análisis de memoria

Establecemos puntos de interrupción en main y intercambio para que podamos identificar nuestras variables num1 (amarillo) y num2 (azul).

En el primer análisis de la pila, ubicamos e identificamos los datos de nuestras variables y sus direcciones en la pila. num1 está en la dirección 0xffffd098 con el valor hexadecimal de 0x2a y num2 está en la dirección 0xffffd09c y tiene un valor hexadecimal de 0x44.

Cuando llamamos intercambio, le pasamos las direcciones de nuestras dos variables. En el segundo análisis de pila, encontramos las direcciones de nuestro primero y segundo variables. primero se encuentra en la dirección 0xffffd080 con el valor hexadecimal de 0xffffd098 (dirección de num1) y segundo se encuentra en la dirección 0xffffd084 con el valor hexadecimal de 0xffffd09c (dirección de num2).

Interrumpiendo en la línea 8, antes de salir de la intercambio función, podemos ver que los valores en nuestra pila se han intercambiado.

Matrices

Lo mismo ocurre con las matrices. De vuelta en el Tutorial 0x10 – Punteros y direcciones, mencioné las matrices y mostré que la matriz es una referencia a su primer índice. Veamos qué pasa cuando lo pasamos a una función.

Código de ejemplo

Note nuevamente que la función editArray no tiene valor de retorno. Dado que la matriz se pasa a la función como referencia, cualquier cambio en la matriz en editArray lo afectaría directamente en main.

Para obtener el número de elementos en nuestra matriz int, necesitamos obtener el tamaño del búfer en bytes con el tamaño de operador y luego dividirlo por el tamaño de un int porque recuerde que cada int tiene un tamaño de 4 bytes.

Compilación y ejecución

Misma expectativa que en el ejemplo anterior.

Múltiples valores de retorno

El scanf La función es una demostración del mundo real de múltiples valores de retorno. Devuelve el número de entradas leídas correctamente y también establece los valores de las variables dadas.

Código de ejemplo

Podemos ver eso errar está capturando el valor de retorno y norte se le asignará un valor. Otra vez, norte se pasa por referencia para permitir que la función pueda devolver un valor de verificación de errores y, al mismo tiempo, asignar valores dados a través de argumentos variables.

Conclusión

Pasar por referencia tiene sus ventajas pero debemos ser conscientes de que al hacerlo, nos aseguramos de no hacer nada divertido que modifique accidentalmente el contenido. Esto se aplica especialmente a las cadenas como matrices de caracteres.

Esto prácticamente concluye los conceptos básicos de las funciones. En el siguiente tutorial, repasaremos la estructura de datos de la lista enlazada y finalizaremos la serie estándar C básica. Después de esto, cubriré la API de Windows y su documentación proporcionada por MSDN, que nos ayudará a desarrollar la funcionalidad para nuestro malware en la subserie de malware. ¡Manténganse al tanto!

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