Quali parti di un eseguibile ELF vengono caricate in memoria e dove?


10

Quello che già so:

Un eseguibile ELF ha un numero di sezioni, ovviamente le sezioni .text e .data vengono caricate in memoria poiché queste sono le parti principali del programma. Ma affinché un programma funzioni, ha bisogno di più informazioni, soprattutto se collegato in modo dinamico.

Quello che mi interessa sono sezioni come .plt, .got, .dynamic, .dynsym, .dynstr eccetera. Le parti dell'ELF che sono responsabili del collegamento delle funzioni agli indirizzi.

Da quello che sono riuscito a capire finora, è che cose come .symtab e .strtab non vengono caricate (o non rimangono) nella memoria. Ma .dynsym e .dynstr sono usati dal linker? Rimangono nella memoria? Posso accedervi dal codice del programma?

E ci sono parti di un eseguibile che risiedono nella memoria del kernel?

Il mio interesse per questo è principalmente forense, ma qualsiasi informazione su questo argomento sarà di aiuto. Le risorse che ho letto su queste tabelle e sul collegamento dinamico sono di livello più elevato, spiegano solo il funzionamento, non nulla di pratico sui contenuti in memoria.

Fammi sapere se qualcosa non è chiaro sulla mia domanda.

Risposte:


12

Quello che segue è un ottimo riferimento: http://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ . Contiene una bibliografia alla fine di una varietà di riferimenti diversi a diversi livelli. Se vuoi conoscere ogni dettaglio gory puoi andare direttamente alla fonte: http://www.akkadia.org/drepper/dsohowto.pdf . (Ulrich Drepper ha scritto il linker dinamico Linux.)

Puoi ottenere una panoramica davvero buona di tutte le sezioni del tuo eseguibile eseguendo un comando come "objdump -h myexe" o "readelf -S myexe".

La sezione .interp contiene il nome del caricatore dinamico che verrà utilizzato per collegare dinamicamente i simboli in questo oggetto. La sezione .dynamic è una distillazione dell'intestazione del programma che è formattata per essere facile da leggere per il caricatore dinamico. (Quindi ha puntatori a tutte le altre sezioni.)

.Got (Global Offset Table) e .plt (Procedure Linkage Table) sono le due strutture principali che vengono manipolate dal linker dinamico. .Got è una tabella di riferimento indiretto per le variabili e .plt è una tabella di riferimento indiretto per le funzioni. Ogni eseguibile o libreria (che sono chiamati "oggetti condivisi") ha i propri .got e .plt e queste sono tabelle dei simboli a cui fa riferimento quell'oggetto condiviso che sono effettivamente contenuti in qualche altro oggetto condiviso.

.Dynsyn contiene tutte le informazioni sui simboli nell'oggetto condiviso (sia quelli che definisci che quelli esterni a cui devi fare riferimento). Il .dynsyn non contiene i nomi dei simboli effettivi. Questi sono contenuti in .dynstr e .dynsyn ha puntatori in .dynstr. .gnu.hash è una tabella hash utilizzata per una rapida ricerca dei simboli per nome. Contiene anche solo puntatori (puntatori in .dynstr e puntatori utilizzati per creare catene di bucket.)

Quando il tuo oggetto condiviso dereferenzia un simbolo "pippo", il linker dinamico deve cercare "pippo" in tutti gli oggetti dinamici a cui sei collegato per capire quale contiene il "pippo" che stai cercando (e quindi quale indirizzo di "pippo" è all'interno di quell'oggetto condiviso.) Il linker dinamico lo fa cercando nella sezione .gnu.hash di tutti gli oggetti condivisi collegati (o nella sezione .hash per vecchi oggetti condivisi che non hanno un .gnu. sezione hash.) Una volta trovato l'indirizzo corretto nell'oggetto condiviso collegato, lo inserisce nel .got o .plt dell'oggetto condiviso.


Grazie, i tuoi collegamenti mi portano un ulteriore passo avanti nella ricerca delle mappature virtuali delle sezioni di cui ho bisogno. Poiché il mio interesse per questo è forense, "caricato in DRAM" è ancora rilevante per me. Se una sezione è mappata ma mai caricata, non
riuscirò

Hai ragione. Quando esegui il dump della memoria otterrai una copia di ogni pagina mappata, quindi la mia distinzione tra "mappato in VM" e "caricato in DRAM" era irrilevante. Ho rimosso quella frase e la risposta è migliorata. Grazie!
Wandering Logic

Contrassegna la tua risposta come la risposta, perché sono tutte le informazioni che ho intenzione di ottenere :) dovrò fare il resto da solo, dopo tutto sono le mie ricerche.
Dutchy,

Quindi, sì .dynsym e e .dynstr (e altri) vengono utilizzati dal linker dinamico e vengono caricati nella memoria del programma (nel segmento di testo) e potrebbero essere utilizzati in fase di esecuzione dal programma.
ysdx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.