file
5.36 mengatakannya dengan jelas
file
5.36 sebenarnya mencetaknya dengan jelas jika executable adalah PIE atau tidak. Sebagai contoh, executable PIE ditampilkan sebagai:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
dan yang non-PIE sebagai:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
Fitur ini diperkenalkan pada 5.33 tetapi hanya melakukan chmod +x
pemeriksaan sederhana . Sebelumnya hanya dicetak shared object
untuk PIE.
Pada 5.34, itu dimaksudkan untuk mulai memeriksa DF_1_PIE
metadata ELF yang lebih terspesialisasi , tetapi karena bug dalam implementasi itu benar-benar memecahkan banyak hal dan menunjukkan executable GCC PIE sebagai shared objects
.
Saya telah menafsirkan file
kode sumber, termasuk bug, dan byte mana dari format ELF yang diperiksa dalam detail yang luar biasa di: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a- Shared-object -bukan-of-an-executable-binary-sesuai-ke / 55704865 # 55704865
Ringkasan singkat perilaku file 5,36 adalah:
- jika
Elf32_Ehdr.e_type == ET_EXEC
- lain jika
Elf32_Ehdr.e_type == ET_DYN
- jika
DT_FLAGS_1
entri bagian dinamis hadir
- jika
DF_1_PIE
diatur DT_FLAGS_1
:
- lain
- lain
- jika file dapat dieksekusi oleh pengguna, grup, atau orang lain
- lain
GDB menjalankan executable dua kali dan melihat ASLR
Satu hal yang sangat langsung yang dapat Anda lakukan adalah menjalankan executable dua kali melalui GDB dan melihat apakah alamat berubah di seluruh run karena ASLR.
Saya telah menjelaskan bagaimana melakukannya secara rinci di: https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031 # 51308031
Walaupun ini tidak selalu merupakan solusi yang paling praktis dan tidak mungkin jika Anda tidak mempercayai yang dapat dieksekusi, itu menyenangkan dan melakukan pemeriksaan akhir yang benar-benar kami pedulikan, yaitu jika kernel Linux / dynamic loader mengubah lokasi yang dapat dieksekusi atau tidak.