Mengapa `strip` tidak menghapus header bagian dari executable ELF?

9

Eksekusi ELF minimal hanya membutuhkan header ELF dan setidaknya satu header program agar berfungsi. Namun, ketika saya menjalankan strip pada executable pendek, ia memutuskan untuk tidak membuang tabel header bagian atau bagian string bagian, menjaga mereka tetap ada meskipun mereka tidak memiliki tujuan (sejauh yang saya tahu) untuk eksekusi program.

Apakah ada alasan mengapa ini tidak dihapus dengan strip? Apakah ada utilitas lain yang menghapus semua yang tidak diperlukan agar executable dapat dijalankan? Saya sudah mencoba mengedit secara manual kode-golf yang dapat dieksekusi yang saya buat untuk menghapus bagian header, dan tampaknya berfungsi dengan baik, dan jauh lebih kecil.

Misteri
sumber
Ini tidak dilucuti mungkin karena dapat merusak beberapa program / runtime
cat

Jawaban:

3

Dokumentasi untuk GNU binutilsstrip menyinggung alasannya, tetapi tidak eksplisit, menyebutkan dalam uraian tentang --only-keep-debugitu

Catatan - header bagian dari bagian yang dilucuti dipertahankan, termasuk ukurannya, tetapi isi bagian tersebut dibuang. Header bagian dipertahankan sehingga alat lain dapat mencocokkan file debuginfo dengan executable nyata, bahkan jika executable itu telah dipindahkan ke ruang alamat yang berbeda.

Artinya, kecuali disuruh secara eksplisit melalui -Ropsi, stripakan mempertahankan tajuk bagian untuk membantu program lain (termasuk gdb) melakukan pekerjaan mereka.

Halaman Penggunaan yang benar dari perintah strip (bagian dari Reverse Engineering menggunakan Sistem Operasi Linux ) mencatat

Menjalankan stripperintah pada executable adalah metode perlindungan program yang paling umum. Dalam operasi standarnya, stripperintah menghapus tabel simbol dan informasi debugging apa pun dari executable. Beginilah biasanya digunakan. Namun, masih ada informasi berguna yang tidak dihapus.

dan melanjutkan untuk menyebutkan beberapa hal berguna yang mungkin tertinggal - untuk analisis yang dapat dieksekusi.

Dalam Belajar Linux Binary Analysis , ini diulangi, berkomentar bahwa header bagian biasanya hanya hilang ketika seseorang dengan sengaja menghapusnya, dan tanpa header bagian, gdbdan objdumphampir tidak berguna.

Thomas Dickey
sumber