Lab 05 - Structs, R/W, calc

Supporting files

Lab archive. Unzip using:unzip lab5.zip. Password is lab05.

Ejercicio 1: Organización de Datos en una Estructura en C

  1. Escribe un programa en C que defina la siguiente estructura y cree al menos un objeto de ella:

    struct info {
      char siglas[5];
      int edad;
      struct info* next;
      char inicial;
    };
    

    El programa debe inicializar un objeto de esta estructura y asignar valores a sus miembros.

  2. Compila el programa y haz disassembly usando objdump. Examina cómo se organizan los datos en la memoria dentro de la estructura. En tu informe, incluye el disassembly de la sección donde se puede deducir la organización de los miembros.

  3. Responde las siguientes preguntas:

    • Basándote en el código ensamblador, ilustra (usando un diagrama) cómo quedan organizados los miembros de la estructura en la memoria.
    • ¿Cuántos bytes se desperdician en cada objeto debido a alineación de memoria (padding)?
    • Evalúa la siguiente reorganización de los miembros:

      struct info_alt {
        struct info_alt *next;
        int edad;
        char siglas[5];
        char inicial;
      };
      

      ¿Se reduciría el desperdicio de memoria con esta nueva organización? Justifica tu respuesta basándote en la alineación de los datos en memoria.

Requisitos y Entrega:


Ejercicio 2: El escondite

Objetivo : Analizar el comportamiento de un binario para determinar a qué archivo escribe y su contenido, sin permitir que el binario realice la escritura.

Una de las labores que realiza el programa que vas a analizar es leer el valor de una de la environment variables (EV) mediante la función getenv. Las environment variables son como settings o configuraciones que se establecen a nivel de sistema operativo y que los programas pueden leer para customizar su ejecución. Las EV consisten de pares de nombre/valor, por ejemplo: la variable USER tiene como valor el username. En linux, puedes ver los pares de nombre/valor de tus EV usando el comando env.

Por ejemplo, una de las environment variables más útiles es la variable PATH. Si deseas ver el valor de una EV particular puedes usar echo $nombre, e.g. echo $PATH. El valor de PATH es una lista separada por colon de los directorios donde el shell buscará binarios cuando ejecutes un comando. En una de mis cuentas, el valor de PATH es:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Esto implica que si desde la linea de comando corro vim, el shell buscará en esos directorios hasta encontrar el binario de vim (en mi cuenta, está en /usr/bin).

En esta página puedes ver un ejemplo sencillo de cómo se puede usar getenv desde un programa en C.

Usa nm -D escondite para ver las funciones externas que el ejecutable invoca de librerías compartidas.
El hecho de que aparece fwrite entre esas funciones parece indicar que este binario escribe a un archivo. Sin permitir que el binario escriba al archivo, determina a qué archivo escribe y qué escribe. Esto lo puedes hacer usando un analysis estático (objdump) pero más fácilmente usando gdb y haciendo debug pero sin permitir que el programa llegue a la invocación de fwrite. En tu informe describe tu proceso de reversing y luego ejecuta el programa y muestra el archivo que se creó (y su contenido).

En tu informe, contesta las siguientes preguntas, mostrando capturas de pantalla como evidencia:


Ejercicio 3: La tortolita

El programa llamado tortolita usa la función fopen para leer algo de un archivo y es probable que lo usa para leer de allí la llave que abre el portón a la libertad. Determina cual ese archivo. Si es necesario crea el archivo y pon allí la llave secreta para que diga Success: Congratulations! You've won!.

Hints:

Ejercicio 4: Funcionalidad no documentada

Vas a completar el ejercicio en https://challenges.re/24/.

En esencia vas:

Ejemplos:

Mostramos funcionalidad de multiplicación.

Aquí vemos la parte del programa relacionada a la multiplicación.