4

elf のデフォルトの仮想アドレス (ph_vaddr) を 0x0 に変更できますか? これにより、ヌルポインターへのアクセスが許可されますか?? または、カーネルがアドレス 0 でのロードを許可していませんか?

あるセクションの p_vaddr を .text などの 0x0 に変更した場合、Linux はこれを許可しますか? 仮想アドレスが何らかの値の後にのみ開始できるという制約はありますか? ld --section-start を使用して .text vaddr を 0 から 9999 の間のどこかに設定しようとすると、強制終了されていました。どうなってるのか知りたいです??

4

2 に答える 2

3

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
于 2013-10-19T15:41:51.823 に答える