情况 - 我正在使用第三方堆栈。我有第三方的源代码。这段代码非常笨拙,并且存在很多与缓冲区溢出相关的问题。
我的解决方案——为了追查这个问题,我重写了现有的函数,如 sprintf 和 memcpy 来检查是否存在缓冲区溢出。
到目前为止,这是我为覆盖 malloc 和 sprintf 所做的工作。
#define memcpy my_memcpy
void * my_memcpy(void *s1, const void *s2, size_t n)
{
void *(*libc_memcpy)(void*,const void*,size_t) = dlsym(RTLD_NEXT, "memcpy");
return libc_memcpy(s1,s2,n);
}
接下来,我使用了 sprintf -
#define sprintf mysprintf
int mysprintf(char *str, const char *format, ...)
{
va_list args;
va_start(args, format);
vsprintf(str,format, args);
va_end(args);
return 0;
}
我的问题 - 我希望在缓冲区 - 目标容量较小时打印覆盖的函数,然后我们正在写入它。
我需要解决方案,它适用于堆栈分配的内存,如 char buff[5]; 和 char *buff = (char *) malloc(5);
因此,假设当我们对字符串大小为 6 字节的 buff 执行 memcpy 时,覆盖的 memcpy 应该会抛出错误。同样,当我们 sprintf 时,被覆盖的 sprintf 应该会抛出错误。主要问题是 sprintf。我想使用 snprintf 而不是 sprintf。很难查看每一段代码并更改为 snprintf。所以,我在这里要做的是用我的版本覆盖 sprintf 并在内部调用 snprintf,我将在其中根据 arg 的大小计算“n”。另外,我将比较 n 是否小于缓冲区大小。瓶颈是如何根据传递的指针找到缓冲区的大小。