file
5.36 diz claramente
file
5.36 realmente imprime claramente se o executável é TORTA ou não. Por exemplo, um executável PIE mostra como:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
e um não-TORTA como:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
O recurso foi introduzido na 5.33, mas fez apenas uma chmod +x
verificação simples . Antes disso, apenas imprimia shared object
para TORTA.
Na versão 5.34, ele deveria começar a verificar os DF_1_PIE
metadados ELF mais especializados , mas devido a um erro na implementação, ele realmente quebrou as coisas e mostrou os executáveis do GCC PIE como shared objects
.
Eu interpretei o file
código fonte, incluindo o bug, e exatamente quais bytes do formato ELF ele verifica com detalhes excruciantes em: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object de acordo com um binário executável de acordo com / 55704865 # 55704865
Um resumo rápido do comportamento do arquivo 5.36 é:
- E se
Elf32_Ehdr.e_type == ET_EXEC
- senão se
Elf32_Ehdr.e_type == ET_DYN
- se
DT_FLAGS_1
a entrada de seção dinâmica estiver presente
- se
DF_1_PIE
estiver definido em DT_FLAGS_1
:
- outro
- outro
- se o arquivo é executável por usuário, grupo ou outros
- outro
O GDB executa o executável duas vezes e consulte ASLR
Uma coisa muito direta que você pode fazer é executar o executável duas vezes através do GDB e verificar se o endereço muda entre as execuções devido ao ASLR.
Expliquei como fazer isso em detalhes em: https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031 # 51308031
Embora essa não seja necessariamente a solução mais prática e não seja possível se você não confia no executável, é divertido e faz a verificação final com a qual realmente nos preocupamos, ou seja, se o kernel / carregador dinâmico do Linux altera o local do executável ou não.