
Herramienta IDAPython para crear tablas virtuales C++ automáticas en IDA Pro
Virtuailor es una herramienta IDAPython que reconstruye vtables para código C++ escrito para arquitectura Intel, tanto código de 32 bits como de 64 bits y AArch64 (¡Nuevo!). La herramienta se compone de 2 partes, estática y dinámica.
La primera es la parte estática, que contiene las siguientes capacidades:
La segunda es la parte dinámica, que contiene las siguientes capacidades:
Virtuailor ahora soporta versiones de IDA desde 7.0 hasta la versión más reciente (7.5), si estás usando versiones de IDA anteriores a 7.4 necesitarás cambiar a la rama beforeIDA-7.4, la rama master soporta la versión más reciente disponible (7.5).
if __name__ == '__main__':
start_addr_range = idc.MinEA() # You can change the virtual calls address range
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
Opcional (pero extremadamente recomendado), crea una instantánea de tu idb. Simplemente presiona ctrl+shift+t y crea una instantánea.
Presiona File->Run script... luego ve a la carpeta Virtuailor y elige ejecutar Main.py. Puedes ver el siguiente gif para una explicación más clara y visual.

Ahora la GUI te ofrecerá una opción para elegir un rango a apuntar; en caso de que quieras apuntar a todo el binario, solo presiona OK con los valores predeterminados en las direcciones de inicio y fin.
Después, los puntos de interrupción se colocarán en tu código y todo lo que tienes que hacer es ejecutar tu código con el depurador de IDA, realiza las acciones que desees y observa cómo se construyen las vtables. Para AArch64 puedes configurar un servidor gdb remoto y depurar usando el depurador de IDA.
En caso de que ya no quieras/necesites los puntos de interrupción, solo ve a la pestaña de lista de puntos de interrupción en IDA y elimínalos como prefieras.
También es muy importante para mí señalar que esta es la segunda versión de la herramienta con soporte tanto para 32 como para 64 bits y aarch64, probablemente en algunos casos se perderá una pequeña cantidad de puntos de interrupción, en esos casos por favor abre un issue y contáctame para que pueda mejorar el código y ayudar a solucionarlo. Gracias de antemano por eso :)
Las estructuras que Virtuailor crea a partir de la vtable utilizada en la llamada virtual que fue alcanzada. Las funciones vtable se extraen de la memoria basándose en el registro relevante que se utilizó en el código de operación del BP.
Como quería crear una correlación entre la estructura en IDA y las vtables en la sección de datos, el BP cambia el nombre de la dirección de la vtable en la sección de datos al nombre de la estructura. Como puedes ver en la siguiente imagen:

Los nombres de las funciones virtuales también se cambian, excepto en situaciones donde los nombres no son los nombres predeterminados de IDA (funciones con símbolos o funciones que el usuario cambió); en esos casos los nombres de las funciones se mantendrán igual y también se añadirán a la estructura vtable con su nombre actual.
Los nombres elegidos se construyen usando el siguiente patrón:
Después de crear la vtable, Virtuailor también añade una conexión entre la estructura creada y el ensamblador, como puedes ver en las siguientes imágenes:

P.D.: El offset de estructura utilizado en el BP solo es relevante para la última llamada que se realizó; para obtener una mejor comprensión de todas las llamadas virtuales que se realizaron, se añadió la funcionalidad de xref como se explica en la siguiente sección
Cuando se revierte C++ estáticamente, no es trivial ver quién llamó a quién, esto se debe a que la mayoría de las llamadas son indirectas; sin embargo, después de ejecutar Virtuailor, cada función que fue llamada indirectamente ahora tiene un xref a esas ubicaciones.
El siguiente gif muestra los Xref añadidos con su llamada a función indirecta:

La herramienta fue presentada en RECon Bruselas, Troopers y Warcon. La presentación se puede encontrar en el siguiente enlace: https://www.youtube.com/watch?v=Xk75TM7NmtA
Equipos de REcon Bruselas, Troopers, Warcon, Nana, @tmr232, @matalaz, @oryandp, @talkain, @shiftreduce
El plugin está licenciado bajo la licencia GNU GPL v3.