000093hu2Z_1E9lA.es.srt

Este video es la parte 1 del análisis estático de la función type_pointer del ejercicio 5, donde se analiza en detalle el comportamiento de los dos objetos creados en el heap: derived_example_1 y derived_example_2.


Constructor y retorno:

Se seteo el valor de retorno del constructor como derived_example_1* (siempre retorna this). Esto causó que Ghidra re-inferiera automáticamente los tipos de las variables que recibían ese retorno y las llamadas a través de la vtable se resolvieron correctamente.


function_counter (método de derived_example_1):

Recibe random como argumento. Tiene un loop do-while que itera hasta que un índice iguale a random. Los dos valores que setea en la estructura son:

  • random: el índice al final del loop vale random porque empieza en 0 y se incrementa hasta igualar.
  • random * (random - 1): la multiplicación ocurre cuando el índice vale random - 1 (antes del último incremento).

imprimir_case:

Toma random, lo divide por 3, y según el resto (0, 1, 2 o 3) imprime el case correspondiente.


get_random y get_valor_calculado:

  • get_random devuelve el campo random de la estructura (tipo u16).
  • get_valor_calculado devuelve el campo random * (random-1) (tipo u32).

Ambos valores se imprimen después de obtenerlos.


Objeto Nest (incrustado dentro de derived):

  • Se imprime el valor 0x1337 que se setea en el constructor de Nest.
  • imprimir_hello y only_test son métodos de Nest que se llaman pasándole el puntero nest_object como this.
  • La string hello_from_derived se imprime carácter por carácter con un loop que avanza un char* hasta encontrar el nulo.
  • buffer_20 contiene una string rara generada en el constructor de Nest que se imprime al final.

Objeto derived_example_2 (segundo objeto en el heap):

Es casi idéntico a derived_example_1 pero con diferencias clave en la estructura:

Campo derived_example_1 derived_example_2
Valor principal random 0x42
Valor calculado random * (random-1) 0xBF (campo fijo)
Función única No tiene incrementar_0x42: suma 1 al campo 0x42

Por eso get_random en derived_2 devuelve 43 (0x42 + 1, porque incrementar_0x42 se ejecuta antes), y get_valor_calculado devuelve el campo 0xBF directamente.

Se creó la clase derived_2, su estructura, su vtable con 5 funciones (3 compartidas con derived_1: random, valor_calculado, imprimir_case; y 2 propias: incrementar_0x42 y destructor), y se renotó todo correspondientemente.


Destructores:

Ambos objetos se destruyen al final de type_pointer. El destructor recibe un flag como segundo argumento: si es distinto de 0, hace free del objeto. Internamente, cada destructor primero destruye el objeto Nest incrustado (mismo patrón: flag → free), y después hace free del derived correspondiente.