file
5.36 açıkça söylüyor
file
5.36, çalıştırılabilir PIE ise veya yoksa, net bir şekilde yazdırır. Örneğin, bir PIE yürütülebilir dosyası aşağıdakileri gösterir:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
ve PIE olmayan biri:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
Bu özellik 5.33'te tanıtıldı ancak sadece basit bir chmod +x
kontrol yaptı. Bundan önce shared object
PIE için basıldı .
5.34'te daha uzmanlaşmış olan DF_1_PIE
ELF meta verilerini kontrol etmeye başlamak gerekiyordu , ancak uygulamadaki bir hata nedeniyle gerçekte bir şeyleri kırdı ve GCC PIE çalıştırılabilirleri gösterdi shared objects
.
file
Hata kodunu içeren kaynak kodunu yorumladım ve tam olarak hangi ELF formatının bayt olarak kontrol ettiğini inceledim: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object -instead-of-the bir-yürütülebilir ikili-göre yapılır / 55704865 # 55704865
5.36 davranışının hızlı bir özeti:
- Eğer
Elf32_Ehdr.e_type == ET_EXEC
- aksi takdirde
Elf32_Ehdr.e_type == ET_DYN
- Eğer
DT_FLAGS_1
dinamik bölümü girişi mevcut olduğu
- eğer
DF_1_PIE
ayarlanır DT_FLAGS_1
:
- Başka
- Başka
- dosya kullanıcı, grup veya başkaları tarafından yürütülebilir ise
- Başka
GDB çalıştırılabilir dosyayı iki kez çalıştırıyor ve ASLR'yi görüyor
Yapabileceğiniz çok doğrudan bir şey yürütülebilir dosyayı GDB aracılığıyla iki kez çalıştırmak ve adresin ASLR nedeniyle değişip değişmediğini görmek.
Bunun nasıl yapıldığını ayrıntılı olarak açıkladım: https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031 # 51308031
Bu zorunlu olarak en pratik çözüm olmasa ve çalıştırılabilir dosyaya güvenmiyorsanız mümkün olmasa da eğlencelidir ve Linux çekirdeği / dinamik yükleyici çalıştırılabilir konumunu değiştiriyorsa ya da gerçekten umursadığımızı kontrol eder. değil.