Które części pliku wykonywalnego ELF są ładowane do pamięci i gdzie?


10

Co już wiem:

Plik wykonywalny ELF ma wiele sekcji, oczywiście sekcje .text i .data są ładowane do pamięci, ponieważ są to główne części programu. Ale aby program działał, potrzebuje więcej informacji, zwłaszcza gdy jest połączony dynamicznie.

Interesują mnie sekcje takie jak .plt, .got, .dynamic, .dynsym, .dynstr itp. Części ELF, które są odpowiedzialne za powiązanie funkcji z adresami.

Z tego, co udało mi się do tej pory ustalić, jest to, że takie rzeczy jak .symtab i .strtab nie są ładowane (lub nie pozostają) w pamięci. Ale czy linker używa .dynsym i .dynstr? Czy pozostają w pamięci? Czy mogę uzyskać do nich dostęp z kodu programu?

I czy są jakieś części pliku wykonywalnego, które znajdują się w pamięci jądra?

Moje zainteresowanie to głównie kryminalistyka, ale wszelkie informacje na ten temat pomogą. Zasoby, które przeczytałem o tych tabelach i dynamicznym linkowaniu, są bardziej zaawansowane, wyjaśniają tylko działanie, a nie są praktyczne w treści w pamięci.

Daj mi znać, jeśli coś jest niejasne na temat mojego pytania.

Odpowiedzi:


12

Oto naprawdę dobra referencja: http://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ . Zawiera bibliografię na końcu różnych odnośników na różnych poziomach. Jeśli chcesz poznać każdy krwawy szczegół, możesz przejść bezpośrednio do źródła: http://www.akkadia.org/drepper/dsohowto.pdf . (Ulrich Drepper napisał linker dynamiczny dla systemu Linux).

Możesz uzyskać naprawdę dobry przegląd wszystkich sekcji pliku wykonywalnego, uruchamiając polecenie takie jak „objdump -h myexe” lub „readelf -S myexe”.

Sekcja .interp zawiera nazwę programu ładującego dynamicznie, który będzie używany do dynamicznego łączenia symboli w tym obiekcie. Sekcja .dynamic jest destylacją nagłówka programu, który jest sformatowany tak, aby był łatwy do odczytania przez moduł ładujący dynamiczny. (Ma więc wskaźniki do wszystkich innych sekcji).

.Got (Global Offset Table) i .plt (Procedura łączenia tabel) to dwie główne struktury, którymi manipuluje dynamiczny linker. .Got jest tabelą pośrednią dla zmiennych, a .plt jest tabelą pośrednią dla funkcji. Każdy plik wykonywalny lub biblioteka (zwane „obiektami współdzielonymi”) ma własne .got i .plt i są to tabele symboli, do których odwołuje się ten obiekt współdzielony, które są faktycznie zawarte w innym obiekcie współdzielonym.

Plik .dynsyn zawiera wszystkie informacje na temat symboli w twoim współdzielonym obiekcie (zarówno tych zdefiniowanych przez ciebie, jak i zewnętrznych, do których musisz się odwoływać.) .Dynsyn nie zawiera rzeczywistych nazw symboli. Są one zawarte w .dynstr, a .dynsyn ma wskaźniki na .dynstr. .gnu.hash to tablica skrótów służąca do szybkiego wyszukiwania symboli według nazwy. Zawiera także tylko wskaźniki (wskaźniki do .dynstr i wskaźniki używane do tworzenia łańcuchów kubełkowych).

Gdy obiekt współdzielony odsuwa się od jakiegoś symbolu „foo”, dynamiczny linker musi przejść do wyszukiwania „foo” we wszystkich dynamicznych obiektach, z którymi jesteś połączony, aby dowiedzieć się, który z nich zawiera „foo”, którego szukasz (a następnie jaki krewny adres „foo” znajduje się w tym współdzielonym obiekcie.) Dynamiczny linker dokonuje tego, przeszukując sekcję .gnu.hash wszystkich połączonych obiektów współdzielonych (lub sekcję .hash w poszukiwaniu starych obiektów współdzielonych, które nie mają .gnu. sekcja skrótu.) Po znalezieniu poprawnego adresu w połączonym obiekcie współdzielonym umieszcza go w pliku .got lub .plt obiektu udostępnionego.


Dzięki, twoje linki prowadzą mnie o krok dalej w poszukiwaniu wirtualnych mapowań potrzebnych mi sekcji. Ponieważ moje zainteresowanie to jest kryminalistyczne, „ładowanie do pamięci DRAM” jest nadal dla mnie istotne. Jeśli sekcja zostanie zmapowana, ale nigdy nie zostanie załadowana, nie będę w stanie jej znaleźć na zrzucie pamięci :)
Dutchy

Masz rację. Kiedy zrobisz zrzut pamięci, dostaniesz kopię każdej zmapowanej strony, więc moje rozróżnienie między „zmapowanym do vm” i „załadowanym do DRAM” nie miało znaczenia. Usunąłem to zdanie i odpowiedź jest poprawiona. Dziękuję Ci!
Wandering Logic

Oznaczono twoją odpowiedź jako odpowiedź, ponieważ to tyle informacji, ile zamierzam uzyskać :) Resztę będę musiał zrobić sam, w końcu to moje badania.
Dutchy

Tak, tak .dynsym i .dynstr (i inne) są używane przez dynamiczny linker i są ładowane do pamięci programu (w segmencie tekstowym) i mogą być używane w czasie wykonywania przez twój program.
ysdx
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.