gpt4 book ai didi

c - 如何在 C - uclibc、Linux、mips 中找到动态和静态指针指向的分配大小?

转载 作者:太空宇宙 更新时间:2023-11-04 10:46:43 24 4
gpt4 key购买 nike

情况 - 我正在使用第三方堆栈。我有第三方的源代码。这段代码相当笨拙,并且有很多与缓冲区溢出相关的问题。

我的解决方案 - 为了追查这个问题,我覆盖了现有的函数,如 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 是否小于缓冲区大小。瓶颈是如何根据传递的指针找到缓冲区的大小。

最佳答案

好吧,你能做的最好的事情就是在其他地方跟踪通过你自己的 malloc 副本分配的所有 block 的所需大小,然后让你的 memcpy 和 sprintf 副本测试指针是否是来自那个特殊分配函数的一个,然后是大小是否兼容。

构建这样一个系统基本上有两种方法:

  • 你的 malloc 将 2 * sizeof(int) 添加到所需的大小,将 signature 放入第一个 int,然后将所需的大小 int 放入第二个,并在之后返回一个指针那。然后memcpy和sprintf控制*(((int *) p) - 2)为签名,然后在*(((int *) p) - 1)<中获取可用长度。限制:签名可能在内存中的错误位置给出误报,并且无论如何在非特殊分配的指针上这样做会调用未定义的行为,因为您可以访问数组外部。但实现起来很简单
  • 你构建了一个数据结构(一种哈希)来存储分配的指针及其大小。然后 memcpy 和 sprintf 在该数据结构中寻找它们的指针。这里没有未定义的行为,但你必须在 C 中实现正确的数据结构

无论如何,这两种解决方案都有一个共同的缺陷:您只测试直接分配内存的缓冲区溢出 - 如果您分配一个 char 的二维数组,并且在对 first 以外的元素执行 sprintf 时发生缓冲区溢出,您将不会检测到它。如果您测试指针是否在分配 block 的开始 - 结束范围内,则可以使用第二种解决方案,但它会更昂贵。而且您无法控制堆栈分配的内存,也无法控制静态缓冲区。

关于c - 如何在 C - uclibc、Linux、mips 中找到动态和静态指针指向的分配大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32815095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com