ねむみ高まる

文章力がないので、文章を書く練習をしています。

バッファオーバーフローを発生させて、その様子を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変数のアドレスをメモリウィンドウで表示してみると下図のように表示されました。

f:id:nemumitakamaru:20190112162027p:plain

char byte[4] = {0xaa, 0xab, 0xac, 0xad};の部分がちゃんと確保されていることが分かりました。

F10を押してステップ実行しmemset(byte, 0, 5);箇所を実行すると、下図のようになりました。

f:id:nemumitakamaru:20190112162316p:plain

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となっていた部分も消えました。変更された箇所が赤字になっていて見やすいですね。

更にステップ実行すると、下図のポップアップが表示され、クラッシュしました。

f:id:nemumitakamaru:20190112162658p:plain

スタックが破壊されると、それを検知して下記のエラー文が表示されるっぽいです。

Run-Time Check Failure #2 - Stack around the variable '変数名' was corrupted.