9

教育目的で、スタック ベースのバッファ オーバーフローを利用したいと考えています。

プログラムからの入力として、パラメーターが保存されるローカル バッファーが与えられる、main からのパラメーターで呼び出される典型的な関数があります。のような入力が与えられた場合nops+shellcode+address_shellcode、それを利用します。

strcpygdb でデバッグした後、パラメーターとして渡されるシェル コードのアドレスを見つけました。スタックを調べた直後に$ebp+8、戻りアドレスである がシェル コードのアドレスで正常に上書きされました。だから私は欲しいものを持っています。しかし、実行を進めると、次のようになりました。

->shellcode_address in ?? ()

その後

Cannot find bound of current function

リターンアドレスには、私が望む値があります。何が起こっているのですか?

また、それを実行すると、セグメンテーション違反が発生し、 でコンパイルしました-g -fno-stack-protector。なんで?

4

5 に答える 5

3

ほとんどの場合、関数のどこか (またはそのようなもの) でバッファー オーバーランの問題が発生しています。関数の現在のスタック フレームを無関係なデータで上書きし、プロセス内の戻りアドレスを破棄します。これは、通常、特にそこに格納されます。その結果、コードは予測できない場所に「戻り」、どこに戻ったのかを把握できなくなります。これがエラー メッセージの原因です。

于 2012-04-27T11:28:06.387 に答える
1

スタックでコードを実行し、GDBにどの関数を使用しているかを尋ねます。
明らかに、GDBは、どの関数も使用していないため、混乱しています。つまり、アドレスと「??」が表示されます

stack-protectorは、実行しようとしていることから正確に保護するため、-no-stack-protectorを使用してコンパイルする必要があります。
それを回避する方法がないと言っているわけではありませんが、それはより多くの努力とその保護メカニズムの十分な理解を必要とします。

于 2012-01-05T16:07:37.507 に答える
1

関数の戻りアドレスでレジスタを破損します。戻りアドレスは現在不正であり、デバッガーはそれにアクセスできません。エルゴのメッセージ。

于 2020-11-10T20:30:33.620 に答える
0

Linuxディストリビューションが最近のもので、x86っぽいアーキテクチャで作業していると仮定すると、ユーザー空間メモリからシェルコードを実行できなくなります(これは他のアーキテクチャにも当てはまりますが、私はそれらに精通していません). いくつかの理由がありますが、あなたの場合は nx ビットの設定が最も可能性が高いです。Linux セキュリティのマニュアル ページにアクセスすると、多数のセキュリティ対策がデフォルトで有効になっていることがわかります。それを回避する方法については、「2011年の楽しみのためにスタックを破壊する」をグーグルで検索してください。「-fno-stack-protector」を指定してコンパイルすることは、カナリア値を設定しないことを意味するだけです。しかし、これでは十分ではありません。教育目的でこれを行いたい場合は、virtualbox のような VM とその上に古いディストリビューションをインストールすることをお勧めします。

于 2012-01-05T15:19:53.827 に答える