1

私は最近、エクスプロイトとシェルコードを書くことを自分自身に教えてきました。ガイド/本の多くはスタックどこから始まるかを推測できると主張しているため、少しの作業で、シェルコードがスタックのどのアドレスから始まるかを推測できます。

  • スタックの開始アドレスが予測可能であるのはなぜですか?スタックはメモリ内のランダムなアドレスから開始するべきではありませんか?
  • スタックのアドレス開始が仮想アドレス空間の固定オフセットである場合、それがマシンごとに異なるのはなぜですか?
  • 異なるプラットフォーム間の許容誤差とスタックの開始アドレスはどれくらいですか?

関連:「スタックはすべてのプログラムで同じアドレスで始まります」ハッキングによるアドレスの問題:悪用の芸術なぜスタックアドレスはメモリアドレスの減少に向かって成長するのですか?

編集私のテストでは、アドレス空間配置のランダム化(ASLR)がオフになっています。

4

1 に答える 1

1

私の考えでは、スタックの開始アドレスを予測可能に決定することは、スタックのトップを変更できることほど重要ではありません。メソッドが呼び出されると、メソッドが戻ったときにコードの実行を再開する場所を指すプログラム カウンターを含む、さまざまなレジスタがスタックに格納されます。さらに、メソッドのローカル変数を格納するためにスタック領域が予約されます。(結局のところ、それらはどこかに格納する必要があります!) これらの変数は、場合によってはスタックのトップを上書きして、コードが実行を再開する場所を変更するために使用できます (たとえば)。通常、デバッガーを使用してメモリを逆アセンブルして調べるだけで、プログラム カウンターとの関係で変数がスタックのどこに到達するかを判断できます。あとは「シンプル」

これはあなたの 2 番目の 2 点には答えていません。最初の 2 点だけに答えていると思いますが、それは始まりです。

于 2012-03-20T18:53:18.010 に答える