BF Forked & Threaded Stack Canaries
Last updated
Last updated
AWSハッキングの学習&実践:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習&実践:HackTricks Training GCP Red Team Expert (GRTE)
キャナリーとPIE(位置独立実行可能ファイル)で保護されたバイナリに直面している場合、それらをバイパスする方法を見つける必要があるかもしれません。
checksec
がバイナリがキャナリーで保護されていることを見つけられない場合があることに注意してください。これは静的にコンパイルされており、関数を識別することができない場合です。
ただし、関数呼び出しの開始時にスタックに値が保存され、この値が終了前にチェックされる場合、これを手動で気付くことができます。
単純なキャナリーをバイパスする最良の方法は、バイナリが新しい接続を確立するたびに子プロセスをフォークするプログラム(ネットワークサービス)である場合です。なぜなら、接続するたびに同じキャナリーが使用されるからです。
そのため、キャナリーをバイパスする最良の方法は、単に1文字ずつキャナリーをブルートフォースすることであり、推測されたキャナリーバイトが正しいかどうかを確認するために、プログラムがクラッシュしたかどうか、または通常のフローが続行されたかどうかをチェックできます。この例では、関数は8バイトのキャナリー(x64)をブルートフォースし、正しく推測されたバイトと誤ったバイトを区別します。これは、サーバーからの応答が送信されたかどうかをチェックするだけです(他の状況ではtry/exceptを使用することもできます):
この例は64ビット用に実装されていますが、32ビット用に簡単に実装できます。
これは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
によって格納され、スレッドのスタック**が作成されるときも、これによってmmap
によって生成されると述べられており、前述の解説に示されているようにオーバーフローが可能になるかもしれません。
64ビット、PIEなし、nx、BFキャナリー、メモリにexecve
を呼び出すROPを書き込み、そこにジャンプします。