ノートンセキュリティを叩いて砕く(砕くな)

 めっちゃ大げさに書いてみたけどそれほどのことでもない。

 ちょっと具体的に言うと、いきなりポンとアドレスを指定してデータを参照しようとするとノートンに弾かれるけど、連続して参照しまくっていけばノートンに弾かれずデータの中身を見れるという話。

 

 ポインタに1を足すと、そのポインタの指すアドレスに1がたされるのではなく、ポインタの型のサイズだけアドレスが加算されることに注意してほしい。

例えば、

long x = 0;
longx_p;
x_p = &x;

などとして、x_p = 0x600000だったとする。

このとき、*(x_p + 1)が指すのは0x600001ではなく、long型が4バイトのデータ型であることから0x600004となるということ。

 

 まずはじめに、ポインタの復習をした私は、変数を定義していない領域の数値を参照できるのかと思い、次のプログラムを作った。

#include <stdio.h>

int main(){
    long x;
    longx_p;
    x_p = &x;
    printf("%d", *(x_p + 1));
    return 0;
}

 

出力は

6422036

となった。つまり、生成した変数の次のアドレスのデータを読むことができたわけだ。

 

 

楽しくなってきた。

 

 

次のプログラムはこれ

#include <stdio.h>

int main(){
    long xc = 0;
    longx_p;
    x_p = &x;
    while(1){
        printf("%d\n", *(x_p + c));
        c++;         //ここC++言語のタイトル回収みたいで興奮する
    }
    return 0;
}

出力させると無数に0が出てきたり、わけのわからん数字がいっぱい出てくるなどした。

(゚∀゚)キタコレ!!

盛り上がって来たぞおおおおおおおおおおおぉぉぉぉぉ!!!!!!!!

 

 

 

.

..

...

....

.....

と思いきや、途中でノートンに止められた。「データプロテクタはout_of_range.exeの複数の疑わしい処理を遮断しました」とかなんとか。

じゃあどこまで読めるのか。アドレスを一緒に表示させるようにした。

あと、4バイトずつ進むと時間がかかるので、変数をlong long型にして8バイトずつアドレスが下るようにした。(ここでは諸事情により、とりあえずアドレスを下ることにした。)

#include <stdio.h>
#include <iostream>

int main(){
    long long xc = 0;
    long longx_p;
    x_p = &x;
    while(1){
        std::cout << *(x_p + c<< "    " << (x_p + c<< std::endl;
        c--;
    }
    return 0;
}

なんどか試したが、0x424000より下のアドレスはノートンにブロックされてしまうという結果に終わった。

 

とまぁここまでやってきたが、何が言いたいかというと、直接アドレスを指定してデータを参照しようとするとノートン様に怒られてしまうが、連続してどんどんアクセスしまくる場合はノートン様はなにも言わないということ。つまり、目的のアドレス(他のプログラムで使っているかもしれない)を勝手に参照できてしまう(書き込みはおそらく不可能)。

 

ノートンは一発パンチをかますよりも、空条承太郎スタープラチナのようにラッシュで打ち破ることが可能。