34 lines
2.8 KiB
Markdown

# Print Stack Canary
{{#include ../../../banners/hacktricks-training.md}}
## Vergrößern des gedruckten Stacks
Stellen Sie sich eine Situation vor, in der ein **Programm anfällig** für einen Stack-Überlauf eine **puts**-Funktion **aufrufen** kann, die auf **einen Teil** des **Stack-Überlaufs** zeigt. Der Angreifer weiß, dass das **erste Byte des Canaries ein Null-Byte** (`\x00`) ist und der Rest des Canaries **zufällige** Bytes sind. Dann kann der Angreifer einen Überlauf erzeugen, der **den Stack bis zum ersten Byte des Canaries überschreibt**.
Anschließend **ruft der Angreifer die puts-Funktionalität** in der Mitte der Nutzlast auf, die **alle Bytes des Canaries druckt** (außer dem ersten Null-Byte).
Mit diesen Informationen kann der Angreifer **eine neue Attacke erstellen und senden**, wobei er den Canary kennt (in derselben Programmsitzung).
Offensichtlich ist diese Taktik sehr **eingeschränkt**, da der Angreifer in der Lage sein muss, den **Inhalt** seiner **Nutzlast** zu **drucken**, um den **Canary** zu **exfiltrieren** und dann in der Lage zu sein, eine neue Nutzlast (in der **gleichen Programmsitzung**) zu erstellen und den **echten Buffer-Overflow** zu **senden**.
**CTF-Beispiele:**
- [**https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html**](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64 Bit, ASLR aktiviert, aber kein PIE, der erste Schritt besteht darin, einen Überlauf bis zum Byte 0x00 des Canaries zu füllen, um dann puts aufzurufen und es zu leaken. Mit dem Canary wird ein ROP-Gadget erstellt, um puts aufzurufen, um die Adresse von puts aus dem GOT zu leaken, und ein ROP-Gadget, um `system('/bin/sh')` aufzurufen.
- [**https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html)
- 32 Bit, ARM, kein relro, Canary, nx, kein pie. Überlauf mit einem Aufruf an puts, um den Canary zu leaken + ret2lib, das `system` mit einer ROP-Kette aufruft, um r0 (arg `/bin/sh`) und pc (Adresse von system) zu poppen.
## Arbitrary Read
Mit einem **arbitrary read**, wie es durch Format-**Strings** bereitgestellt wird, könnte es möglich sein, den Canary zu leaken. Überprüfen Sie dieses Beispiel: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) und Sie können lesen, wie man Format-Strings missbraucht, um beliebige Speicheradressen zu lesen in:
{{#ref}}
../../format-strings/
{{#endref}}
- [https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html](https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html)
- Diese Herausforderung missbraucht auf sehr einfache Weise einen Format-String, um den Canary vom Stack zu lesen.
{{#include ../../../banners/hacktricks-training.md}}