Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
pyvex — Python-Bindings für Valgrinds VEX IR. | Kitploit
Tools/GitHubGitHub/angr/pyvex
Statische AnalyseSchwachstellenanalyseCode-AnalyseReverse EngineeringDienstprogramme & FrameworksBinäranalysePapers & Forschung
GitHubangr/pyvex

pyvex

Python-Bindings für Valgrinds VEX IR.

Repository anzeigen
38012913vor 4 TagenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

PyVEX

Latest Release Python Version PyPI Statistics License

PyVEX sind Python-Bindings für die VEX IR.

Projektlinks

Projekt-Repository: https://github.com/angr/pyvex

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

PyVEX installieren

PyVEX kann per pip installiert werden:

pip install pyvex

PyVEX verwenden

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

Beachten Sie, dass dies eine syntaktische Darstellung eines Basisblocks ist. Das heißt, sie sagt Ihnen, was der Block bedeutet, aber Sie haben keinen Kontext, um beispielsweise zu sagen, welche tatsächlichen Daten von einer Store-Anweisung geschrieben werden.

VEX Intermediate Representation

Um mit sehr unterschiedlichen Architekturen umzugehen, ist es nützlich, Analysen auf einer Zwischendarstellung durchzuführen. Eine IR abstrahiert mehrere Architekturunterschiede beim Umgang mit verschiedenen Architekturen und ermöglicht es, eine einzige Analyse auf allen von ihnen auszuführen:

  • Registernamen. Die Anzahl und die Namen von Registern unterscheiden sich zwischen Architekturen, aber moderne CPU-Designs folgen einem gemeinsamen Thema: Jede CPU enthält mehrere Allzweckregister, ein Register für den Stack-Zeiger, eine Reihe von Registern zum Speichern von Bedingungsflags und so weiter. Die IR bietet eine konsistente, abstrahierte Schnittstelle zu Registern auf verschiedenen Plattformen. Insbesondere modelliert VEX die Register als einen separaten Speicherraum mit ganzzahligen Offsets (d. h. AMD64s rax wird beginnend bei Adresse 16 in diesem Speicherraum gespeichert).
  • Speicherzugriff. Verschiedene Architekturen greifen auf unterschiedliche Weise auf den Speicher zu. Beispielsweise kann ARM sowohl im Little-Endian- als auch im Big-Endian-Modus auf den Speicher zugreifen. Die IR muss diese Unterschiede abstrahieren.
  • Speichersegmentierung. Einige Architekturen, wie x86, unterstützen Speichersegmentierung durch die Verwendung spezieller Segmentregister. Die IR versteht solche Speicherzugriffsmechanismen.
  • Nebenwirkungen von Anweisungen. Die meisten Anweisungen haben Nebenwirkungen. Beispielsweise aktualisieren die meisten Operationen im Thumb-Modus auf ARM die Bedingungsflags, und Stack-Push/Pop-Anweisungen aktualisieren den Stack-Zeiger. Diese Nebenwirkungen auf ad-hoc-Weise in der Analyse zu verfolgen, wäre verrückt, daher macht die IR diese Effekte explizit.

Es gibt viele Möglichkeiten für eine IR. Wir verwenden VEX, da das Uplifting von Binärcode nach VEX recht gut unterstützt wird. VEX ist eine architekturunabhängige, nebenwirkungsfreie Darstellung einer Reihe von Zielmaschinensprachen. Sie abstrahiert Maschinencode in eine Darstellung, die darauf ausgelegt ist, Programmanalysen zu erleichtern. Diese Darstellung hat fünf Hauptklassen von Objekten:

  • Ausdrücke. IR-Ausdrücke repräsentieren einen berechneten oder konstanten Wert. Dazu gehören Speicherladevorgänge, Registerlesevorgänge und Ergebnisse arithmetischer Operationen.
  • Operationen. IR-Operationen beschreiben eine Modifikation von IR-Ausdrücken. Dazu gehören Ganzzahlarithmetik, Gleitkommaarithmetik, Bitoperationen und so weiter. Eine auf IR-Ausdrücke angewendete IR-Operation ergibt als Ergebnis einen IR-Ausdruck.
  • Temporäre Variablen. VEX verwendet temporäre Variablen als interne Register: IR-Ausdrücke werden zwischen ihrer Verwendung in temporären Variablen gespeichert. Der Inhalt einer temporären Variablen kann mithilfe eines IR-Ausdrucks abgerufen werden. Diese Temporären sind nummeriert, beginnend bei t0. Diese Temporären sind stark typisiert (d. h. „64-Bit-Ganzzahl“ oder „32-Bit-Gleitkommazahl“).
  • Anweisungen. IR-Anweisungen modellieren Änderungen im Zustand der Zielmaschine, wie die Auswirkung von Speicherschreibvorgängen und Register-Schreibvorgängen. IR-Anweisungen verwenden IR-Ausdrücke für Werte, die sie möglicherweise benötigen. Beispielsweise verwendet eine Speicherschreib-IR-Anweisung einen IR-Ausdruck für die Zieladresse des Schreibvorgangs und einen weiteren IR-Ausdruck für den Inhalt.
  • Blöcke. Ein IR-Block ist eine Sammlung von IR-Anweisungen, die einen erweiterten Basisblock (als „IR Super Block“ oder „IRSB“ bezeichnet) in der Zielarchitektur darstellt. Ein Block kann mehrere Ausgänge haben. Für bedingte Ausgänge aus der Mitte eines Basisblocks wird eine spezielle Exit-IR-Anweisung verwendet. Ein IR-Ausdruck wird verwendet, um das Ziel des unbedingten Ausgangs am Ende des Blocks darzustellen.

VEX IR ist tatsächlich recht gut dokumentiert in der Datei libvex_ir.h (https://github.com/angr/vex/blob/dev/pub/libvex_ir.h) im VEX-Repository. Für die Faulen werden wir einige Teile von VEX detailliert beschreiben, mit denen Sie wahrscheinlich recht häufig interagieren werden. Zunächst einmal hier einige IR-Ausdrücke:

IR-AusdruckAusgewerteter WertVEX-Ausgabebeispiel
ConstantEin konstanter Wert.0x4:I32
Read TempDer in einer VEX-temporären Variablen gespeicherte Wert.RdTmp(t10)
Get RegisterDer in einem Register gespeicherte Wert.GET:I32(16)
Load MemoryDer an einer Speicheradresse gespeicherte Wert, wobei die Adresse durch einen anderen IR-Ausdruck angegeben wird.LDle:I32 / LDbe:I64
OperationEin Ergebnis einer angegebenen IR-Operation, angewendet auf angegebene IR-Ausdrucksargumente.Add32
If-Then-ElseWenn ein gegebener IR-Ausdruck zu 0 ausgewertet wird, wird ein IR-Ausdruck zurückgegeben. Andernfalls wird ein anderer zurückgegeben.ITE
Helper FunctionVEX verwendet C-Hilfsfunktionen für bestimmte Operationen, wie die Berechnung der Bedingungsflag-Register bestimmter Architekturen. Diese Funktionen geben IR-Ausdrücke zurück.function_name()

Diese Ausdrücke werden dann wiederum in IR-Anweisungen verwendet. Hier sind einige häufige:

Tool herunterladen