5

みんな!

次のようなプログラム(usemalloc)があるイメージ:

#include <stdio.h>
#include <stdlib.h>

#define USER_BYTES_SIZE 100

int main(void){
    char* userbytes = (char*)malloc(USER_BYTES_SIZE*sizeof(char));
    if(!userbytes)
        return 1;

    for(int i = 0; i <= USER_BYTES_SIZE; i++){ // "i <= USER_BYTES_SIZE" leads to an off-by-one memory overrun.
        userbytes[i] = 0;
    }
    return 0;
}

ご覧のとおり、メモリ オーバーフローを引き起こす off-by-one バグがあります。実行時にそのようなバグを検出したい。LD_PRELOADed ライブラリは、私の作業を行うのに適しています。libhijack.so という名前のライブラリを作成して、実際の malloc への呼び出しをハイジャックし、実際の malloc を呼び出して、実際の malloc によって割り当てられたメモリ ストリップの末尾にレッド ゾーンを追加するカスタムの malloc への呼び出しに置き換えます。libhijack.so のコードは次のようになります。

void* (*real_malloc) (size_t size);
void* malloc(size_t size){
    real_malloc = ((void*)(*)(size_t))dlsym(RTLD_NEXT, "malloc");
    void* allocbytes = (void*)real_malloc(size + 4); //put 2 bytes at each end, call them red zones
    return (allocbytes + 2);
}

次のコマンドを使用して、ライブラリでメイン プログラムを実行します。

LD_PRELOAD=./libhijack.so ./usemalloc

次に、レッド ゾーンでメモリへのアクセスがあれば、それらを検出し、メモリ オーバーフロー バグと見なします。

この LD_PRELOAD ソリューションは、メイン プロセスに malloc の呼び出しが含まれている場合はうまく機能しますが、フォークされた子プロセスがそれを行うと失敗します。

たとえば、「usemalloc」を次のように変更します。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // +

#define USER_BYTES_SIZE 100

int main(void){
    pid_t child = fork();
    if(child < 0)
        exit(1);

    if(child == 0){ //child process
        char* userbytes = (char*)malloc(USER_BYTES_SIZE*sizeof(char));
        if(!userbytes)
            return 1;

        for(int i = 0; i <= USER_BYTES_SIZE; i++){ // "i <= USER_BYTES_SIZE" leads to an off-by-one memory overrun.
            userbytes[i] = 0;
        }
    }
    else { //the current process
        wait(NULL);
    }
    return 0;
}

子プロセスで発生したオーバーフロー バグは、LD_PRELOADed ライブラリでは検出されません。

私の質問は次のとおりです。LD_PRELOADed ライブラリを使用して子プロセスのオーバーフロー バグを検出するにはどうすればよいですか? それは(LD_PRELOADedライブラリを使用して)可能ですか?そうでない場合、代替手段はありますか?どんな提案でも大歓迎です!!!

4

3 に答える 3

0

valgrindを使用して、メモリリークやその他のメモリの問題を検出します。それはうまく機能し、何も実装する必要はありません。

于 2013-01-02T09:56:02.437 に答える