Pokonywanie losowego układu przestrzeni adresowej jądra (KASLR)

https://chacker.pl/

KASLR5 działa podobnie do ochrony przestrzeni użytkownika ASLR, losując układ adresów bazowych jądra za każdym razem, gdy system jest uruchamiany. Jeśli możemy uzyskać wyciek niezawodnego adresu pamięci, obejście tej ochrony byłoby trywialne. Ponieważ mamy dowolny warunek odczytu, oto kroki, które wykonamy, aby obliczyć bazę jądra:

1. Zmodyfikuj program leak.c, aby uruchomić getchar() przed wysłaniem ładunku. Da nam to czas na dołączenie GDB (lub uszkodzenie GDB, jeśli jest już dołączony) i potwierdzenie, czy adres jest niezawodny. Następnie ponownie skompiluj leak.c po dodaniu getchar(). Kod powinien wyglądać następująco:

  1. Wykonaj proces kilka razy, aby upewnić się, że adres, który próbujemy, zawsze wskazuje na tę samą instrukcję:

Teraz otwórz nowy terminal i pobierz instrukcje, do których wskazują te adresy, używając polecenia x/i GDB. Jeśli powtórzysz to kilka razy, zauważysz, że piąty adres, indeks 4 naszej tablicy wycieków, zawsze wskazuje na tę samą instrukcję:

Wiedząc, że nasz niezawodny adres znajduje się pod indeksem 4 naszej tablicy wycieków, kontynuujmy pracę z wyłączonym KASLR (run4.sh), aby uprościć obliczenia. Nasze kolejne kroki będą następujące:

1. Uruchom run4.sh, a następnie pobierz adres bazowy jądra, odczytując pierwszy wiersz /proc/kallsyms i odejmując piąty adres zwrócony przez plik binarny ./leak, aby uzyskać odległość między wyciekiem a bazą jądra:

Następnie wyjdź z QEMU i użyj Pythona, aby uzyskać odległość między wyciekiem a bazą jądra:

  1. Zmodyfikuj nasz kod źródłowy exploit4.c, aby utworzyć nową zmienną unsigned long, kernel_base, której wartością będzie leak[4] – 0x14c174. Kod powinien wyglądać następująco:

  1. Oblicz odległość każdego adresu statycznego z tymi względnymi do bazy jądra. Naprawmy gadżet pop rdi; ret;, a później możesz powtórzyć ten sam proces ze wszystkimi gadżetami. Po otwarciu QEMU z wyłączonym KASLR (run4.sh) i dołączeniu GDB, odejmij adres bazowy jądra (0xffffffff81000000) od adresu gadżetu pop rdi; ret; (0xffffffff811ad2ec):

Wprowadź zmianę w kodzie exploita, która powinna wyglądać następująco:

Gdy skończysz pobierać adresy względne, źródło Twojego exploita powinno wyglądać tak jak to w ~/GHHv6/ch12/shared/exploit5/exploit.c. Skompilujmy i uruchommy nasz nowy exploit:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *