みんな!
次のようなプログラム(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ライブラリを使用して)可能ですか?そうでない場合、代替手段はありますか?どんな提案でも大歓迎です!!!