Jak właśnie zauważyłeś, łatwiej jest nadpisać istniejący nagłówek sekcji i nagłówek programu niż dodawać zupełnie nowe. Ale skąd wiesz, które nagłówki możesz bezpiecznie nadpisać bez uszkodzenia pliku binarnego? Jednym z nagłówków programu, który zawsze możesz bezpiecznie nadpisać, jest nagłówek PT_NOTE, który opisuje segment PT_NOTE. Segment PT_NOTE obejmuje sekcje zawierające informacje pomocnicze o pliku binarnym. Na przykład może informować, że jest to plik binarny GNU/Linux, jakiej wersji jądra oczekuje plik binarny itd. W pliku wykonywalnym /bin/ls na maszynie wirtualnej, w szczególności, segment PT_NOTE zawiera te informacje w dwóch sekcjach o nazwach .note.ABI-tag i .note.gnu.build-id. Jeśli tych informacji brakuje, program ładujący po prostu zakłada, że jest to natywny plik binarny, więc można bezpiecznie nadpisać nagłówek PT_NOTE bez obawy o uszkodzenie pliku binarnego. Ta sztuczka jest powszechnie stosowana przez złośliwe pasożyty do infekowania plików binarnych, ale działa również w przypadku łagodnych modyfikacji. Rozważmy teraz zmiany potrzebne w kroku (2) , gdzie nadpisujesz jeden z nagłówków sekcji .note.*, aby przekształcić go w nagłówek nowej sekcji kodu (.injected). Wybiorę (arbitralnie) nadpisanie nagłówka sekcji .note.ABI-tag. Jak widać , zmieniam sh_type z SHT_NOTE na SHT_PROGBITS, aby wskazać, że nagłówek teraz opisuje sekcję kodu. Ponadto zmieniam pola sh_addr, sh_offset i sh_size, aby opisywać lokalizację i rozmiar nowej sekcji .injected zamiast przestarzałej sekcji note.ABI-tag. Na koniec zmieniam wyrównanie sekcji (sh_addralign) na 16 bajtów, aby zapewnić prawidłowe wyrównanie kodu po załadowaniu do pamięci, i dodaję flagę SHF_EXECINSTR do pola sh_flags, aby oznaczyć sekcję jako wykonywalną. Zmiany w kroku (3) są podobne, z tą różnicą, że tutaj zmieniam nagłówek programu PT_NOTE zamiast nagłówka sekcji. Ponownie zmieniam typ nagłówka, ustawiając p_type na PT_LOAD, aby wskazać, że nagłówek teraz opisuje segment ładowalny zamiast segmentu PT_NOTE. Powoduje to, że program ładujący ładuje segment (obejmujący nową sekcję .injected) do pamięci podczas uruchamiania programu. Zmieniam również wymagane pola adresu, przesunięcia i rozmiaru: p_offset, p_vaddr (i p_paddr, niewidoczne na rysunku), p_filesz i p_memsz. Ustawiam p_flags, aby oznaczyć segment jako czytelny i wykonywalny, a nie tylko czytelny, i poprawiam wyrównanie (p_align). Warto również zaktualizować tabelę ciągów znaków, zmieniając nazwę starej sekcji .note.ABI-tag na coś w rodzaju .injected, aby odzwierciedlić fakt dodania nowej sekcji kodu.