BF Forked & Threaded Stack Canaries
Jeśli masz do czynienia z binarnym plikiem chronionym przez canary i PIE (Position Independent Executable), prawdopodobnie będziesz musiał znaleźć sposób na ich obejście.
Zauważ, że checksec
może nie wykryć, że binarny plik jest chroniony przez canary, jeśli został on skompilowany statycznie i nie jest w stanie zidentyfikować funkcji.
Możesz jednak zauważyć to ręcznie, jeśli zauważysz, że wartość jest zapisywana na stosie na początku wywołania funkcji, a ta wartość jest sprawdzana przed wyjściem.
Brutalne narzucanie Canary
Najlepszym sposobem na obejście prostego canary jest, gdy binarny program tworzy procesy potomne za każdym razem, gdy nawiązujesz z nim nowe połączenie (usługa sieciowa), ponieważ za każdym razem, gdy się z nim łączysz, używany będzie ten sam canary.
Najlepszym sposobem na obejście canary jest po prostu brutalne narzucanie go znak po znaku, a możesz dowiedzieć się, czy zgadnięty bajt canary był poprawny, sprawdzając, czy program się zawiesił, czy kontynuuje swoje regularne działanie. W tym przykładzie funkcja brutalnie narzuca 8-bajtowy canary (x64) i rozróżnia między poprawnie zgadniętym bajtem a złym bajtem, po prostu sprawdzając, czy serwer wysyła odpowiedź (innym sposobem w innych sytuacjach mogłoby być użycie try/except):
Przykład 1
Ten przykład jest zaimplementowany dla 64 bitów, ale można go łatwo zaimplementować dla 32 bitów.
Przykład 2
To jest zaimplementowane dla 32 bitów, ale można to łatwo zmienić na 64 bity. Zauważ również, że w tym przykładzie program oczekiwał najpierw bajtu wskazującego rozmiar danych wejściowych oraz samego ładunku.
Wątki
Wątki tego samego procesu będą również dzielić ten sam token kanarka, dlatego będzie możliwe przeprowadzenie ataku brute-force na kanarku, jeśli binarny plik tworzy nowy wątek za każdym razem, gdy występuje atak.
Co więcej, przepełnienie bufora w funkcji wątkowej zabezpieczonej za pomocą kanarka może być wykorzystane do modyfikacji głównego kanarka przechowywanego w TLS. Jest to możliwe, ponieważ można dotrzeć do pozycji pamięci, w której przechowywane jest TLS (a zatem kanarek) za pomocą przepełnienia bufora na stosie wątku. W rezultacie zastosowanie zabezpieczenia jest bezużyteczne, ponieważ sprawdzane są dwa kanarki, które są takie same (choć zmodyfikowane). Ten atak jest opisany w artykule: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Sprawdź również prezentację https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015, która wspomina, że zazwyczaj TLS jest przechowywane przez mmap
i gdy tworzony jest stos wątku, również jest generowany przez mmap
zgodnie z tym, co może umożliwić przepełnienie, jak pokazano w poprzednim artykule.
Inne przykłady i odnośniki
64 bity, brak PIE, nx, kanarek BF, zapisz w pewnej pamięci ROP, aby wywołać
execve
i przeskoczyć tam.
Last updated