2

テストは 32 ビット Linux で行われます

コードは次のとおりです。

int foo(int a, int b)
{
    int c = a + b;
    return c;
}

int main()
{
    int e = 0;
    int d = foo(1, 2);
    printf("%d\n", d);
    scanf("%d", &e);

    return 0;
}

cat /proc/pid/maps を使用してメモリ レイアウトを表示する と、コードとライブラリの3 つのテキストセグメントが表示されるようです。

ubuntu% cat /proc/2191/maps
08048000-08049000 r-xp 00000000 08:01 1467306    /home/shuai/work/asm/test1
08049000-0804a000 r--p 00000000 08:01 1467306    /home/shuai/work/asm/test1
0804a000-0804b000 rw-p 00001000 08:01 1467306    /home/shuai/work/asm/test1
09137000-09158000 rw-p 00000000 00:00 0          [heap]
b75c6000-b75c7000 rw-p 00000000 00:00 0
b75c7000-b776b000 r-xp 00000000 08:01 3149924    /lib/i386-linux-gnu/libc-2.15.so
b776b000-b776d000 r--p 001a4000 08:01 3149924    /lib/i386-linux-gnu/libc-2.15.so
b776d000-b776e000 rw-p 001a6000 08:01 3149924    /lib/i386-linux-gnu/libc-2.15.so
b776e000-b7771000 rw-p 00000000 00:00 0
b7780000-b7784000 rw-p 00000000 00:00 0
b7784000-b7785000 r-xp 00000000 00:00 0          [vdso]
b7785000-b77a5000 r-xp 00000000 08:01 3149914    /lib/i386-linux-gnu/ld-2.15.so
b77a5000-b77a6000 r--p 0001f000 08:01 3149914    /lib/i386-linux-gnu/ld-2.15.so
b77a6000-b77a7000 rw-p 00020000 08:01 3149914    /lib/i386-linux-gnu/ld-2.15.so
bfd47000-bfd68000 rw-p 00000000 00:00 0          [stack]

この問題に関するガイドを教えてもらえますか? 本当にありがとうございました!

4

2 に答える 2

4

列 3 (開始オフセット) と列 2 (権限) の値に注意してください。実際には、バイナリ ファイルの 1 行目と 2 行目で同じ部分が 2 回マップされていますが、3 行目では異なります。同じファイルを別々に複数回マップすることは許可されています。異なるシステムは、これを 1 つの VM マップ エントリにマージすることをスキップする可能性があるため、マッピング履歴は反映されますが、現在の状態の jist は反映されません。

ライブラリのマッピングを見ると、どのライブラリも個別にマッピングされるという法則を簡単に見つけることができます。

  • 読み取りと実行の許可がある場合: 変更してはならないメイン コード。
  • 読み取り許可あり: コードなしの定数データ領域が許可されています。
  • 読み取りと書き込みの許可がある場合: 非定数データ領域と共有オブジェクトの再配置テーブルを結合します。

同じ開始 4K バイナリ ファイル領域を 2 回マップすることは、RTLD ロジックで説明できます。RTLD ロジックは、ブートストラップが必要なため、任意のライブラリ ロジックとは異なります。プラットフォームの仕様によって簡単に異なる可能性があるため、私はそれをそれほど重要視していません。

于 2013-12-22T07:47:26.803 に答える
2

各ファイルの 3 つのセクションには、読み取り専用、読み取りと書き込み、読み取りと実行という異なるアクセス許可があることに注意してください。これはセキュリティのためです。コード セクション (read-execute) はエクスプロイトによって書き込むことができず、書き込み可能なセグメントは実行できません。

于 2013-12-22T05:43:10.310 に答える