00003EBjQXRiQI9E.es.srt

Este video es la parte 1 del ejercicio 6. El enfoque es configurar el proyecto en Ghidra y reconstruir la estructura MyClass y su constructor.


Ubicación del main:

Se encontró el main usando el patrón estándar de binarios de consola: buscar GetInitialNamedSecurityDescriptor seguido de las llamadas PRV/PRC, y el call inmediatamente posterior es el main. Se le asignó la firma estándar int main(char** argv, char** envp).


Stack cookie:

Lo primero que hace main es mover un valor de .data al stack y aplicarle un XOR con RCP. Se renotó como global_cookie / cookie.


Clase MyClass — RTTI y vtable:

  • Por RTTI se confirmó que MyClass es la única clase propia del programa (el resto son del runtime de MSVC).
  • Es clase base pura (no hereda de otra).
  • La vtable tiene 4 funciones virtuales (4 punteros void*). Se creó la estructura vtable_MyClass con esos 4 punteros.

Estructura MyClass (50 bytes / 0x32):

Se creó manualmente la estructura con el mismo nombre que la clase RTTI (MyClass) para que Ghidra la asocie correctamente. El layout quedó así:

Offset Campo Tipo Valor inicial
0x00 vtable ptr vtable_MyClass* dirección de la vtable
0x08 string1 basic_string (0x20 bytes) "" (vacío, 5 bytes de buffer)
0x28 _0xF long long 0x0F
0x30 string2 basic_string (0x20 bytes) "malísimo"

std::basic_string — comportamiento SSO (Small String Optimization):

Punto clave del video. El constructor tiene lógica de branch dependiendo de _Mysize (tamaño máximo interno):

  • Si _Mysize <= 0xF: la string se almacena embebida directamente en el buffer de la estructura (no hay heap).
  • Si _Mysize > 0xF: se hace una allocación en el heap y el campo almacena un puntero al buffer externo.

En este caso ambas strings ("" y "malísimo") son chicas, así que se escriben directo en el buffer sin malloc.


Importación de tipos desde otro ejecutable:

Como std::basic_string es un template que el compilador genera internamente (no es una función importada), no aparece en Ghidra por defecto. La solución fue:

  1. Compilar un ejecutable auxiliar (ConsoleApplication6) que use std::string.
  2. Cargar su PDB en Ghidra.
  3. Hacer Capture Function Data Types desde ese ejecutable.
  4. Aplicarlos en el binario objetivo con Apply Function Data Types.

Con eso quedó disponible la estructura basic_string para aplicarla en la estructura de MyClass.