バッファオーバーフローを発生させて、その様子をVisual Studioのメモリウィンドウで見てみた
バッファオーバーフローとは??という感じだったので理解を深めるために、スタックベースのバッファオーバーフローを実際に発生させてみて、その様子をVisual Studioのメモリウィンドウで見てみます。
バッファオーバーフローを発生させるC++のソースコード
#include <iostream> using namespace std; void bufferOverFlow(void) { char byte[4] = {0xaa, 0xab, 0xac, 0xad}; memset(byte, 0, 5); } int main() { bufferOverFlow(); return 0; }
byte変数はchar型の4byteの配列なのですが、memset(byte, 0, 5);
とし、1byte分範囲外を0に設定するようにし、バッファオーバーフローするようにしています。
memset(byte, 0, 5);
の行にブレークポイントをはって実行し、byte変数のアドレスをメモリウィンドウで表示してみると下図のように表示されました。
char byte[4] = {0xaa, 0xab, 0xac, 0xad};
の部分がちゃんと確保されていることが分かりました。
F10を押してステップ実行しmemset(byte, 0, 5);
箇所を実行すると、下図のようになりました。
0x006FFBC0 00 00 00 00 00 cc cc cc a1 e7 95 6d a0 fc 6f 00 .....フフフ。・・m.・o. 0x006FFBD0 33 1f 9e 00 55 10 9e 00 55 10 9e 00 00 00 52 00 3.・.U.・.U.・...R.
char byte[4] = {0xaa, 0xab, 0xac, 0xad};
で確保した箇所が綺麗さっぱり消え、かつ範囲外でccとなっていた部分も消えました。変更された箇所が赤字になっていて見やすいですね。
更にステップ実行すると、下図のポップアップが表示され、クラッシュしました。
スタックが破壊されると、それを検知して下記のエラー文が表示されるっぽいです。
Run-Time Check Failure #2 - Stack around the variable '変数名' was corrupted.