Aby wyświetlić szczegóły wyodrębnionego nagłówka ELF, warto skorzystać z polecenia readelf. Ale czy polecenie readelf zadziała w przypadku uszkodzonego pliku ELF zawierającego jedynie nagłówek? Sprawdźmy to na listingu !


Opcja -h (1) nakazuje programowi readelf wydrukować tylko nagłówek pliku wykonywalnego. Nadal wyświetla komunikat, że przesunięcia do tabeli nagłówków sekcji i tabeli nagłówków programu wskazują na obszar poza plikiem, ale to nie stanowi problemu. Ważne jest, aby teraz mieć wygodną reprezentację wyodrębnionego nagłówka ELF. Jak teraz określić rozmiar całego pliku ELF, używając wyłącznie nagłówka pliku wykonywalnego? Na rysunku 2-1 w rozdziale 2 dowiedziałeś się, że ostatnią częścią pliku ELF jest zazwyczaj tabela nagłówków sekcji, a przesunięcie do tabeli nagłówków sekcji jest podane w nagłówku pliku wykonywalnego (2). Nagłówek pliku wykonywalnego informuje również o rozmiarze każdego nagłówka sekcji (3) i liczbie nagłówków sekcji w tabeli (4). Oznacza to, że możesz obliczyć rozmiar całej biblioteki ELF ukrytej w pliku bitmapowym w następujący sposób:
rozmiar = e_shoff + (e_shnum x e_shentsize)
= 8;568 + (27 64)
= 10;296
W tym równaniu rozmiar to rozmiar całej biblioteki, e_shoff to przesunięcie względem tabeli nagłówków sekcji, e_shnum to liczba nagłówków sekcji w tabeli, a e_shentsize to rozmiar każdego nagłówka sekcji. Teraz, gdy wiesz, że rozmiar biblioteki powinien wynosić 10 296 bajtów, możesz użyć dd, aby wyodrębnić ją w całości, w następujący sposób:
$ dd skip=52 count=10296 if=67b8601 (1)of=lib5ae9b7f.so bs=1
10296+0 records in
10296+0 records out
10296 bytes (10 kB, 10 KiB) copied, 0.0287996 s, 358 kB/s
Polecenie dd wywołuje wyodrębniony plik lib5ae9b7f.so (1), ponieważ jest to nazwa brakującej biblioteki, której oczekuje plik binarny ctf. Po uruchomieniu tego polecenia powinieneś mieć w pełni funkcjonalny obiekt współdzielony ELF. Użyjmy readelf, aby sprawdzić, czy wszystko poszło dobrze, jak pokazano na Listingu 5-2. Aby zachować zwięzłość wyników, wydrukujmy tylko nagłówek wykonywalny (-h) i tabele symboli (-s). Te ostatnie powinny dać Ci pojęcie o funkcjonalności biblioteki.

Zgodnie z oczekiwaniami, cała biblioteka wydaje się być poprawnie wyodrębniona. Chociaż jest okrojona, dynamiczna tabela symboli ujawnia kilka interesujących eksportowanych funkcji (od (1) do (5)). Jednak nazwy wydają się być trochę nieczytelne, co utrudnia ich odczytanie. Zobaczmy, czy da się to naprawić.



