Print Stack Canary
Powiększanie wydruku stosu
Wyobraź sobie sytuację, w której program podatny na przepełnienie stosu może wykonać funkcję puts wskazującą na część przepełnionego stosu. Atakujący wie, że pierwszy bajt kanarka to bajt nullowy (\x00
), a reszta kanarka to losowe bajty. Następnie atakujący może stworzyć przepełnienie, które nadpisuje stos aż do pierwszego bajtu kanarka.
Następnie atakujący wywołuje funkcję puts na środku ładunku, co spowoduje wydrukowanie całego kanarka (oprócz pierwszego bajtu nullowego).
Dzięki tym informacjom atakujący może stworzyć i wysłać nowy atak, znając kanarka (w tej samej sesji programu).
Oczywiście ta taktyka jest bardzo ograniczona, ponieważ atakujący musi być w stanie wydrukować zawartość swojego ładunku, aby wyciec kanarka, a następnie móc stworzyć nowy ładunek (w tej samej sesji programu) i wysłać rzeczywiste przepełnienie bufora.
Przykłady CTF:
64 bity, włączone ASLR, ale brak PIE, pierwszym krokiem jest zapełnienie przepełnienia aż do bajtu 0x00 kanarka, a następnie wywołanie puts i wyciek kanarka. Z kanarka tworzony jest gadżet ROP do wywołania puts w celu wycieku adresu puts z GOT, a następnie gadżet ROP do wywołania
system('/bin/sh')
32 bity, ARM, brak relro, kanarka, nx, brak pie. Przepełnienie z wywołaniem puts w celu wycieku kanarka + ret2lib wywołujący
system
za pomocą łańcucha ROP do wypchnięcia r0 (arg/bin/sh
) i pc (adres systemu)
Dowolne odczytywanie
Dzięki dowolnemu odczytowi jak ten dostarczany przez ciągi formatujące, możliwe może być wycieknięcie kanarka. Sprawdź ten przykład: https://ir0nstone.gitbook.io/notes/types/stack/canaries i przeczytaj o nadużywaniu ciągów formatujących do odczytywania dowolnych adresów pamięci w:
pageFormat StringsTo wyzwanie nadużywa w bardzo prosty sposób ciąg formatujący do odczytania kanarka ze stosu
Last updated