問題タブ [buffer-overrun]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - バッファ オーバーフローの実験
私は最近、バッファ オーバーフローについて簡単に触れたセキュリティ クラスを受講しました。説明した内容に満足できなかったので、従うべきいくつかの例を探して自分で試してみたところ、バッファ オーバーフロー攻撃が見つかりました。
この例は、すべてが機能する理由を理解して理解するのが簡単なので気に入っています。私は従おうとしましたが、Windows ではなく Debian 仮想マシンで行いました。
これは、サイトの C コードです。
このコードは、foo と bar の 2 つの関数のアドレスを指定することで「チート」します。最終的な目標は、バッファ オーバーフローのみを使用してバーを実行することです。これを行うために、彼らは短い Perl スクリプトを提供しました。
私は Windows ではなく Linux を使用しており、bar
関数のアドレスがわずかに異なっていたため、いくつかの簡単な修正を行いました。
彼らの例と同じように機能するはずだと思います。Perl スクリプトが実行され、フィラー テキストがプログラムに渡され、その後に実行する新しいリターン アドレスが続きますbar
。しかし、それは私にはうまくいきません。
これは、Perl スクリプトを実行した結果の出力です。
私の出力では、フィラー テキストのいずれかを保持しているように見える唯一のアドレスは、最後のアドレスから 3 番目、リターン アドレスの直前のアドレスです。
この問題は、gcc を使用してプログラムをコンパイルしたことが原因であると思われますが、何が原因なのか正確にはわかりません。問題は Debian にある可能性もあります。プログラムをコンパイルした方法は次のとおりです。
私の希望は、スタック プロテクターなしでコンパイルすることで、問題なく例を追うことができるようになることでした。
どんな助けでも素晴らしいでしょう、私は完全に立ち往生しています。現実的には、単純に Windows に切り替えることもできますが、現時点では、Windows が機能しない理由と修正方法を本当に知りたいと思っています。
c - シェルコードを実行するためにバッファオーバーフローを使用する方法は?
バッファ オーバーフローがどのように機能するかを学んでいて、基本的なバッファ オーバーフローのケースをいくつか試しましたが、リターン アドレスの変更中にエラーが発生しました。戻りアドレスは正しく、そのメモリ内の操作も正しいのですが、私の問題はリップ (命令ポインター) がアドレスに移動しないことです。
私の簡単なプログラムコード:
最初にgdbで「str」アドレスを検索する0x7fffffffe0d0
と、それが見つかり、戻りアドレスが にある0x7fffffffe1d8
ので、NOPとシェルコードを入力するための264の空きスペースがあります。しかし、それをコンパイルした後、gcc はまだセグメンテーション エラーを表示し、デバッグすると、gdb0x00007fffffffe110 in ?? ()
はリターン アドレスが私が書いた構文と同じであることを私に尋ねました。そのメモリにはまだ NOP が含まれていて、命令ポインタはシェルコードにスレッドします。誰かが私の問題を解決するのを手伝ってくれますか?
gdb の私の構文:
ありがとう !!