file
5.36 mówi to wyraźnie
file
5.36 faktycznie drukuje to wyraźnie, jeśli plik wykonywalny jest PIE, czy nie. Na przykład plik wykonywalny PIE pokazuje się jako:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
i inny niż SROKA, ponieważ:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
Ta funkcja została wprowadzona w 5.33, ale wykonała jedynie prostą chmod +x
kontrolę. Wcześniej drukowane tylko shared object
dla SROKI.
W 5.34 zamierzano rozpocząć sprawdzanie bardziej wyspecjalizowanych DF_1_PIE
metadanych ELF, ale z powodu błędu w implementacji faktycznie coś zepsuło i pokazało pliki wykonywalne GIE PIE jako shared objects
.
Zinterpretowałem file
kod źródłowy, w tym błąd, i dokładnie to, które bajty formatu ELF sprawdza on wyjątkowo szczegółowo pod adresem : https://stackoverflow.com/questions/34519521/hy-does-gcc-create-a-shared-object -in-zamiast-pliku wykonywalnego-binarnego zgodnie z / 55704865 # 55704865
Szybkie podsumowanie zachowania pliku 5.36 to:
- Jeśli
Elf32_Ehdr.e_type == ET_EXEC
- inaczej jeśli
Elf32_Ehdr.e_type == ET_DYN
- jeśli
DT_FLAGS_1
jest obecny wpis sekcji dynamicznej
- jeśli
DF_1_PIE
jest ustawiony w DT_FLAGS_1
:
- wydrukować
pie executable
- jeszcze
- jeszcze
- jeśli plik jest wykonywalny przez użytkownika, grupę lub inne osoby
- wydrukować
pie executable
- jeszcze
GDB uruchom plik wykonywalny dwa razy i zobacz ASLR
Jedną bardzo bezpośrednią rzeczą, którą możesz zrobić, jest dwukrotne uruchomienie pliku wykonywalnego za pośrednictwem GDB i sprawdzenie, czy adres zmienia się w różnych biegach z powodu ASLR.
Wyjaśniłem, jak to zrobić szczegółowo na stronie : https://stackoverflow.com/questions/2463150/what-is-the-fpie-option-for-position-independent-executables-in-gcc-and-ld/51308031 # 51308031
Chociaż niekoniecznie jest to najbardziej praktyczne rozwiązanie i nie jest możliwe, jeśli nie ufasz plikowi wykonywalnemu, jest zabawny i wykonuje ostateczną kontrolę, na której nam naprawdę zależy, to znaczy, czy jądro Linux / moduł ładujący dynamicznie zmienia lokalizację pliku wykonywalnego lub nie.