BF Addresses in the Stack
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wenn du es mit einer Binärdatei zu tun hast, die durch einen Canary und PIE (Position Independent Executable) geschützt ist, musst du wahrscheinlich einen Weg finden, sie zu umgehen.
Beachte, dass checksec
möglicherweise nicht erkennt, dass eine Binärdatei durch einen Canary geschützt ist, wenn diese statisch kompiliert wurde und die Funktion nicht identifizieren kann.
Du kannst dies jedoch manuell feststellen, wenn du bemerkst, dass ein Wert zu Beginn eines Funktionsaufrufs im Stack gespeichert wird und dieser Wert vor dem Verlassen überprüft wird.
Um PIE zu umgehen, musst du eine Adresse leaken. Und wenn die Binärdatei keine Adressen leakt, ist es am besten, die im Stack gespeicherten RBP- und RIP-Werte in der verwundbaren Funktion zu brute-forcen. Wenn beispielsweise eine Binärdatei sowohl durch einen Canary als auch durch PIE geschützt ist, kannst du mit dem Brute-Forcen des Canaries beginnen, dann werden die nächsten 8 Bytes (x64) das gespeicherte RBP und die nächsten 8 Bytes das gespeicherte RIP sein.
Es wird angenommen, dass die Rücksprungadresse im Stack zum Hauptbinärcode gehört, was normalerweise der Fall ist, wenn die Verwundbarkeit im Binärcode liegt.
Um das RBP und das RIP aus der Binärdatei zu brute-forcen, kannst du herausfinden, dass ein gültig geratenes Byte korrekt ist, wenn das Programm etwas ausgibt oder einfach nicht abstürzt. Die gleiche Funktion, die zum Brute-Forcen des Canaries bereitgestellt wird, kann verwendet werden, um das RBP und das RIP zu brute-forcen:
Das letzte, was Sie benötigen, um das PIE zu besiegen, ist, nützliche Adressen aus den geleakten Adressen zu berechnen: die RBP und die RIP.
Von der RBP aus können Sie berechnen, wo Sie Ihre Shell im Stack schreiben. Dies kann sehr nützlich sein, um zu wissen, wo Sie die Zeichenfolge "/bin/sh\x00" im Stack schreiben werden. Um die Entfernung zwischen der geleakten RBP und Ihrem Shellcode zu berechnen, können Sie einfach einen Breakpoint nach dem Leaken der RBP setzen und überprüfen, wo sich Ihr Shellcode befindet. Dann können Sie die Entfernung zwischen dem Shellcode und der RBP berechnen:
Von der RIP können Sie die Basisadresse der PIE-Binärdatei berechnen, die Sie benötigen, um eine gültige ROP-Kette zu erstellen.
Um die Basisadresse zu berechnen, führen Sie einfach objdump -d vunbinary
aus und überprüfen Sie die letzten Adressen der Disassemblierung:
In diesem Beispiel sehen Sie, dass nur 1 Byte und ein halbes Byte benötigt werden, um den gesamten Code zu lokalisieren. Die Basisadresse in dieser Situation wird die geleakte RIP sein, die auf "000" endet. Wenn Sie beispielsweise 0x562002970ecf
geleakt haben, ist die Basisadresse 0x562002970000
.
Laut einigen Beobachtungen aus diesem Beitrag ist es möglich, dass der Server beim Leaken von RBP- und RIP-Werten nicht abstürzt, wenn einige Werte nicht die richtigen sind, und das BF-Skript denkt, es hätte die richtigen erhalten. Das liegt daran, dass einige Adressen es einfach nicht brechen werden, selbst wenn sie nicht genau die richtigen sind.
Laut diesem Blogbeitrag wird empfohlen, eine kurze Verzögerung zwischen den Anfragen an den Server einzuführen.
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)