Bagian mana dari executable ELF yang dimuat ke dalam memori, dan di mana?

10

Apa yang sudah saya ketahui:

Eksekusi ELF memiliki sejumlah bagian, jelas bagian .text dan .data dimasukkan ke dalam memori karena ini adalah bagian utama dari program. Tetapi agar suatu program dapat berfungsi, ia membutuhkan lebih banyak info, terutama ketika dihubungkan secara dinamis.

Yang saya tertarik adalah bagian seperti .plt, .got, .dynamic, .dynsym, .dynstr, dan sebagainya. Bagian-bagian dari ELF yang bertanggung jawab untuk menghubungkan fungsi ke alamat.

Dari apa yang saya dapat mencari tahu sejauh ini, adalah bahwa hal-hal seperti .symtab dan .strtab tidak dimuat (atau tidak tinggal) dalam memori. Tetapi apakah .dynsym dan dan .dynstr digunakan oleh tautan? Apakah mereka tinggal di memori? Bisakah saya mengaksesnya dari kode program?

Dan apakah ada bagian yang dapat dieksekusi yang berada di memori kernel?

Ketertarikan saya pada ini sebagian besar forensik, tetapi informasi apa pun tentang topik ini akan membantu. Sumber daya yang saya baca tentang tabel ini dan tautan dinamis lebih tinggi, mereka hanya menjelaskan cara kerjanya, bukan sesuatu yang praktis tentang isi dalam memori.

Beri tahu saya jika ada yang tidak jelas tentang pertanyaan saya.

Orang Belanda
sumber

Jawaban:

12

Berikut ini adalah referensi yang sangat bagus: http://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ . Ini berisi daftar pustaka di akhir berbagai referensi yang berbeda di berbagai tingkatan. Jika Anda ingin mengetahui setiap detail berdarah, Anda bisa langsung ke sumbernya: http://www.akkadia.org/drepper/dsohowto.pdf . (Ulrich Drepper menulis tautan dinamis Linux.)

Anda bisa mendapatkan gambaran yang sangat bagus dari semua bagian di executable Anda dengan menjalankan perintah seperti "objdump -h myexe" atau "readelf -S myexe".

Bagian .interp berisi nama loader dinamis yang akan digunakan untuk menghubungkan simbol secara dinamis di objek ini. Bagian .dynamic adalah distilasi dari header program yang diformat agar mudah dibaca oleh loader dinamis. (Jadi memiliki pointer ke semua bagian lainnya.)

.Got (Global Offset Table) dan .plt (Procedure Linkage Table) adalah dua struktur utama yang dimanipulasi oleh linker dinamis. .Got adalah tabel tipuan untuk variabel dan .plt adalah tabel tipuan untuk fungsi. Setiap executable atau library (yang disebut "shared objects") memiliki .got dan .plt sendiri dan ini adalah tabel dari simbol yang dirujuk oleh objek bersama yang sebenarnya terkandung dalam beberapa objek bersama lainnya.

.Dynsyn berisi semua informasi tentang simbol-simbol di objek yang Anda bagikan (baik yang Anda tetapkan dan yang eksternal yang perlu Anda rujuk.) .Dynsyn tidak mengandung nama simbol yang sebenarnya. Itu terkandung dalam .dynstr dan .dynsyn memiliki pointer ke .dynstr. .gnu.hash adalah tabel hash yang digunakan untuk pencarian cepat simbol dengan nama. Ini juga hanya berisi pointer (pointer ke .dynstr, dan pointer yang digunakan untuk membuat rantai ember.)

Ketika objek yang Anda bagikan dereferences beberapa simbol "foo" linker dinamis harus pergi mencari "foo" di semua objek dinamis yang Anda tautkan untuk mencari tahu mana yang berisi "foo" yang Anda cari (dan kemudian apa yang relatif alamat "foo" ada di dalam objek yang dibagikan itu.) Linker dinamis melakukan ini dengan mencari bagian .gnu.hash dari semua objek bersama yang ditautkan (atau bagian .hash untuk objek lama yang dibagikan yang tidak memiliki .gnu. bagian hash.) Setelah menemukan alamat yang benar di objek bersama yang terhubung itu meletakkannya di .got atau .plt dari objek yang Anda bagikan.

Logika Pengembaraan
sumber
Terima kasih, tautan Anda membawa saya selangkah lebih maju dalam mencari tahu pemetaan virtual bagian yang saya butuhkan. Karena minat saya pada ini adalah forensik, "dimuat ke dalam DRAM" masih relevan bagi saya. Jika suatu bagian dipetakan tetapi tidak pernah dimuat, saya tidak akan dapat menemukannya di memori dump :)
Dutchy
Kamu benar. Ketika Anda melakukan dump memori Anda akan mendapatkan salinan dari setiap halaman yang dipetakan sehingga perbedaan saya antara "dipetakan ke dalam vm" dan "dimuat ke dalam DRAM" tidak relevan. Saya menghapus kalimat itu dan jawabannya ditingkatkan. Terima kasih!
Pengembaraan Logika
Tandai jawaban Anda sebagai jawabannya, karena ini sebanyak informasi yang akan saya dapatkan :) harus melakukan sisanya sendiri, ini adalah penelitian saya.
Dutchy
Jadi, ya .dynsym dan dan .dynstr (dan lainnya) digunakan oleh penghubung dinamis dan dimuat dalam memori program (dalam segmen teks) dan dapat digunakan saat runtime oleh program Anda.
ysdx