カナリア値を使用してみてください。これが基本的な方法です-いくつかあるとしましょうstruct
:
struct foo {
unsigned long bar;
void * baz;
};
次のように変更します。
struct foo {
unsigned long canary1;
unsigned long bar;
void * baz;
unsigned long canary2;
};
を初期化するときstruct
、いくつかの任意の値をcanary1
およびに入れますcanary2
。で何らかの操作を行うときはいつでもstruct
、値が同じままかどうかを確認してください。これにより、バッファ オーバーフローやスタック スマッシングが発生した場合に、それを検出できます。自動変数を使用して同じ内部関数を実行できます。
int foo(int bar) {
unsigned long canary1 = 0xDEADBABE;
char baz[20];
unsigned long canary2 = 0xBAD0C0DE;
...
}
等々。する前に、値が同じままであることを確認することを忘れないでくださいreturn
。また、コードを一貫して同じ場所にジャンプできる場合は、そこにコード (またはブレークポイント) を配置して、スタック トレースを取得してみてください。
GCC はこれらのカナリア値を単独で追加する方法を知っていますが、コンパイラがそれを実行できるかどうかはわかりません。ただし、手動で行うこともできます。