file
5.36 lo dice chiaramente
file
5.36 in realtà lo stampa chiaramente se l'eseguibile è PIE o no. Ad esempio, un eseguibile PIE mostra come:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
e uno non PIE come:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
La funzione è stata introdotta in 5.33 ma ha fatto solo un semplice chmod +x
controllo. Prima di ciò è appena stato stampato shared object
per PIE.
In 5.34, doveva iniziare a controllare i DF_1_PIE
metadati ELF più specializzati , ma a causa di un bug nell'implementazione ha effettivamente rotto le cose e mostrato gli eseguibili GCC PIE come shared objects
.
Ho interpretato file
il codice sorgente, incluso il bug, ed esattamente quali byte del formato ELF controlla dettagliatamente in dettaglio su: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object -invece-di-un-eseguibile-binary-secondo-a / 55704865 # 55704865
Un breve riepilogo del comportamento del file 5.36 è:
- Se
Elf32_Ehdr.e_type == ET_EXEC
- altro se
Elf32_Ehdr.e_type == ET_DYN
- se
DT_FLAGS_1
è presente la voce di sezione dinamica
- se
DF_1_PIE
è impostato in DT_FLAGS_1
:
- altro
- altro
- se il file è eseguibile dall'utente, dal gruppo o da altri
- altro
GDB esegue il file eseguibile due volte e visualizza ASLR
Una cosa molto diretta che puoi fare è eseguire il file eseguibile due volte tramite GDB e vedere se l'indirizzo cambia tra le esecuzioni a causa di ASLR.
Ho spiegato come farlo in dettaglio su: https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031 # 51308031
Sebbene questa non sia necessariamente la soluzione più pratica e non possibile se non ti fidi dell'eseguibile, è divertente e fa il controllo finale che ci interessa davvero, cioè se il kernel / caricatore dinamico Linux cambia la posizione dell'eseguibile o non.