Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
pyvex — Enlaces de Python para el IR VEX de Valgrind. | Kitploit
Herramientas/GitHubGitHub/angr/pyvex
Análisis EstáticoAnálisis de VulnerabilidadesAnálisis de CódigoIngeniería InversaUtilidades y FrameworksAnálisis de BinariosPapers e Investigación
GitHubangr/pyvex

pyvex

Enlaces de Python para el IR VEX de Valgrind.

Ver Repositorio
38012913hace 4 díasRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

PyVEX

Latest Release Python Version PyPI Statistics License

PyVEX son los bindings de Python para el IR de VEX.

Enlaces del proyecto

Repositorio del proyecto: https://github.com/angr/pyvex

Documentación: https://api.angr.io/projects/pyvex/en/latest/

Instalación de PyVEX

PyVEX se puede instalar con pip:

pip install pyvex

Uso de PyVEX

import pyvex
import archinfo

# translate an AMD64 basic block (of nops) at 0x400400 into VEX
irsb = pyvex.lift(b"\x90\x90\x90\x90\x90", 0x400400, archinfo.ArchAMD64())

# pretty-print the basic block
irsb.pp()

# this is the IR Expression of the jump target of the unconditional exit at the end of the basic block
print(irsb.next)

# this is the type of the unconditional exit (i.e., a call, ret, syscall, etc)
print(irsb.jumpkind)

# you can also pretty-print it
irsb.next.pp()

# iterate through each statement and print all the statements
for stmt in irsb.statements:
    stmt.pp()

# pretty-print the IR expression representing the data, and the *type* of that IR expression written by every store statement
import pyvex
for stmt in irsb.statements:
    if isinstance(stmt, pyvex.IRStmt.Store):
        print("Data:", end="")
        stmt.data.pp()
        print("")

        print("Type:", end="")
        print(stmt.data.result_type)
        print("")

# pretty-print the condition and jump target of every conditional exit from the basic block
for stmt in irsb.statements:
    if isinstance(stmt, pyvex.IRStmt.Exit):
        print("Condition:", end="")
        stmt.guard.pp()
        print("")

        print("Target:", end="")
        stmt.dst.pp()
        print("")

# these are the types of every temp in the IRSB
print(irsb.tyenv.types)

# here is one way to get the type of temp 0
print(irsb.tyenv.types[0])

Ten en cuenta que esta es una representación sintáctica de un bloque básico. Es decir, te dirá qué significa el bloque, pero no tienes ningún contexto para decir, por ejemplo, qué datos reales escribe una instrucción de almacenamiento.

Representación intermedia de VEX

Para tratar con arquitecturas ampliamente diversas, es útil llevar a cabo análisis sobre una representación intermedia. Un IR abstrae varias diferencias de arquitectura al tratar con diferentes arquitecturas, permitiendo que un único análisis se ejecute sobre todas ellas:

  • Nombres de registros. La cantidad y los nombres de los registros difieren entre arquitecturas, pero los diseños modernos de CPU mantienen un tema común: cada CPU contiene varios registros de propósito general, un registro para contener el puntero de pila, un conjunto de registros para almacenar los flags de condición, y así sucesivamente. El IR proporciona una interfaz consistente y abstraída a los registros en diferentes plataformas. Específicamente, VEX modela los registros como un espacio de memoria separado, con desplazamientos enteros (es decir, el rax de AMD64 se almacena comenzando en la dirección 16 en este espacio de memoria).
  • Acceso a memoria. Diferentes arquitecturas acceden a la memoria de diferentes maneras. Por ejemplo, ARM puede acceder a la memoria tanto en modo little-endian como big-endian. El IR debe abstraer estas diferencias.
  • Segmentación de memoria. Algunas arquitecturas, como x86, soportan segmentación de memoria mediante el uso de registros de segmento especiales. El IR comprende tales mecanismos de acceso a memoria.
  • Efectos secundarios de las instrucciones. La mayoría de las instrucciones tienen efectos secundarios. Por ejemplo, la mayoría de las operaciones en modo Thumb en ARM actualizan los flags de condición, y las instrucciones de push/pop de pila actualizan el puntero de pila. Rastrear estos efectos secundarios de manera ad hoc en el análisis sería una locura, por lo que el IR hace explícitos estos efectos.

Hay muchas opciones para un IR. Usamos VEX, ya que la elevación de código binario a VEX está bastante bien soportada. VEX es una representación agnóstica de la arquitectura y libre de efectos secundarios de varios lenguajes de máquina objetivo. Abstrae el código máquina en una representación diseñada para facilitar el análisis de programas. Esta representación tiene cinco clases principales de objetos:

  • Expresiones. Las Expresiones IR representan un valor calculado o constante. Esto incluye cargas de memoria, lecturas de registros y resultados de operaciones aritméticas.
  • Operaciones. Las Operaciones IR describen una modificación de las Expresiones IR. Esto incluye aritmética entera, aritmética de punto flotante, operaciones de bits, y así sucesivamente. Una Operación IR aplicada a Expresiones IR produce una Expresión IR como resultado.
  • Variables temporales. VEX usa variables temporales como registros internos: las Expresiones IR se almacenan en variables temporales entre usos. El contenido de una variable temporal se puede recuperar usando una Expresión IR. Estas temporales están numeradas, comenzando en t0. Estas temporales están fuertemente tipadas (es decir, "entero de 64 bits" o "float de 32 bits").
  • Sentencias. Las Sentencias IR modelan cambios en el estado de la máquina objetivo, como el efecto de almacenamientos en memoria y escrituras en registros. Las Sentencias IR usan Expresiones IR para los valores que puedan necesitar. Por ejemplo, una Sentencia IR de almacenamiento en memoria usa una Expresión IR para la dirección objetivo de la escritura, y otra Expresión IR para el contenido.
  • Bloques. Un Bloque IR es una colección de Sentencias IR, que representa un bloque básico extendido (denominado "IR Super Block" o "IRSB") en la arquitectura objetivo. Un bloque puede tener varias salidas. Para salidas condicionales desde el medio de un bloque básico, se usa una Sentencia IR especial Exit. Se usa una Expresión IR para representar el objetivo de la salida incondicional al final del bloque.

El IR de VEX está en realidad bastante bien documentado en el archivo libvex_ir.h (https://github.com/angr/vex/blob/dev/pub/libvex_ir.h) en el repositorio de VEX. Para los perezosos, detallaremos algunas partes de VEX con las que probablemente interactuarás con bastante frecuencia. Para empezar, aquí hay algunas Expresiones IR:

Expresión IRValor evaluadoEjemplo de salida de VEX
ConstantUn valor constante.0x4:I32
Read TempEl valor almacenado en una variable temporal de VEX.RdTmp(t10)
Get RegisterEl valor almacenado en un registro.GET:I32(16)
Load MemoryEl valor almacenado en una dirección de memoria, con la dirección especificada por otra Expresión IR.LDle:I32 / LDbe:I64
OperationUn resultado de una Operación IR especificada, aplicada a argumentos de Expresión IR especificados.Add32
If-Then-ElseSi una Expresión IR dada se evalúa a 0, devuelve una Expresión IR. De lo contrario, devuelve otra.ITE
Helper FunctionVEX usa funciones auxiliares de C para ciertas operaciones, como calcular los registros de flags de condición de ciertas arquitecturas. Estas funciones devuelven Expresiones IR.function_name()

Estas expresiones se usan, a su vez, en Sentencias IR. Aquí hay algunas comunes:

Descargar herramienta