elf のデフォルトの仮想アドレス (ph_vaddr) を 0x0 に変更できますか?
はい、それは実際にPIE
(位置に依存しない)実行可能ファイルが通常どのようにリンクされるかです。
echo "int main() { return 0; }" | gcc -xc - -fPIE -pie -o a.out
readelf -l a.out | grep LOAD | head -1
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
注: 上記は、タイプの実行可能ファイルを作成しますET_DYN
。
これはヌルポインタへのアクセスを許可しますか?
いいえ。カーネルが.e_type == ET_DYN
実行可能ファイルを検出すると、すべてのセグメントを別の場所に再配置します。
次のようにET_EXEC
、タイプの実行可能ファイルを で作成することもできます。.p_vaddr == 0
echo "int main() { return 0; }" | gcc -xc - -o a.out -Wl,-Ttext=0
readelf -l a.out | grep LOAD | head -1
LOAD 0x0000000000200000 0x0000000000000000 0x0000000000000000
カーネルはそれを実行することを拒否します:
./a.out
Killed