00014knrmZF0Osbg.es.srt

Este video es la parte de introducción y setup del ejercicio 5 en Ghidra, donde se identifica el main y se explora la estructura general del programa antes de comenzar el análisis.


Setup del proyecto en Ghidra:

Se importó el ejecutable con la opción de cargar todas las librerías habilitada (Load external libraries), lo cual genera una pestaña por cada DLL. Se analizó todo de una vez con “analyze all open”. Se ejecutó el programa brevemente para ver su comportamiento: es un programa de consola que imprime varias strings relacionadas con estructuras, clases y objetos.


Encontrando el main:

Se usó el método estándar de buscar las funciones __get_argv y __get_argc (o sus equivalentes), que siempre se llaman justo antes de saltar al main. Desde las referencias de esas funciones se identificó la función que prepara los argumentos y hace la llamada al main. Se renotó como main.

Argumentos del main:

Se identificaron los tres argumentos estándar de un programa compilado en Visual Studio consultando la documentación de ReactOS:

  • argcint
  • argvchar** (array de strings de la línea de comandos)
  • envpchar** (array de strings de las variables de entorno, retorno de GetInitialNarrowEnvironment)

Se eliminó el cuarto argumento que estaba de más y no se usaba.


Funciones de inicialización pre-main:

Se identificó la llamada a __initterm / __initterm_e, que son funciones internas de MSVCRT que recorren una tabla de punteros entre una dirección de inicio y una de fin, ejecutando cada función que encuentran. Estas funciones inicializan variables globales antes de que main se ejecute.

Dentro de esa tabla se identificaron dos funciones de inicialización. La segunda de ellas contenía una variable global y llamaba a un constructor con una vtable de derived_example_1, lo que indica que hay un objeto global de esa clase que se crea antes del main. Se renotó como init.


Clases detectadas por RTTI:

Ghidra detectó automáticamente las clases del programa mediante RTTI. Las clases propias del ejecutable son:

  • base → clase base, no deriva de nadie
  • derived_example_1 → deriva de base
  • derived_example_2 → deriva de base
  • nest → clase independiente, no deriva de nadie

Cada una tiene su vtable y sus estructuras de jerarquía visibles en el symbol tree. Las otras clases que aparecen son del sistema y no son relevantes.


Call graph:

Se usó el call graph de Ghidra para visualizar las relaciones entre main y sus funciones, equivalente al inversive view de IDA. Se observaron llamadas a rand, srand, getchar y las funciones principales del programa.