https://chacker.pl/
Mając kontrolę nad rejestrem EIP, musimy dowiedzieć się dokładnie, ile znaków zajęło czyste nadpisanie go (i nic więcej). Najłatwiejszym sposobem na zrobienie tego jest użycie generatora wzorców cyklicznych Pwntools. Najpierw utwórzmy skrypt Pythona, aby połączyć się z naszym nasłuchem:
Gdy ponownie uruchomimy nasz plik binarny w gdb i uruchomimy skrypt Pythona w innym oknie, nadal powinniśmy doświadczyć awarii. Jeśli tak się stanie, skrypt Pythona działa prawidłowo, a błąd segmentacji powinien zostać spowodowany ustawieniem EIP na nieprawidłowy adres pamięci 0x41414141 (AAAA). Następnie chcemy dokładnie ustalić, ile znaków potrzeba, aby przepełnić bufor. Zamiast osiągać to za pomocą odczytywania kodu dezasemblacji, możemy przepełnić program cyklicznym wzorcem: unikalną sekwencją bajtów w ciągu o wstępnie zdefiniowanej długości. Wynikowa wartość nadpisanego EIP będzie odpowiadać czterem unikalnym bajtom w cyklicznym wzorcu, które można łatwo zlokalizować, zapewniając dokładną długość, o jaką powinniśmy uzupełnić nasz kod powłoki, aby osiągnąć przesunięcie zapisanego adresu powrotu w stosie. Użyjemy cyklicznej funkcji Pwntools, aby osiągnąć to w naszym exploicie:
Teraz, gdy uruchamiamy exploit, otrzymujemy inne nadpisanie w gdb:
Tutaj widzimy, że EIP został ustawiony na 0x63616171, co odpowiada sekwencji „caaq” z naszego wzorca cyklicznego. Jeśli zastosujesz się do instrukcji instalacji Pwntools i wykonasz polecenie sudo pip3 install pwntools, zainstalujesz narzędzia wiersza poleceń Pwntools. Możemy użyć cyklicznego narzędzia wiersza poleceń Pwntools, aby znaleźć przesunięcie odpowiadające 0x63616171:
Jeśli nie chcesz instalować narzędzi wiersza poleceń Pwntools, alternatywą jest uruchomienie konsoli Python3, zaimportowanie Pwntools i użycie funkcji cyclic_find:
Teraz wiemy, że dokładne przesunięcie wynosi 264 bajty, zanim EIP zostanie nadpisane. Daje nam to początkową długość wypełnienia, której potrzebujemy przed wysłaniem lokalizacji nadpisywania EIP.