Stack Overflow
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
スタックオーバーフローは、プログラムがスタックに割り当てられたよりも多くのデータを書き込むときに発生する脆弱性です。この余分なデータは隣接するメモリ空間を上書きし、有効なデータの破損、制御フローの混乱、そして潜在的には悪意のあるコードの実行を引き起こします。この問題は、入力に対して境界チェックを行わない安全でない関数の使用によってしばしば発生します。
この上書きの主な問題は、保存された命令ポインタ(EIP/RIP)と保存されたベースポインタ(EBP/RBP)が前の関数に戻るためにスタックに保存されていることです。したがって、攻撃者はそれらを上書きし、プログラムの実行フローを制御できるようになります。
この脆弱性は通常、関数がスタックに割り当てられたバイト数よりも多くのバイトをコピーするために発生し、他のスタックの部分を上書きできるようになります。
これに脆弱な一般的な関数には、strcpy
、strcat
、sprintf
、gets
などがあります。また、fgets
、read
、および**memcpy
のような長さ引数**を取る関数も、指定された長さが割り当てられたものより大きい場合に脆弱な方法で使用される可能性があります。
例えば、以下の関数が脆弱である可能性があります:
スタックオーバーフローを見つける最も一般的な方法は、非常に大きな入力の A
s を与えることです(例: python3 -c 'print("A"*1000)'
)そして、アドレス 0x41414141
にアクセスしようとしたことを示す Segmentation Fault
を期待します。
さらに、スタックオーバーフローの脆弱性があることがわかったら、リターンアドレスを上書きするために必要なオフセットを見つける必要があります。これには通常、デ・ブルイン列が使用されます。これは、サイズ k のアルファベットと長さ n の部分列に対して、長さ _n のすべての可能な部分列がちょうど一度だけ連続した部分列として現れる 循環列 です。
この方法により、EIP を制御するために必要なオフセットを手動で特定する代わりに、これらの列の1つをパディングとして使用し、上書きされたバイトのオフセットを見つけることができます。
これには pwntools を使用することが可能です:
または GEF:
オーバーフロー中(オーバーフローサイズが十分大きいと仮定すると)、スタック内のローカル変数の値を上書きすることができ、保存されたEBP/RBPおよびEIP/RIP(またはそれ以上)に到達します。 この種の脆弱性を悪用する最も一般的な方法は、戻りアドレスを変更することで、関数が終了すると制御フローがユーザーが指定したポインタの場所にリダイレクトされることです。
しかし、他のシナリオでは、スタック内のいくつかの変数の値を上書きするだけで悪用が可能な場合もあります(簡単なCTFチャレンジのように)。
この種のCTFチャレンジでは、バイナリ内に決して呼び出されない****関数があり、勝つために呼び出す必要があります。これらのチャレンジでは、戻りアドレスを上書きするためのオフセットを見つけ、呼び出す関数のアドレスを見つけるだけで済みます(通常、ASLRは無効になります)ので、脆弱な関数が戻ると、隠れた関数が呼び出されます:
Ret2winこのシナリオでは、攻撃者はスタックにシェルコードを配置し、制御されたEIP/RIPを悪用してシェルコードにジャンプし、任意のコードを実行することができます:
Stack Shellcodeこのテクニックは、前のテクニックに対する主要な保護を回避するための基本的なフレームワークです:実行不可能なスタック(NX)。これにより、バイナリ内の既存の命令を悪用して任意のコマンドを実行する他のいくつかのテクニック(ret2lib、ret2syscall...)を実行することができます:
ROP - Return Oriented Programingオーバーフローは常にスタック内で発生するわけではなく、例えばヒープ内で発生することもあります:
Heap Overflow脆弱性の悪用を防ぐためのいくつかの保護があります。詳細は以下を確認してください:
Common Binary Exploitation Protections & BypassesAWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)