Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
pyvex — Liaisons Python pour le VEX IR de Valgrind. | Kitploit
Outils/GitHubGitHub/angr/pyvex
Analyse StatiqueAnalyse des VulnérabilitésAnalyse de CodeRétro-ingénierieUtilitaires et FrameworksAnalyse de BinairesArticles et Recherche
GitHubangr/pyvex

pyvex

Liaisons Python pour le VEX IR de Valgrind.

Voir le dépôt
38012918il y a 4 joursVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

PyVEX

Latest Release Python Version PyPI Statistics License

PyVEX est une liaison Python pour le VEX IR.

Liens du projet

Dépôt du projet : https://github.com/angr/pyvex

Documentation : https://api.angr.io/projects/pyvex/en/latest/

Installation de PyVEX

PyVEX peut être installé via pip :

pip install pyvex

Utilisation 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])

Gardez à l'esprit qu'il s'agit d'une représentation syntaxique d'un bloc de base. C'est-à-dire qu'elle vous indiquera ce que signifie le bloc, mais vous n'avez aucun contexte pour dire, par exemple, quelles données réelles sont écrites par une instruction de stockage.

Représentation intermédiaire VEX

Pour traiter des architectures très diverses, il est utile d'effectuer des analyses sur une représentation intermédiaire. Une IR fait abstraction de plusieurs différences d'architecture lors du traitement de différentes architectures, permettant ainsi d'exécuter une seule analyse sur toutes :

  • Noms de registres. La quantité et les noms des registres diffèrent selon les architectures, mais les conceptions modernes de CPU suivent un thème commun : chaque CPU contient plusieurs registres à usage général, un registre pour contenir le pointeur de pile, un ensemble de registres pour stocker les indicateurs de condition, etc. L'IR fournit une interface cohérente et abstraite aux registres sur différentes plateformes. Plus précisément, VEX modélise les registres comme un espace mémoire séparé, avec des décalages entiers (c'est-à-dire que le rax d'AMD64 est stocké à partir de l'adresse 16 dans cet espace mémoire).
  • Accès mémoire. Différentes architectures accèdent à la mémoire de différentes manières. Par exemple, ARM peut accéder à la mémoire en modes petit-boutiste et gros-boutiste. L'IR doit faire abstraction de ces différences.
  • Segmentation mémoire. Certaines architectures, comme x86, prennent en charge la segmentation mémoire via l'utilisation de registres de segment spéciaux. L'IR comprend ces mécanismes d'accès mémoire.
  • Effets de bord des instructions. La plupart des instructions ont des effets de bord. Par exemple, la plupart des opérations en mode Thumb sur ARM mettent à jour les indicateurs de condition, et les instructions push/pop de pile mettent à jour le pointeur de pile. Suivre ces effets de bord de manière ad hoc dans l'analyse serait insensé, donc l'IR rend ces effets explicites.

Il existe de nombreux choix pour une IR. Nous utilisons VEX, car la conversion du code binaire en VEX est assez bien prise en charge. VEX est une représentation indépendante de l'architecture et sans effets de bord de plusieurs langages machines cibles. Il fait abstraction du code machine en une représentation conçue pour faciliter l'analyse de programme. Cette représentation comporte cinq classes principales d'objets :

  • Expressions. Les expressions IR représentent une valeur calculée ou constante. Cela inclut les chargements mémoire, les lectures de registres et les résultats d'opérations arithmétiques.
  • Opérations. Les opérations IR décrivent une modification d'expressions IR. Cela inclut l'arithmétique entière, l'arithmétique à virgule flottante, les opérations binaires, etc. Une opération IR appliquée à des expressions IR produit une expression IR en résultat.
  • Variables temporaires. VEX utilise des variables temporaires comme registres internes : les expressions IR sont stockées dans des variables temporaires entre les utilisations. Le contenu d'une variable temporaire peut être récupéré à l'aide d'une expression IR. Ces temporaires sont numérotées, en commençant par t0. Ces temporaires sont fortement typées (c'est-à-dire « entier 64 bits » ou « flottant 32 bits »).
  • Instructions. Les instructions IR modélisent les changements dans l'état de la machine cible, tels que l'effet des stockages mémoire et des écritures de registres. Les instructions IR utilisent des expressions IR pour les valeurs dont elles peuvent avoir besoin. Par exemple, une instruction IR de stockage mémoire utilise une expression IR pour l'adresse cible de l'écriture, et une autre expression IR pour le contenu.
  • Blocs. Un bloc IR est une collection d'instructions IR, représentant un bloc de base étendu (appelé « IR Super Block » ou « IRSB ») dans l'architecture cible. Un bloc peut avoir plusieurs sorties. Pour les sorties conditionnelles depuis le milieu d'un bloc de base, une instruction IR spéciale Exit est utilisée. Une expression IR est utilisée pour représenter la cible de la sortie inconditionnelle à la fin du bloc.

Le VEX IR est en fait assez bien documenté dans le fichier libvex_ir.h (https://github.com/angr/vex/blob/dev/pub/libvex_ir.h) du dépôt VEX. Pour les paresseux, nous détaillerons certaines parties de VEX avec lesquelles vous interagirez probablement assez fréquemment. Pour commencer, voici quelques expressions IR :

Expression IRValeur évaluéeExemple de sortie VEX
ConstantUne valeur constante.0x4:I32
Read TempLa valeur stockée dans une variable temporaire VEX.RdTmp(t10)
Get RegisterLa valeur stockée dans un registre.GET:I32(16)
Load MemoryLa valeur stockée à une adresse mémoire, l'adresse étant spécifiée par une autre expression IR.LDle:I32 / LDbe:I64
OperationUn résultat d'une opération IR spécifiée, appliquée à des arguments d'expression IR spécifiés.Add32
If-Then-ElseSi une expression IR donnée est évaluée à 0, retourne une expression IR. Sinon, en retourne une autre.ITE
Helper FunctionVEX utilise des fonctions d'assistance C pour certaines opérations, comme le calcul des registres d'indicateurs de condition de certaines architectures. Ces fonctions retournent des expressions IR.function_name()

Ces expressions sont ensuite utilisées dans les instructions IR. Voici quelques-unes courantes :

Télécharger l’outil