00013k10cWFxpGW0.es.srt

Este video es la parte inicial del análisis estático del ejercicio 5, donde se identifican y reconstruyen la estructura global y las primeras funciones del main.


Estructura global_struct:

Se identificó una estructura global en la sección .data porque los accesos a sus campos se hacían siempre desde una dirección base + offset (RCX + 0x08, RCX + 0x0A, RCX + 0x0C). Se creó manualmente campo por campo:

Offset Campo Tipo Valor
0x00 ask_string char* Puntero a "hello from struct"
0x08 tipo_byte BYTE 0x7F
0x09 padding BYTE
0x0A tipo_word WORD 0x6189
0x0C tipo_dword DWORD valor seteado en la función

La estructura se renotó como global_struct y su instancia en memoria como my_global_struct.


Función create_my_global_struct:

Es la primera función llamada desde main. No tiene argumentos (void). Su único trabajo es llenar los campos de my_global_struct con los valores iniciales: guarda el puntero a la string, el byte, el word y el dword. Se renotó como create_my_global_struct.


Función print_struct_fields:

La segunda función llamada desde main. Recibe un solo argumento: un puntero a global_struct*. Lo que hace es:

  1. Imprimir la string ask_string carácter por carácter con un loop (mientras el contenido sea distinto de 0, imprime con %c y avanza el puntero).
  2. Imprimir tipo_byte con formato %02X.
  3. Imprimir tipo_word con formato %X.
  4. Imprimir tipo_dword con formato %X.

Internamente llama a una función que se identificó como printf (se renotó como printf), que no había sido detectada automáticamente por Ghidra. Una vez renotada, todas las llamadas a esa dirección en el programa quedaron identificadas como printf.


Limpieza de argumentos:

Se eliminaron los argumentos no utilizados de ambas funciones (R8, R9, y otros parámetros extra que el compilador dejaba en la firma pero que internamente no se consumían), quedando las firmas limpias y correctas.