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:
ask_string carácter por carácter con un loop (mientras el contenido sea distinto de 0, imprime con %c y avanza el puntero).tipo_byte con formato %02X.tipo_word con formato %X.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.