Print Stack Canary
スタックの拡大表示
スタックオーバーフローに脆弱なプログラムが、puts関数をスタックオーバーフローの一部を指すように実行できる状況を想像してみてください。攻撃者は、キャナリの最初のバイトがヌルバイト(\x00
)であり、残りのキャナリがランダムなバイトであることを知っています。その後、攻撃者は、キャナリの最初のバイトだけが残るまでスタックを上書きするオーバーフローを作成する可能性があります。
その後、攻撃者は、ペイロードの中間でputs機能を呼び出し、キャナリのすべてを表示します(最初のヌルバイトを除く)。
この情報を使用して、攻撃者は(同じプログラムセッション内で)キャナリを知っている新しい攻撃を作成して送信できます。
明らかに、この戦術は非常に制限されており、攻撃者はペイロードの内容を表示してキャナリを外部に漏洩し、その後、新しいペイロードを作成して(同じプログラムセッション内で)実際のバッファオーバーフローを送信できる必要があります。
CTFの例:
64ビット、ASLR有効、PIEなし、キャナリのバイト0x00までオーバーフローを埋めてからputsを呼び出して漏洩させます。キャナリを使用して、GOTからputsのアドレスを漏洩させるためのROPガジェットが作成され、
system('/bin/sh')
を呼び出すためのROPガジェットが作成されます。32ビット、ARM、relroなし、キャナリ、nx、PIEなし。putsを呼び出してキャナリを漏洩させ、ROPチェーンで
system
を呼び出すret2libを使用します。r0(arg/bin/sh
)とpc(systemのアドレス)をポップするROPガジェット
任意の読み取り
フォーマット文字列によって提供されるような任意の読み取りを使用すると、キャナリを漏洩させることが可能になるかもしれません。この例をチェックしてください:https://ir0nstone.gitbook.io/notes/types/stack/canaries 、および以下のリンクで任意のメモリアドレスを読み取るためにフォーマット文字列を悪用する方法について読むことができます:
pageFormat Stringsこのチャレンジは、フォーマット文字列を非常に単純な方法で悪用して、スタックからキャナリを読み取ります
Last updated