2016-07-12 4 views
1

私はグラムを呼び出した関数の最初の命令を変更しようとしましたが、次のスニペットプロセス内の命令を変更するにはどうすればよいですか? Linuxの&のARMv7

int a = *(int*)g; 
*(int*)g=0; // segment fault! 
*(int*)g=a; 

第二の文にセグメント障害を持っによる無にこのセグメントのせいでした編集したい命令があるページのページテーブルエントリに権限を書き込みますか?

私は、プロセスの実行を維持しながら、私はこのように、いくつかのバグと機能にパッチを当てることができるかどうかを確認したかったので、私はそうしました:

1)機能グラムを持つプロセスが実行され、そのgにいくつかのバグがあることが判明しました。 patch_gという新しい機能を作成してください。バグはありません。

2) patch.so & のdlopen dlsymをの.soファイルに新しい関数をコンパイルします。 patch_gのアドレスを取得します。

4)jump patch_gGの最初の命令を変更するために上記のコードの第二文にいくらか類似いくつかのコードを()を使用)、実行中のプロセス

5サスペンド。

答えて

1

[OK]を試してみましょう。

#include <stdio.h> 

int (*functionPtr)(int,int); 

int addInt(int n, int m) { 
     return n+m; 
} 


int main() 
{ 
    functionPtr = &addInt; 
    printf("%p\n", functionPtr); 
    while(1){}; 
    *(int *) functionPtr = 0x0; 
    return 0; 
} 

コンパイル

$ gcc -o ./main.c main 

起動最初のコンソールで、このアプリ: ここコードです。

$ ./main 
0x40052d 
第2コンソールで

$ cat /proc/`pidof main`/maps 
00400000-00401000 r-xp 00000000 08:01 6345711       /tmp/main 
00600000-00601000 r--p 00000000 08:01 6345711       /tmp/main 
00601000-00602000 rw-p 00001000 08:01 6345711       /tmp/main 

...

このR-XPは、カーネルがこのバイナリをロードしたとき、それは読み取りとプライベート仮想マッピングにテキストセクションをマッピングされたことを意味し、許可を実行しますが、書き込み権限はありません。セキュリティ上の理由からこれが行われていると思います。

カーネルの適切なvma_areaが書き込み不可能とマークされているため、未処理のユーザースペースページフォルト、つまりsegfaultが発生します。

今let'usあなたはこれがあなたの実行時のパッチ適用のアイデアであなたを助けることに気づくでしょう適切な場所に

17   if (mprotect((void *)0x00400000, 4096, PROT_READ | PROT_WRITE | PROT_EXEC)) { 
18     printf("error\n"); 
19     return -1; 
20   } 

をMPROTECT呼び出しを追加します。

00400000-00401000 rwxp 00000000 08:01 6345711       /tmp/main 
00600000-00601000 r--p 00000000 08:01 6345711       /tmp/main 
00601000-00602000 rw-p 00001000 08:01 6345711       /tmp/main 
+0

ありがとう、アレックス。知っておくべきこと/ proc/pid/mapsとmprotect。 – xiaokaoy

関連する問題