2.0 KiB
Print Stack Canary
{{#include ../../../../banners/hacktricks-training.md}}
Powiększenie wydrukowanego stosu
Wyobraź sobie sytuację, w której program podatny na przepełnienie stosu może wykonać funkcję puts wskazującą na część przepełnienia stosu. Napastnik wie, że pierwszy bajt kanarka to bajt zerowy (\x00
), a reszta kanarka to losowe bajty. Następnie napastnik może stworzyć przepełnienie, które nadpisuje stos aż do pierwszego bajtu kanarka.
Następnie napastnik wywołuje funkcjonalność puts w środku ładunku, co wydrukuje cały kanarek (z wyjątkiem pierwszego bajtu zerowego).
Dzięki tym informacjom napastnik może stwórzyć i wysłać nowy atak, znając kanarek (w tej samej sesji programu).
Oczywiście, ta taktyka jest bardzo ograniczona, ponieważ napastnik musi być w stanie wydrukować zawartość swojego ładunku, aby wyekstrahować kanarek, a następnie być w stanie stworzyć nowy ładunek (w tej samej sesji programu) i wysłać prawdziwe przepełnienie bufora.
Przykłady CTF:
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bity, ASLR włączone, ale bez PIE, pierwszym krokiem jest wypełnienie przepełnienia aż do bajtu 0x00 kanarka, aby następnie wywołać puts i wyciek. Z kanarkiem tworzony jest gadżet ROP do wywołania puts, aby wyciekł adres puts z GOT, a następnie gadżet ROP do wywołania
system('/bin/sh')
.
Dowolne odczytywanie
Dzięki dowolnemu odczytowi, jak ten zapewniony przez ciągi formatowe, może być możliwe wyciekanie kanarka. Sprawdź ten przykład: https://ir0nstone.gitbook.io/notes/types/stack/canaries i możesz przeczytać o nadużywaniu ciągów formatowych do odczytu dowolnych adresów pamięci w:
{{#ref}} ../../format-strings/ {{#endref}}
{{#include ../../../../banners/hacktricks-training.md}}