大学の宿題をしています。
リモートサーバーでシェルを実行する必要があります。 NXビットが設定されていないと言われていますが、挿入されたコードにリダイレクトすると、サーバーにセグメンテーションエラーが発生します。この場合、実際にはビットが設定されていると思いますか?挿入されたコードは、NOPのロードと、それに続くバッファー内のシェルコードです。 EIPを上書きして、バッファーの先頭近く(NOPスライド内)にリダイレクトしますが、すぐにセグメントエラーが発生します。
助けてくれてありがとう!
一度に1つの命令をステップ実行していて、ジャンプするとすぐにsegfaultが発生します(NOPスレッドの最後で壊れている可能性のあるシェルコードにヒットしたときではなく、segfaultも発生する可能性があります)。アドレスが正しいです。有効なメモリを指し、NOPスレッド自体は破損していないことを意味します。そうであれば、segfaultがDEPによって引き起こされている可能性があります。
ただし、上に挙げた他のことは私の考えではより可能性が高く、segfaultがポップアップする理由は他にもたくさんあります。
ちょうどあなたがgdbですべてを正しく持っていると確信しています。
破損したreturn命令の直前にブレークポイントが必要です。これは、disas
およびbreak
コマンドを使用して行うことができます。
プログラムがブレークポイントに到達したら、土地の状態を確認します。 info r
コマンドでeip
を確認します。 x/40x $esp
などを使用してスタックを確認してください。その後、nopスレッド、シェルコード、および返信アドレスを繰り返し表示できるはずです。頭に浮かんだもう1つのメモ。戻りアドレスは適切に調整する必要があります。これは通常、1〜3 nops afterシェルコードを挿入して、適切な位置に配置することを意味します。
問題がなければ、step
を実行します。 info r
がeip
にnopスレッド上のアドレスが含まれていると報告した場合、x %eip
でこれを確認すると、0x90909090
が表示されます。次にstep
をもう一度押します。 Ifこの時点でsegfaultが表示され、はい(元の質問に答えるために:P)DEPを有効にしています。
それがあなたがすでに知っているものすべてである場合は申し訳ありませんが、メモリエクスプロイトで遊んでいるときにすべてを数回チェックすることは非常に重要です。