2

私は Windbg を使用してプロセス メモリについて調べていますが、人々が受け入れていることに気が付かずにはいられません。レジスターを印刷する場合:

eax=00000000 ebx=008b6f00 ecx=01010101 edx=ffffffff esi=00000000 edi=00465000
eip=77f9d022 esp=05cffc48 ebp=05cffc54 iopl=0         nv up ei ng nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000286

ESP と EBP の値が EIP よりも低いことに注意してください。これは、スタックがプロセスのテキスト セクションよりもどこかにあることを意味します (!?)。どうしてこれなの?私の知る限り(Linuxでもgdbを使用して同じことを行いました)、スタックは高メモリにあり、テキストは低メモリにあると想定されています-多くの本が言うように。

私が気づいていないことがありますか?

4

2 に答える 2

4

スレッドスタックは、ユーザーモードの仮想アドレス空間内の任意のアドレス範囲に配置できます。VMMapは、プロセスのコミットされた仮想メモリタイプの内訳を示します。 ここに画像の説明を入力してください

于 2013-03-23T07:54:04.327 に答える
2

スタックは上位メモリにあり、テキストは下位にあるはずです

これは誤解です。プロセスの仮想メモリにどのように配置するかは、オペレーティング システムに完全に委ねられています。

特に、次の点に注意してください。

  • コード セグメントは 1 つではありません。実行可能ファイルと DLL は、隣接していないアドレス範囲にロードできます。
  • 単一のプロセス スタックはありません。各スレッドには独自の個別のスタックがあります。繰り返しますが、これらがメモリ内で隣り合っていると期待する理由はありません。

さらに、メモリ内の物の場所をランダム化することは、優れたセキュリティ プラクティスと見なされます。アドレス空間レイアウトのランダム化を参照してください。

于 2013-03-23T07:51:48.207 に答える