Nevím nic o PIE. Řekněte mi prosím, jak vytvořit spustitelný soubor nezávislý na pozici.
Position Independent Executable neboli PIE umožňuje přemístění programu, stejně jako sdílený objekt. Při každém spuštění programu lze program načíst na různé adresy, aby bylo pro útočníka těžší uhodnout určitý stav programu.
Spustitelný soubor PIE můžete zkompilovat a propojit jedním ze dvou způsobů. Nejprve vše zkompilujte pomocí -fPIE
a propojit s -pie
. Druhým je zkompilovat vše s -fPIC
a propojit s -pie
.
Pokud vytváříte sdílený objekt i program, pak vše zkompilujte pomocí -fPIC
. Propojte sdílený objekt s -shared
a propojte program s -pie
.
Nemůžete to udělat jinak. To znamená, že nemůžete vše zkompilovat pomocí -fPIE
a sestavit jak sdílený objekt, tak program. Podrobnosti naleznete v části Možnosti generování kódu v příručce GCC.
Jedna věc, na kterou je třeba dávat pozor na Androidu:vytváření pomocí PIE před verzí 4.1 způsobí chybu segmentace v /system/bin/linker
. PIE byl přidán v Androidu 4.1 a zhroutí menší verze.
Někdo mi řekl, abych dodal vlastní odkaz/zavaděč, abych se vyhnul problému, ale momentálně nemohu najít referenci.
Viz také Vylepšení zabezpečení v systému Android 1.5 až 4.1.
Chyba:podporovány jsou pouze spustitelné soubory nezávislé na pozici (PIE).
Ano, to je funkce Lollipop. Viz Vylepšení zabezpečení v systému Android 5.0.
Můžete zkontrolovat, zda je program vytvořen pomocí PIE pomocí readelf
:
$ readelf -l my-prog | grep -i "file type"
Elf filetype is DYN (shared object file)
Důležitá část je readelf
hlásí DYN
a nehlásí EXE
. EXE
znamená, že postrádá PIE, a to by mělo spustit chybu související se zabezpečením.
Související informace naleznete v tématu Je PIE (Position-independent executable) pro hlavní spustitelné soubory podporované v systému Android 4.0 (ICS)?
Vím, že je to staré téma, ale tento osvědčený způsob může některým lidem ušetřit čas
pomocí Hex-Editoru najděte 17. bajt, změňte hodnotu 02 na 03 a je to!