2016-08-06 5 views
-2

アドレスからデータを読み取るコードを書きました。このアドレスはコードセグメントに属しています(私はバイナリを逆アセンブルし、メインがどこにあるか検索するので、そこからアドレスが得られます)。主な目的はコンテンツを変更することです。私はそれを印刷すると、segfaultが発生します。それは何らかの保護ですか?それは保護のいくつかの種類segfault

void at(){ 


    char *p = 0x0000000100000f47; 
    printf("%c", p[0]); 

} 

int main(){ 

    at(); 

    return 0; 
} 
+0

オペレーティングシステム上でコードを実行していて、そのオペレーティングシステムがプログラムに物理メモリへのアクセス権を与えておらず、プログラム/プロセスに仮想アドレス0x0000000100000f47を割り当てていないことがあります。 – nos

+1

参照:http://stackoverflow.com/q/38686502/4068338 – Matsmath

+0

どうして 'char * p =(char *)main;'?そうすれば、絶対アドレスと再配置について心配する必要はありません。 – dxiv

答えて

2

ですか?

はい。セグメンテーション!そのため、セグメンテーション違反が発生します。

アドレスが

あまり言わないからですので、私は、メインがどこにある私のバイナリとのルックアップを逆アセンブル。実行可能ファイルがロードされると、その一部はに置き換えられ、に再配置されるため、別の場所に移動します。

これはかなり複雑なプロセスです(エラーが発生しやすい)、libc/rtloader /あなたのOS /黒い魔法が関係しています。しかし、ここではメモリレイアウトのランダム化が行われることもあります(おそらくコードではありません)。そのため、ランタイムは意図的に特定のもののメモリ位置を推測できないようにします。

+0

よろしいですか?それは確かにダミーの質問だった。おそらくコンピュータが同じバイナリを同じメモリ空間に置くことは不可能です。ありがとう –

+0

可能ですが、実行可能なローダーが何をするのではありません –