0

アドレス空間をスキャンして、読み取り/書き込み権限を持つメモリのチャンクを見つけようとしています。各ページには同じ権限があるため、ページごとに1つのアドレスを確認することは許容されます。セグメンテーション違反が発生するはずです。11メモリに書き込もうとすると、書き込めないはずです。これは、上位のアドレスにアクセスしようとしたときに発生しますが、下位の部分、たとえば0x00000100にいると、バスエラーが発生します:10。

注:コードは-m32フラグを使用してコンパイルされるため、32ビットマシンをシミュレートします。

注:chunk_listのメモリは、この関数が呼び出される前にすでにmallocされています。

以下のコードをコピーしました:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include "memchunk.h" 


int get_mem_layout (struct memchunk *chunk_list, int size)
{
//grab the page size
long page = sysconf(_SC_PAGESIZE);
printf("The page size for this system is %ld bytes\n", page);

//page size is 4069 bytes

//test printing the number of words on a page
long words = page / 4;  
printf("Which works out to %ld words per page\n", words);

//works out to 1024 words a page
//1024 = 0x400

//create the addy pointer
    //start will be used after bus error: 10 is solved
void *start;
char * currAddy;
currAddy = (char*)0x01000000;

//someplace to store the addy to write to
//char * testWrite;


//looping through the first size pages
int i;
for(i = 0; i < size; i++){

    //chunk start - wrong addy being written just testing
    chunk_list[i].start = currAddy;
    printf("addy is %p\n",currAddy);
    sleep(1);

    //try and write to the current addy
    //testWrite = currAddy;
    //*testWrite = 'a';

    *currAddy = '1';


    //+= 0x400 to get to next page
    currAddy += 0x400;
}


//while loop here for all the addys - not there yet because still dealing with bus error: 10

return 0;


}

どんな助けでも大歓迎です。また、コードにコメントアウトされた他のいくつかの試みを残しましたが、それでもすべてバスエラーが発生します:メモリスペースの下部に10。

編集:私は信号を使用してセグメンテーション違反に対処します。私はセグメンテーション違反に対処する方法を知っているので、バスエラーを処理する方法はありますか:10信号も使用しますか?

4

1 に答える 1

1

マップされていないメモリからの読み取りまたは書き込みは、バス障害を引き起こすと想定されています。メモリが存在するかどうかを検出するには、それに応じて反応する SEGFAULT のハンドラをインストールします。

Linux SE (Security Enhanced) プロセスでは、プログラム セクションがランダムな場所にロードされ、ウイルスが安定したアドレスに依存できるようになります。

ほとんどの仮想メモリ システムでは、マップされていない空間は通常、アドレス 0 から上に向かって残されるため、NULL ポインターまたは NULL ポインターに基づく構造体を逆参照しようとすると、例外が発生します。1980 年代、空白は 64K から 256K であることが多かった。最新のアーキテクチャでは、16M は NULL ベースのアクセスを検出するための妥当な選択です。

多くの仮想メモリ システムでは、プロセスごとにマップされたメモリ ロケーションを取得するためのシステム コールがあります。Linux では、 の内容を調べ/proc/self/mapsます。

于 2013-01-18T17:39:02.687 に答える