每个人!
我有这样的程序(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;
}
如您所见,存在一个导致内存溢出的错误。我想在运行时检测此类错误。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
然后如果有红色区域的内存访问,我会检测它们并将它们视为内存溢出错误。
当主进程包含对 malloc 的调用时,此 LD_PRELOAD 解决方案运行良好,但在分叉子进程执行此操作时失败。
例如,我们将“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 库)可能吗?如果没有,还有其他选择吗?任何建议表示赞赏!