web-dev-qa-db-ja.com

ASCII-Armoringはどのようにバッファオーバーフロー攻撃を防ぐのに役立ちますか?

Wikipediaでのlibcへの攻撃 について読んでいました。

私がこの記事を読んで理解したことによると、ASCII armoringは、バイナリデータが8ビットのチャンクにグループ化されることにより、バイナリデータがASCII値に変換されることを意味します。

記事の引用:

実際、ASCII-Armoringを使用すると、すべてのシステムライブラリ(libcなど)のアドレスにNULLバイトが含まれます。それでも、この同じ概念をreturn-to-pltと呼ばれる類似のより高度な攻撃で使用できます。この場合、攻撃者はlibcに戻る代わりに、バイナリに読み込まれたPLT関数を使用します(例:system @ plt、execve @ plt、 sprintf @ plt、strcpy @ pltなど...).

ASCIIアーマーがバッファオーバーフローをどのように防ぐのか正確に説明できますか?システムライブラリアドレスにNULLバイトが含まれていると言う部分を理解できませんでした。return-to-pltバッファオーバーフローを防ぎますか?私は検索しましたが、return-to-plt攻撃に関する説明はあまり見つかりませんでした。

10
Karan

ある時点でアドレスがnullで終了する文字列として扱われる場合、この「ASCII-Armored」アドレスを含めると、strcpy、strlen、sprintfなどのnullで終了する文字列を処理する関数が、最後に処理を停止します。 libcアドレス。

7

Cでの多くのバッファオーバーフローは、境界チェックなしで不注意に文字列を固定サイズの配列に読み取った結果です。

Cの文字列は単純にcharの配列で、末尾に0またはNULL文字があります。 strcpyのような標準ライブラリ文字列関数は、NULL文字が検出されるまで、配列から配列に値をコピーするだけです。

ペイロードにシステムコールアドレスとしてNULLまたは0バイトを含めるように攻撃を強制することにより、不正な文字列の読み取りは、文字列が最終的にで終了したと見なして停止されます。

アドレス0xFFFF00FFは実際には4バイト(または文字)であり、そのうちの1つは0x00であることに注意してください。

マシンのバイトコードを使用してバッファオーバーフロー攻撃のペイロードを設計する場合、ハッカーは多くの場合、0バイトにならないように賢くする必要があります。

1
trognanders