6

最近、Ubuntu11.10でreturn-to-libcを使用して、悪用中に非実行可能スタックをバイパスするという論文に基づいて、return-to-libc攻撃の実験ベースを行っています。

実験の前に、ALSR を閉じました。

論文によると、gdb で環境変数 SHELL="/bin/bash" のアドレスを見つけることができます (gdb を使用して、攻撃したいプログラムをデバッグします)。

ここに画像の説明を入力
ここに画像の説明を入力

しかし、Return-to-libc の実験に使用しようとすると、このアドレスが間違っていることがわかりました。

次に、環境変数のアドレスを取得する簡単なプログラムを作成します。

ここに画像の説明を入力

ターミナルでこのプログラムを実行すると、正しいアドレスが得られます。

ここに画像の説明を入力

このアドレスを使用して、攻撃を行うことができます。これに関する関連する質問

も見つけました。しかし、答えは本当に意味がありません(2番目の方が良いかもしれません)。

これについての詳細を教えてください。

4

1 に答える 1

4

スクリーンショットから、32 ビットの Intel プラットフォームで実行していると推測できます。これに対する答えを完全に調査するのに時間を費やしていませんが、注目に値する点は次のとおりです。

  1. 環境全体がほぼ同じ場所にあり、C スタイルの文字列として密にまとめられているに違いありません。(試してみてくださいx/100s **(char***)&environ)。
  2. x86-64 インストールでこれを試したとき、環境の後に表示されたのは、コマンド ラインといくつかの空の文字列だけでした。
  3. では0xBffff47A、ユーザー アドレス空間 (で終わる0xC0000000) のトップに非常に近づいています。

だから、私の推測では、ここで起こっていることは次のとおりです。

  1. 環境ブロックとコマンド ライン パラメーターは、起動中のある時点で、ユーザー アドレス空間の最後に圧縮された形式で押し込まれます。
  2. GDB またはターミナルでプログラムを実行すると、環境の内容が異なります。たとえば、_=/usr/bin/gdbGDB で実行しているときに「

その結果、固定ポインターは環境ブロックの中央のどこかに着地する傾向がありますが、環境自体は実行ごとに変化するため、毎回同じ場所に着地するわけではありません。

于 2012-07-19T03:54:51.007 に答える