web-dev-qa-db-ja.com

文字列関数をバイパスするバッファオーバーフローエクスプロイトでバイトをエンコードすることは可能ですか?

免責事項:このエクスプロイトは純粋に教育用です。このエクスプロイトでは、被害者の役割を果たし、エクスプロイトされたソフトウェアは私だけが作成しました。

バッファオーバーフロー攻撃で悪用したい単純なHTTPサーバーがあります。 strcpy関数を介してリクエスト変数のバッファをオーバーフローさせる、悪意を持って作成されたHTTPリクエストを送信しています-シナリオは、開発者がstrncpyを使用するのを忘れたというシナリオです。

ただし、このプログラムのリターンアドレスの上書きには、解決方法がわからない2つの課題があります。

  1. Strcpyは、ソース文字列でNULLバイトを検出すると、コピーを停止します。したがって、戻りアドレスをNULLバイト0x00を含むターゲットアドレスで上書きすることはできますか?たとえば、ターゲットアドレスが0x407200の場合、\ x00\x72\x40と記述する必要があります。ただし、strcpyは最初の\ x00で戻り、\ x72\x40をコピーしません。したがって、strcpyが途中で返らないように\ x00をエンコードすることは可能ですか?

  2. 同様に、私のHTTPサーバーのHTTPパーサーは、HTTPリクエストをスペース文字\ x20を区切り文字としてトークンに分割します。したがって、\ x20を含むアドレスがstrtokによって2つの別々のトークンに分割されないように、上記のNULLターミネーターのようにこの文字をエスケープすることは可能ですか?

そうでない場合、これはバッファオーバーフロー攻撃の制限にすぎません。問題のプログラムの構築により、戻りアドレスを選択したターゲットアドレスで常に上書きできるとは限りません。

10
George Robinson

戻りアドレスのnullバイトは、打ち負かすのが困難です。コードではなくアドレスなので、エンコーディングスタブは使用できません。ただし、これを回避するにはいくつかの潜在的な方法があります。

1)完璧な住所を見つけます。時々、アプリケーションはコードをメモリ内のスタックまたは他の領域にコピーします。運が良ければ、jmp espなどの適切なopコードを含む静的な場所を見つけることができます。

2)Unicodeサポートを確認します。マルチバイト幅のUnicodeでは、ペイロードにnullバイトを含めることができます。

3)ヒープをスプレーして、ペイロードを含む可能性が高い所定のアドレスを作成することができる場合があります。この所定のアドレスは、nullバイトを含まないように選択できます。

幸運を

4
wireghoul

バッファオーバーフローを悪用している場合、asmコードの根本的なミスチェックが原因で攻撃が可能です。あなたの場合、strcpyの使用に誤りがあるため、いくつかの制限があります。実際、strcpyは文字列関数です。

あなたが言ったように、あなたは\ x00バイトを持つことができません。\x00を許可できるが、この場合は許可されない他のケース(stcpyに依存しない)を見つけることができます。 strcpyを呼び出す前に追加の「処理」が行われる場合があり、HTTPプロトコルでは\ x20としてバイトが制限されます。

これらの文字を使用せずにリターンアドレスを上書きしてペイロードを実行するには、エクスプロイトに取り組む必要があります。ペイロードの前にNop-slideを使用して成功できる場合があります。これにより、シェルコードアドレスをシフトできます。

Return to lib C 、または他の [〜#〜] rop [〜#〜] テクニックを使用することもできます。

3
r00t