Aby bardziej ukonkretnić technikę wstrzykiwania PT_NOTE, przyjrzyjmy się, jak użyć narzędzia elfinject dostępnego na maszynie wirtualnej. Listing pokazuje, jak użyć elfinject do wstrzyknięcia sekcji kodu do pliku binarnego.
Listing : Użycie elfinject







W folderze kodu dla tego rozdziału na maszynie wirtualnej zobaczysz plik o nazwie hello.bin (1), który zawiera nowy kod, który wstrzykniesz w surowej postaci binarnej (bez nagłówków ELF). Jak wkrótce zobaczysz, kod wyświetla komunikat „hello world!”, a następnie przekazuje sterowanie do oryginalnego punktu wejścia pliku binarnego hosta, wznawiając normalne wykonywanie pliku binarnego. Jeśli jesteś zainteresowany, możesz znaleźć instrukcje asemblera lub wstrzyknięty kod w pliku o nazwie hello.s lub w sekcji 7.4. Przyjrzyjmy się teraz użyciu elfinject (2). Jak widać, elfinject oczekuje pięciu argumentów: ścieżki do pliku binarnego hosta, ścieżki do pliku wstrzykniętego, nazwy i adresu wstrzykniętej sekcji oraz przesunięcia do punktu wejścia wstrzykniętego kodu (lub -1, jeśli nie ma punktu wejścia). Plik wstrzyknięty hello.bin jest wstrzyknięty do pliku binarnego hosta z podaną nazwą, adresem i punktem wejścia. W tym przykładzie używam kopii pliku /bin/ls jako pliku binarnego hosta (3). Jak widać, polecenie ls zachowuje się normalnie przed wstrzyknięciem, wyświetlając listę bieżącego katalogu (4). Za pomocą polecenia readelf można zobaczyć, że plik binarny zawiera sekcję .note.ABI-tag (5) oraz segment PT_NOTE (6), który zostanie nadpisany przez wstrzyknięcie. Teraz czas na wstrzyknięcie kodu. W tym przykładzie używam polecenia elfinject do wstrzyknięcia pliku hello.bin do pliku binarnego ls, używając nazwy .injected i adresu ładowania 0x800000 dla sekcji wstrzykniętej (którą elfinject dodaje na końcu pliku binarnego) (7). Używam 0 jako punktu wejścia, ponieważ punkt wejścia pliku hello.bin znajduje się na samym początku. Po pomyślnym zakończeniu działania elfinject, readelf pokazuje, że plik binarny ls zawiera teraz sekcję kodu o nazwie .injected (8) oraz nowy segment wykonywalny typu PT_LOAD (9), który zawiera tę sekcję. Ponadto sekcja .note.ABI-tag i segment PT_NOTE zniknęły, ponieważ zostały nadpisane. Wygląda na to, że wstrzyknięcie zakończyło się powodzeniem! Teraz sprawdźmy, czy wstrzyknięty kod zachowuje się zgodnie z oczekiwaniami. Wykonując zmodyfikowany plik binarny ls (10), można zauważyć, że plik binarny uruchamia wstrzyknięty kod podczas uruchamiania, wyświetlając komunikat „Hello World!”. Wstrzyknięty kod następnie przekazuje wykonywanie do oryginalnego punktu wejścia pliku binarnego, aby wznowić jego normalne działanie, czyli wyświetlanie listy katalogów.