Od kodu źródłowego do kodu binarnego
Programowanie zaczyna się od sprytnego pomysłu i pisania kodu źródłowego w wybranym języku programowania, na przykład C, i zapisywaniu kodu źródłowego w pliku. Za pomocą odpowiedniego kompilatora, na przykład GCC, kod źródłowy jest przetłumaczony na kod obiektu, najpierw. Ostatecznie Linker tłumaczy kod obiektu na plik binarny, który łączy kod obiektu z bibliotekami odwołanymi. Ten plik zawiera pojedyncze instrukcje jako kod maszynowy, który jest rozumiany przez procesor i są wykonywane, gdy tylko program skompilowany zostanie uruchomiony.
Plik binarny wspomniany powyżej jest zgodny z konkretną strukturą, a jeden z najczęstszych jest nazywany elf. Jest powszechnie używany do plików wykonywalnych, plików obiektów relokatywnych, bibliotek udostępnionych i zrzutów podstawowych.
Dwadzieścia lat temu - w 1999 r. Na szczęście format ELF został wcześniej udokumentowany zarówno w interfejsie binarnym System V Application, jak i standardu interfejsu narzędzi [4]. Fakt ten niezwykle uproszczył zgodę na standaryzację między różnymi dostawcami i deweloperami systemów operacyjnych opartych na UNIX.
Przyczyną tej decyzji było projektowanie elfa - elastyczność, rozszerzalność i wsparcie międzyplatformowe dla różnych formatów endianowych i rozmiarów adresów. Projekt ELF nie ogranicza się do określonego procesora, zestawu instrukcji lub architektury sprzętowej. Aby uzyskać szczegółowe porównanie formatów plików wykonywalnych, zajrzyj tutaj [3].
Od tego czasu format ELF jest używany przez kilka różnych systemów operacyjnych. Obejmuje to między innymi Linux, Solaris/Illumos, Free-, Net- i OpenBSD, QNX, Beos/Haiku i Fuchsia OS [2]. Ponadto znajdziesz go na urządzeniach mobilnych z Androidem, Maemo lub Meego OS/Sailfish OS, a także na konsolach do gry, takich jak PlayStation Portable, Dreamcast i Wii.
Specyfikacja nie wyjaśnia rozszerzenia nazwy pliku dla plików ELF. W użyciu jest różnorodne kombinacje liter, takie jak .AXF, .kosz, .elf, .o, .Prx, .ptyś, .Ko, .tak i .mod lub brak.
Struktura pliku elfa
Na terminalu Linux Elf Command Man zawiera przydatne podsumowanie o strukturze pliku ELF:
Lista 1: Manpage struktury ELF
$ man elfJak widać z powyższego opisu, plik ELF składa się z dwóch sekcji - nagłówka ELF i danych plików. Sekcja danych plików może składać się z tabeli nagłówka programu opisującej zero lub więcej segmentów, tabelę nagłówka sekcji opisującej zero lub więcej sekcji, po których następują dane, o których mowa w tabeli nagłówka programu oraz tabela nagłówka sekcji. Każdy segment zawiera informacje niezbędne do wykonywania pliku w czasie wykonywania, podczas gdy sekcje zawierają ważne dane do łączenia i relokacji. Rysunek 1 ilustruje to schematycznie.
Nagłówek elfa
Nagłówek ELF ma 32 bajty długości i identyfikuje format pliku. Zaczyna się od sekwencji czterech unikalnych bajtów, które są 0x7f, a następnie 0x45, 0x4c i 0x46, które tłumaczy się na trzy litery E, L i F. Wśród innych wartości nagłówek wskazuje również, czy jest to plik ELF dla formatu 32 lub 64-bitowego, używa niewielkiej lub dużej endianness, pokazuje wersję ELF, a także do którego systemu operacyjnego plik został skompilowany odpowiedni zestaw binarny aplikacji (ABI) i instrukcje CPU.
Szesnastka binarnego dotyku pliku wygląda następująco:
.Lista 2: Szesnastka pliku binarnego
$ hd/usr/bin/touch | głowa -5Debian GNU/Linux oferuje polecenie Readelf, które jest dostarczane w pakiecie GNU „Binutils”. W towarzystwie przełącznika -h (krótka wersja „-file-header”) ładnie wyświetla nagłówek pliku elfa. Lista 3 ilustruje to dla dotyku poleceń.
.Lista 3: Wyświetlanie nagłówka pliku ELF
$ readelf -h/usr/bin/touchNagłówek programu
Nagłówek programu pokazuje segmenty używane w czasie wykonywania i mówi systemowi, jak utworzyć obraz procesu. Nagłówek z Listing 2 pokazuje, że plik ELF składa się z 9 nagłówków programowych o wielkości 56 bajtów każdy, a pierwszy nagłówek zaczyna się od Bajte 64.
Ponownie, polecenie Readelf pomaga wyodrębnić informacje z pliku elfa. Przełącznik -l (krótki dla -programów lub -segmenty) ujawnia więcej szczegółów, jak pokazano na liście 4.
.Lista 4: Wyświetl informacje o nagłówkach programu
$ readelf -l/usr/bin/touchNagłówek sekcji
Trzecia część struktury ELF to nagłówek sekcji. Ma to wymienić pojedyncze sekcje binarnego. Switch -s (krótkie dla -sektorowe lub -sekcje) wymienia różne nagłówki. Jeśli chodzi o polecenie dotykowe, istnieje 27 nagłówków sekcji, a lista 5 pokazuje tylko pierwsze z nich plus tylko ostatnie. Każda linia obejmuje rozmiar sekcji, typ sekcji, a także jego adres i przesunięcie pamięci.
.Lista 5: Szczegóły sekcji ujawnione przez Readelf
$ readelf -s/usr/bin/touchNarzędzia do analizy pliku ELF
Jak można zauważyć z powyższych przykładów, GNU/Linux jest rozwinięty z wieloma przydatnymi narzędziami, które pomagają przeanalizować plik ELF. Pierwszym kandydatem, na który będziemy się przyjrzeć, jest narzędzie pliku.
Plik wyświetla podstawowe informacje o plikach elfów, w tym architektura zestawu instrukcji, dla których kod w pliku obiektowym jest przenoszony, wykonywalny lub udostępniony. Na liście 6 mówi, że/bin/touch to 64-bitowy plik wykonywalny zgodnie z bazą standardową Linux (LSB), dynamicznie połączoną i zbudowaną dla jądra GNU/Linux wersja 2.6.32.
.Lista 6: Podstawowe informacje za pomocą pliku
$ plik /bin /touchDrugi kandydat to czytanie. Wyświetla szczegółowe informacje o pliku ELF. Lista przełączników jest porównywalnie długa i obejmuje wszystkie aspekty formatu ELF. Za pomocą przełącznika -n (krótkiego dla -Notes) Listing 7 pokazuje tylko sekcje notatek, które istnieją w pliku dotyk.
.Lista 7: Wyświetl wybrane sekcje pliku ELF
$ readelf -n/usr/bin/touchZauważ, że w ramach Solaris i FreeBSD elfdump użyteczności [7] odpowiada odczytowi. Od 2019 r. Nie ma nowej wersji ani aktualizacji od 2003 roku.
Numer trzy to pakiet o nazwie Elfutils [6], który jest wyłącznie dostępny dla Linux. Zapewnia alternatywne narzędzia dla Binutils GNU, a także umożliwia sprawdzanie poprawności plików ELF. Zauważ, że wszystkie nazwy narzędzi podanych w pakiecie zaczynają się od UE dla „ELF Utils”.
Wreszcie wspomnimy o objdump. To narzędzie jest podobne do odczytu, ale koncentruje się na plikach obiektów. Zapewnia podobny zakres informacji o plikach ELF i innych formatach obiektów.
.Lista 8: Informacje o pliku wyodrębnione przez objdump
$ objdump -f /bin /touchIstnieje również pakiet oprogramowania o nazwie „Elfkickers” [9], który zawiera narzędzia do odczytu zawartości pliku ELF, a także manipulowanie. Niestety liczba wydań jest raczej niska i dlatego po prostu o tym wspominamy i nie pokazujemy kolejnych przykładów.
Jako deweloper możesz rzucić okiem na „Pax-Utils” [10,11],. Ten zestaw narzędzi zapewnia szereg narzędzi, które pomagają weryfikacji plików ELF. Jako przykład, zrzucanie analizuje plik ELF i zwraca plik nagłówka C zawierający szczegóły - patrz Rysunek 2.
Dzięki połączeniu sprytnego projektu i doskonałej dokumentacji format ELF działa bardzo dobrze i nadal jest używany po 20 latach. Narzędzia pokazane powyżej umożliwiają widok na plik ELF i pozwala dowiedzieć się, co robi program. To są pierwsze kroki do analizy oprogramowania - Happy Hacking!
Pisarz chciałby podziękować Axelowi Beckertowi za jego wsparcie w zakresie przygotowania tego artykułu.