BF Forked & Threaded Stack Canaries
キャナリーとPIE(Position Independent Executable)で保護されたバイナリに直面している場合、おそらくそれらをバイパスする方法を見つける必要があります。
checksec
がバイナリがキャナリーで保護されていることを見つけられない場合があることに注意してください。これは静的にコンパイルされており、関数を識別することができない場合です。
ただし、関数呼び出しの開始時にスタックに値が保存され、この値が終了前にチェックされる場合、これを手動で気付くことができます。
ブルートフォースキャナリー
単純なキャナリーをバイパスする最良の方法は、バイナリが新しい接続を確立するたびに子プロセスをフォークするプログラム(ネットワークサービス)である場合です。なぜなら、接続するたびに同じキャナリーが使用されるからです。
そのため、キャナリーをバイパスする最良の方法は、単に1文字ずつキャナリーをブルートフォースすることであり、推測されたキャナリーバイトが正しいかどうかを確認することができます。これは、プログラムがクラッシュしたかどうか、または通常のフローが続行されたかどうかを確認することによって行います。この例では、関数は**8バイトのキャナリー(x64)**をブルートフォースし、正しく推測されたバイトと誤ったバイトを区別します。別の状況では、try/exceptを使用することもできます。
例1
この例は64ビット用に実装されていますが、32ビット用にも簡単に実装できます。
例2
これは32ビット用に実装されていますが、簡単に64ビットに変更できます。 また、この例ではプログラムが最初に入力のサイズを示すバイトを期待していることに注意してください。
スレッド
同じプロセスのスレッドは同じキャナリートークンを共有するため、バイナリが攻撃が発生するたびに新しいスレッドを生成すると、キャナリーをブルートフォースすることが可能になります。
さらに、キャナリーで保護されたスレッド関数内のバッファオーバーフローは、TLSに格納されているマスターキャナリーを変更するために使用できます。これは、スレッドのスタック内のbofを介してTLSが格納されているメモリ位置に到達する可能性があるためです。 その結果、チェックが2つの同じキャナリーで使用されるため、対策は無効になります(変更されていても)。 この攻撃は、次の解説で実行されます: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
また、https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015のプレゼンテーションもチェックしてください。通常、TLSは**mmap
によって格納され、スレッドのスタック**が作成されるときも、これによって生成されると述べており、前述の解説に示されているようにオーバーフローが可能になるかもしれません。
その他の例と参照
64ビット、PIEなし、nx、BFキャナリー、一部のメモリに
execve
を呼び出すROPを書き込み、そこにジャンプします。
Last updated