Position Independent Executable (PIE) pomaga pokonać ataki ROP, losując lokalizację mapowań pamięci przy każdym uruchomieniu programu. Za każdym razem, gdy uruchamiasz podatny program, zostanie on załadowany do innego adresu pamięci. W poprzednim laboratorium włączyliśmy ASLR, ale ponieważ PIE było wyłączone, bardzo łatwo było zbudować nasz łańcuch ROP do wycieku libc, ponieważ program był zawsze ładowany do tego samego adresu pamięci. Włączmy PIE i skopiujmy nasz exploit3.py do exploit4.py:
Jeśli spróbujesz uruchomić exploit3.py, nie powiedzie się, ponieważ exploit nie zna adresu bazowego programu. Możemy ominąć tę ochronę, jeśli znajdziemy wyciek informacji, który pomoże nam obliczyć adres bazowy programu. Dlatego zastosujemy następującą strategię:
- Użyj funkcji leak_bytes, aby uzyskać adresy canary, SFP i RIP. Interesuje nas wyciek RIP, ponieważ po uwierzytelnieniu wraca on do głównej funkcji programu.
- Oblicz adres bazowy programu, odejmując <wyciek RIP> od <odległość do bazy programu>.
- Przypisz wynik do elf.address.
Pełne źródło naszego pliku exploit4.py znajdziesz w folderze ~/GHHv6/ch11. Oto najistotniejsze zmiany w pliku:
W (1) wycieka SFP po kanarku; potrzebujemy, aby był częścią naszego ładunku, aby kontynuować wyciek RIP. Aby uczynić rzeczy bardziej przewidywalnymi, ponieważ wiemy, że ASLR nie zmieni najmniej znaczącego bajtu, wyciekamy RIP i nadpisujemy najmniej znaczący bajt 0x6d (2), ponieważ jesteśmy pewni, że nigdy się nie zmienia:
UWAGA: najmniej znaczący bit (LSB) może być inny w Twoim środowisku. Upewnij się, że wybrałeś właściwy.
W (3) obliczamy adres bazowy programu, odejmując
odległość od adresu bazowego do wyciekłego RIP. Oto sposób na uzyskanie odległości między wyciekłym RIP a adresem bazowym programu:
- Uruchom ./vuln w oknie.
- Uruchom exploit4.py w drugim oknie. Nie martw się, jeśli exploit się nie powiedzie.
- Otwórz trzecie okno i uruchom gdb:
- Uruchom polecenie vmmap vuln:
- Skopiuj adres Fixed leaked_rip i odejmij adres bazowy programu vuln:
Zadziałało! Teraz udało nam się ominąć ASLR, PIE, NX i kanarki stosu. Na wypadek gdybyście się zastanawiali, technika łagodzenia zagrożeń Relocation Read Only (RELRO) chroni pliki binarne przed nadpisywaniem GOT, ale nawet jeśli włączona jest pełna funkcja RELRO, nie powstrzyma nas to przed wykonaniem kodu, ponieważ nadpisywanie GOT nie było częścią naszej strategii.