.dtorsは書き込み可能に見えますが、セグフォルト書き込みを試みます。

.dtorsは書き込み可能に見えますが、セグフォルト書き込みを試みます。

Ubuntu 9.04、2.6.28-11サーバー、32ビットx86。


$ cat test.c
main() { int *dt = (int *)0x08049f18; *dt = 1; }
$ readelf -S ./test
...
  [18] .dtors            PROGBITS        08049f14 000f14 000008 00  WA  0   0  4
...
$ ./test
Segmentation fault
$

初心者の場合:gccは.dtors終了後に呼び出されるelf実行可能ファイルにデストラクタセクションを作成しますmain()。テーブルは長い間書き込み可能で、私の場合はそうする必要があるようです(readelf出力を参照)。ただし、テーブルに書き込もうとするとセグフォルトが発生します。

私は最近読み取り専用の.dtors、pltsの傾向があることを知っていますが、私が理解していないのはreadelfsegfaultとの矛盾です。

ベストアンサー1

これらのセクションはGNU_RELRO(読み取り専用の再配置)として表示されます。つまり、動的ローダーがすべての再配置を変更すると(ロード時に遅延再配置がない場合)、そのセクションを読み取り専用としてマークします。ほとんどのコンテンツは.got.plt別のページにあるため処理されません。

を使用してリンクスクリプトを表示し、ld --verboseRELROを検索すると次のようなものが見つかります。

.got            : { *(.got) }
. = DATA_SEGMENT_RELRO_END (12, .);
.got.plt        : { *(.got.plt) }

これは、RELROセクションが12バイトで終わることを意味します.got.plt(ダイナミックリンカー関数へのポインタが確認されたため、読み取り専用として表示できます)。

強化されたGentooプロジェクトにはRELROに関する文書があります。http://www.gentoo.at/proj/en/hardened/hardened-toolchain.xml#RELRO

おすすめ記事