Pengantar Linux ELF: Memahami dan Menganalisis

Ada hal-hal di dunia yang kita anggap remeh, meskipun itu adalah mahakarya sejati. Satu hal seperti itu adalah utilitas Linux seperti ls dan ps. Meskipun mereka biasanya dianggap sederhana, ini jauh dari kasus jika kita melihat ke dalam. Demikian juga ELF, Format yang Dapat Dieksekusi, dan Dapat Ditautkan. Format file yang digunakan secara universal, tetapi sedikit yang memahaminya. Panduan singkat ini akan membantu Anda memahami.



Setelah membaca panduan ini, Anda akan belajar:

  • Mengapa format ELF diperlukan dan untuk jenis file apa digunakan?
  • Struktur file ELF dan detail format
  • Cara membaca dan menganalisis konten biner dari file ELF
  • Alat apa yang digunakan untuk menganalisis file biner?

Apa itu file ELF?


ELF adalah singkatan dari Executable and Linkable Format, dan mendefinisikan struktur file biner, pustaka, dan file inti. Spesifikasi format memungkinkan sistem operasi untuk menafsirkan instruksi mesin yang terkandung dalam file dengan benar. File ELF biasanya merupakan file output dari kompiler atau linker dan memiliki format biner. Dengan menggunakan alat yang sesuai, dapat dianalisis dan dipelajari.

Mengapa mempelajari ELF secara detail?


Sebelum masuk ke detail teknis, tidak akan salah menjelaskan mengapa memahami format ELF berguna. Pertama, ini memungkinkan Anda untuk mempelajari operasi internal sistem operasi. Ketika terjadi kesalahan, pengetahuan ini akan membantu Anda lebih memahami apa yang sebenarnya terjadi dan untuk alasan apa. Selain itu, kemampuan untuk memeriksa file ELF dapat bermanfaat untuk menemukan lubang keamanan dan mendeteksi file yang mencurigakan. Dan akhirnya, untuk pemahaman yang lebih baik tentang proses pengembangan. Bahkan jika Anda memprogram dalam bahasa tingkat tinggi seperti Go, Anda masih akan lebih tahu apa yang terjadi di balik layar.

Jadi mengapa belajar ELF?

  • Untuk pemahaman umum tentang sistem operasi
  • Untuk pengembangan perangkat lunak
  • Digital Forensik dan Respon Insiden (DFIR)
  • Penelitian malware (analisis biner)

Dari sumber ke proses


Apapun sistem operasi yang kita gunakan, penting untuk menerjemahkan fungsi kode sumber ke dalam bahasa CPU - kode mesin. Fungsinya bisa menjadi yang paling mendasar, misalnya membuka file di disk atau menampilkan sesuatu di layar. Alih-alih menggunakan bahasa CPU secara langsung, kami menggunakan bahasa pemrograman yang memiliki fitur standar. Kompiler kemudian menerjemahkan fungsi-fungsi ini ke dalam kode objek. Kode objek ini kemudian ditautkan ke dalam program lengkap, dengan menggunakan tautan. Hasilnya adalah file biner yang dapat dieksekusi pada platform tertentu dan tipe CPU tertentu.

Sebelum Anda mulai


Posting ini mengandung banyak tim. Lebih baik menjalankannya di mesin uji. Salin binari yang ada sebelum menjalankan perintah ini pada mereka. Kami juga akan menulis program C kecil yang dapat Anda kompilasi. Pada akhirnya, latihan adalah cara terbaik untuk mempelajari sesuatu.

Anatomi File ELF


Kesalahpahaman yang umum adalah bahwa file ELF hanya untuk file biner atau file yang dapat dieksekusi. Kami telah mengatakan bahwa mereka dapat digunakan untuk bagian file yang dapat dieksekusi (kode objek). Contoh lain adalah file perpustakaan dan dump inti (file inti dan file a.out). Spesifikasi ELF juga digunakan di Linux untuk modul kernel dan kernel.



Struktur


Karena ekstensibilitas file ELF, struktur dapat bervariasi untuk file yang berbeda. File ELF terdiri dari:

  1. Header ELF
  2. data

Dengan perintah readelf, kita dapat melihat struktur file, dan itu akan terlihat seperti ini:



Header ELF


Seperti yang dapat Anda lihat di tangkapan layar, header ELF dimulai dengan "angka ajaib". "Angka ajaib" ini memberikan informasi tentang file. 4 byte pertama menentukan bahwa ini adalah file ELF (45 = E, 4c = L, 46 = F, mereka didahului oleh 7f).

Diperlukan header ELF. Diperlukan agar data ditafsirkan dengan benar selama menghubungkan dan eksekusi. Untuk pemahaman yang lebih baik tentang operasi internal file ELF, penting untuk mengetahui untuk apa informasi ini digunakan.

Kelas


Setelah mendeklarasikan tipe ELF, bidang kelas mengikuti. Nilai ini berarti arsitektur yang menjadi tujuan file. Itu bisa 01 (arsitektur 32-bit) atau 02 (64-bit). Di sini kita melihat 02, yang diterjemahkan oleh perintah readelf sebagai file ELF64, yaitu, dengan kata lain, file ini menggunakan arsitektur 64-bit. Ini tidak mengherankan, prosesor modern dipasang di mobil saya.

Data


Selanjutnya muncul bidang "data", yang memiliki dua opsi: 01 - LSB (Least Significant Bit), juga dikenal sebagai little-endian, atau 02 - MSB (Most Significant Bit, big-endian). Nilai-nilai ini membantu menafsirkan sisa objek dalam file. Ini penting karena berbagai jenis prosesor menangani struktur data secara berbeda. Dalam kasus kami, LSB digunakan, karena prosesor memiliki arsitektur AMD64.

Efek LSB menjadi terlihat saat menggunakan utilitas hexdump pada file biner. Mari kita lihat header ELF untuk / bin / ps.

$ hexdump -n 16 /bin/ps 0000000 457f 464c 0102 0001 0000 0000 0000 0000 0000010 

Kami melihat bahwa pasangan nilai berbeda, karena interpretasi urutan data.

Versi


Kemudian ikuti nilai magis lainnya "01", yang merupakan nomor versi. Hanya versi 01 yang saat ini tersedia, jadi angka ini tidak berarti sesuatu yang menarik.

OS / ABI


Setiap sistem operasi memiliki caranya sendiri untuk memanggil fungsi, mereka memiliki banyak kesamaan, tetapi, di samping itu, setiap sistem memiliki perbedaan kecil. Urutan pemanggilan fungsi ditentukan oleh Application Binary Interface (ABI). Kolom OS / ABI menjelaskan ABI mana yang digunakan dan versinya. Dalam kasus kami, nilainya adalah 00, yang berarti ekstensi spesifik tidak digunakan. Dalam output, ini ditampilkan sebagai Sistem V.

Versi ABI


Jika perlu, versi ABI dapat diindikasikan.

Mobil


Judul juga menunjukkan jenis mesin yang diharapkan (AMD64).

Jenis


Bidang jenis menunjukkan untuk apa file itu. Berikut adalah beberapa tipe file umum.

INTI (nilai 4)
DYN (File objek bersama), pustaka (nilai 3)
EXEC (File yang dapat dieksekusi), file yang dapat dieksekusi (nilai 2)
REL (File yang dapat dipindahkan), file sebelum menautkan (nilai 1)

Lihat judul lengkapnya


Meskipun beberapa bidang dapat dilihat melalui readelf, sebenarnya ada lebih banyak. Misalnya, Anda dapat mengetahui prosesor untuk file mana. Gunakan hexdump untuk melihat header ELF lengkap dan semua nilai.

 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 02 00 3e 00 01 00 00 00 a8 2b 40 00 00 00 00 00 |..>......+@.....| 40 00 00 00 00 00 00 00 30 65 01 00 00 00 00 00 |@.......0e......| 00 00 00 00 40 00 38 00 09 00 40 00 1c 00 1b 00 |....@.8...@.....| 

(output hexdump -C -n 64 / bin / ps)

Bidang yang disorot menentukan jenis mesin. Nilai 3e adalah desimal 62, yang sesuai dengan AMD64. Untuk mendapatkan gambaran tentang semua jenis file, lihat file header ini .

Meskipun Anda dapat melakukan semua ini dalam dump heksadesimal, masuk akal untuk menggunakan alat yang berfungsi untuk Anda. Utilitas dumpelf mungkin berguna. Ini menunjukkan output yang diformat cocok dengan header ELF. Akan baik untuk mempelajari bidang mana yang digunakan, dan apa nilai khasnya.

Sekarang, di mana kami telah menjelaskan arti dari bidang-bidang ini, sekarang saatnya untuk melihat apa sebenarnya sihir di belakangnya dan beralih ke judul berikutnya!

File data


Selain header, file ELF terdiri dari tiga bagian.

  • Header atau Segmen Program
  • Bagian atau Judul Bagian
  • Data

Sebelum kita menyelami header ini, akan berguna untuk mengetahui bahwa file ELF memiliki dua "tipe" yang berbeda. Salah satunya dirancang untuk tautan dan memungkinkan eksekusi kode (segmen). Yang lainnya adalah untuk perintah dan data (bagian). Tergantung pada tujuannya, jenis header yang sesuai digunakan. Mari kita mulai dengan tajuk program, yang terletak di file yang dapat dieksekusi ELF.

Judul program


File ELF terdiri dari nol atau lebih segmen, dan menjelaskan cara membuat proses, gambar memori untuk eksekusi runtime. Ketika kernel melihat segmen ini, ia menempatkannya di ruang alamat virtual menggunakan panggilan sistem mmap (2). Dengan kata lain, itu mengubah instruksi yang sudah disiapkan menjadi gambar dalam memori. Jika file ELF adalah biner biasa, ia membutuhkan tajuk program ini, jika tidak maka tidak akan berfungsi. Header ini digunakan, bersama dengan struktur data yang sesuai, untuk membentuk proses. Untuk pustaka bersama, prosesnya mirip.


Header program dalam file ELF biner

Kita melihat 9 judul program dalam contoh ini. Pada awalnya sulit untuk memahami apa artinya. Mari selami rinciannya.

GNU_EH_FRAME


Ini adalah antrian yang diurutkan yang digunakan oleh kompiler GCC. Ini menyimpan penangan pengecualian. Jika terjadi kesalahan, mereka digunakan untuk menangani situasi dengan benar.

GNU_STACK


Header ini digunakan untuk menyimpan informasi tumpukan. Fitur yang menarik adalah bahwa stack tidak harus dapat dieksekusi, karena ini dapat menyebabkan kerentanan keamanan.

Jika segmen GNU_STACK hilang, tumpukan dieksekusi digunakan. Utilitas scanelf dan execstack menunjukkan detail perangkat stack.

 # scanelf -e /bin/ps TYPE STK/REL/PTL FILE ET_EXEC RW- R-- RW- /bin/ps # execstack -q /bin/ps - /bin/ps 

Perintah untuk melihat tajuk program:

  • dumpelf (pax-utils)
  • elfls -S / bin / ps
  • eu-readelf โ€“program-header / bin / ps

Bagian ELF


Tajuk Bagian


Header bagian menentukan semua bagian file. Seperti yang telah disebutkan, informasi ini digunakan untuk menghubungkan dan relokasi.

Bagian muncul dalam file ELF setelah kompiler GNU C mengubah kode C menjadi assembler, dan assembler GNU membuat objek.

Seperti yang ditunjukkan pada gambar di atas, sebuah segmen dapat memiliki 0 bagian atau lebih. Ada empat bagian utama untuk file yang dapat dieksekusi: .text, .data, .rodata, dan .bss. Masing-masing bagian ini boot dengan izin yang berbeda, yang dapat dilihat dengan readelf -S.

.text


Berisi kode yang dapat dieksekusi. Ini akan dikemas dalam segmen dengan hak baca dan eksekusi. Itu diunduh satu kali, dan isinya tidak berubah. Ini dapat dilihat dengan utilitas objdump.

 12 .text 0000a3e9 0000000000402120 0000000000402120 00002120 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 

. data


Data diinisialisasi dengan izin baca dan tulis.

.rodata


Data diinisialisasi dengan izin hanya-baca. (= A).

.bss


Data tidak diinisialisasi dengan izin baca / tulis. (= WA)

 [24] .data PROGBITS 00000000006172e0 000172e0 0000000000000100 0000000000000000 WA 0 0 8 [25] .bss NOBITS 00000000006173e0 000173e0 0000000000021110 0000000000000000 WA 0 0 32 


Perintah untuk melihat bagian dan judul.

  • dumpelf
  • elfls -p / bin / ps
  • eu-readelf โ€“section-header / bin / ps
  • readelf -S / bin / ps
  • objdump -h / bin / ps

Grup Bagian


Beberapa bagian dapat dikelompokkan seolah-olah mereka membentuk satu kesatuan. Linker baru mendukung fungsi ini. Tetapi sementara ini tidak umum.

 # readelf -g /bin/ps There are no section groups in this file. 

Meskipun ini mungkin tampak tidak terlalu menarik, pengetahuan tentang alat analisis file ELF memberikan manfaat besar. Untuk alasan ini, ikhtisar alat-alat ini dan tujuannya diberikan pada akhir artikel.

Binari statis dan dinamis


Saat berurusan dengan binari ELF, akan berguna untuk mengetahui bagaimana kedua jenis file ini ditautkan. Mereka bisa statis dan dinamis, dan ini berlaku untuk perpustakaan yang mereka gunakan. Jika biner "dinamis", itu berarti ia menggunakan pustaka eksternal yang berisi beberapa fungsi umum, seperti membuka file atau membuat soket jaringan. Sebaliknya, biner statis menyertakan semua perpustakaan yang diperlukan.

Jika Anda ingin memeriksa apakah file itu statis atau dinamis, gunakan perintah file. Dia akan menunjukkan sesuatu seperti ini:

 $ file /bin/ps /bin/ps: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), <b>dynamically linked (uses shared libs)</b>, for GNU/Linux 2.6.24, BuildID[sha1]=2053194ca4ee8754c695f5a7a7cff2fb8fdd297e, stripped 

Untuk menentukan perpustakaan eksternal mana yang digunakan, cukup gunakan ldd pada biner yang sama:

 $ ldd /bin/ps linux-vdso.so.1 => (0x00007ffe5ef0d000) libprocps.so.3 => /lib/x86_64-linux-gnu/libprocps.so.3 (0x00007f8959711000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f895934c000) /lib64/ld-linux-x86-64.so.2 (0x00007f8959935000) 

Tip: Untuk melihat dependensi lebih lanjut, lebih baik menggunakan utilitas lddtree.

Alat analisis biner


Jika Anda ingin menganalisis file ELF, pasti akan berguna untuk melihat alat yang ada terlebih dahulu. Ada toolkit untuk membalikkan pengembangan binari dan kode yang dapat dieksekusi. Jika Anda baru menganalisis file ELF, mulailah dengan analisis statis. Analisis statis menyiratkan bahwa kami memeriksa file tanpa memulainya. Ketika Anda mulai lebih memahami pekerjaan mereka, beralihlah ke analisis dinamis. Jalankan contoh dan lihat perilaku nyata mereka.

Alat populer


Radare2


Toolkit Radare2 diciptakan oleh Sergi Alvarez. Angka 2 menyiratkan bahwa kode telah sepenuhnya ditulis ulang dibandingkan dengan versi pertama. Sekarang ini digunakan oleh banyak peneliti untuk mempelajari operasi kode.

Paket perangkat lunak


Sebagian besar sistem Linux sudah menginstal binutils. Paket lain dapat membantu Anda melihat informasi lebih lanjut. Toolkit yang benar akan menyederhanakan pekerjaan Anda, terutama jika Anda menganalisis file ELF. Saya telah menyusun di sini daftar paket dan utilitas untuk menganalisis file ELF.

elfutils
/ usr / bin / eu-addr2line
/ usr / bin / eu-ar - alternatif untuk ar, untuk membuat dan memproses file arsip
/ usr / bin / eu-elfcmp
/ usr / bin / eu-elflint - periksa kepatuhan dengan spesifikasi gABI dan psABI
/ usr / bin / eu-findtextrel - mencari relokasi teks
/ usr / bin / eu-ld - menggabungkan objek dan arsip file
/ usr / bin / eu-make-debug-arsip
/ usr / bin / eu-nm - menunjukkan simbol-simbol objek dan file yang dapat dieksekusi
/ usr / bin / eu-objdump - menampilkan informasi dari file objek
/ usr / bin / eu-ranlib - membuat indeks file arsip
/ usr / bin / eu-readelf - menampilkan file ELF dalam bentuk yang dapat dibaca
/ usr / bin / eu-size - menunjukkan ukuran setiap bagian (teks, data, bss, dll)
/ usr / bin / eu-stack - menunjukkan tumpukan proses saat ini atau dump kernel
/ usr / bin / eu-string - menampilkan string teks (seperti utilitas string)
/ usr / bin / eu-strip - menghapus tabel karakter dari file ELF
/ usr / bin / eu-unstrip - menambahkan simbol dan informasi debug ke biner
Catatan: paket elfutils akan menjadi awal yang baik, ini berisi sebagian besar alat analisis

elfkickers
/ usr / bin / ebfc - kompiler bahasa Brainfuck
/ usr / bin / elfls - menampilkan header program dan header bagian dengan flag
/ usr / bin / elftoc - mengkonversi biner ke program C.
/ usr / bin / infect - sebuah utilitas yang menginjeksi sebuah dropper menciptakan file setuid di / tmp
/ usr / bin / objres - membuat objek dari data biasa atau biner
/ usr / bin / rebind - mengubah pengikatan dan visibilitas karakter dalam file ELF
/ usr / bin / sstrip - menghapus komponen yang tidak perlu dari file ELF
Catatan: penulis paket ELFKickers berfokus pada memanipulasi file ELF, yang memungkinkan Anda untuk mendapatkan informasi lebih lanjut ketika bekerja dengan binari ELF "salah"

pax-utils
/ usr / bin / dumpelf - dump dari struktur ELF internal
/ usr / bin / lddtree - seperti ldd, dengan mengatur tingkat ketergantungan yang ditampilkan
/ usr / bin / pspax - menampilkan informasi ELF / PaX tentang proses yang sedang berjalan
/ usr / bin / scanelf - berbagai informasi, termasuk detail PaX
/ usr / bin / scanmacho - menampilkan detail binari Mach-O (Mac OS X)
/ usr / bin / symtree - menunjukkan karakter pohon
Catatan: beberapa utilitas dalam paket ini dapat memindai direktori secara rekursif, dan sangat ideal untuk menganalisis seluruh isi direktori. Fokusnya adalah pada alat penelitian PaX. Selain mendukung ELF, Anda dapat mengekstrak informasi dari binari Mach-O.

Contoh keluaran
 scanelf -a /bin/ps TYPE PAX PERM ENDIAN STK/REL/PTL TEXTREL RPATH BIND FILE ET_EXEC PeMRxS 0755 LE RW- R-- RW- - - LAZY /bin/ps 


prelink
/ usr / bin / execstack - Anda dapat melihat atau mengubah informasi tentang apakah stack dapat dieksekusi
/ usr / bin / prelink - memindahkan panggilan dalam file ELF untuk mempercepat proses

Pertanyaan yang Sering Diajukan


Apa itu ABI?


ABI adalah Application Binary Interface dan mendefinisikan antarmuka tingkat rendah antara sistem operasi dan kode yang dapat dieksekusi.

Apa itu ELF?


ELF adalah Format yang Dapat Dieksekusi dan Dihubungkan. Ini adalah spesifikasi format yang menentukan bagaimana instruksi ditulis dalam kode yang dapat dieksekusi.

Bagaimana saya bisa melihat jenis file?


Gunakan perintah file untuk analisis tahap pertama. Perintah ini dapat menunjukkan detail yang diambil dari angka dan judul "ajaib".

Kesimpulan


File ELF untuk eksekusi dan penautan. Tergantung pada tujuannya, mereka berisi segmen dan bagian yang diperlukan. Kernel OS memindai segmen dan memetakannya ke dalam memori (menggunakan mmap). Bagian dilihat oleh tautan yang membuat file yang dapat dieksekusi atau objek bersama.

File ELF sangat fleksibel dan mendukung berbagai jenis CPU, arsitektur mesin, dan sistem operasi. Ini juga dapat diperluas, setiap file dirancang secara berbeda, tergantung pada bagian yang diperlukan. Dengan menggunakan alat yang tepat, Anda dapat mengetahui tujuan file dan memeriksa isi file biner. Anda dapat melihat fungsi dan garis yang terdapat dalam file. Awal yang baik bagi mereka yang meneliti malware, atau untuk memahami mengapa proses berperilaku (atau tidak) dengan cara tertentu.

Sumber daya untuk studi lebih lanjut


Jika Anda ingin tahu lebih banyak tentang ELF dan rekayasa balik, Anda dapat melihat pekerjaan yang kami lakukan di Linux Security Expert. Sebagai bagian dari kurikulum, kami memiliki modul rekayasa terbalik dengan praktikum langsung.

Bagi Anda yang suka membaca, dokumen yang bagus dan mendalam: Format ELF dan makalah yang ditulis oleh Brian Raiter, juga dikenal sebagai ELFkickers. Bagi mereka yang suka memahami sumbernya, lihat tajuk ELF Apple yang terdokumentasi .

Kiat:
Jika Anda ingin menjadi lebih baik dalam menganalisis file, mulailah menggunakan alat analisis populer yang saat ini tersedia.

Source: https://habr.com/ru/post/id480642/


All Articles