malloc 和 memcpy 的漏洞
Vulnerability of malloc and memcpy
void *copy_elements(void *ele_src[], int ele_cnt, size_t ele_size)
{
/*
* Allocate buffer for ele_cnt objects, each of ele_size bytes
* and copy from locations designated by ele_src
*/
void *result = malloc(ele_cnt * ele_size);
if (result == NULL)
/* malloc failed */
return NULL;
void *next = result;
int i;
for (i = 0; i < ele_cnt; i++) {
/* Copy object i to destination */
memcpy(next, ele_src[i], ele_size);
/* Move pointer to next memory region */
next += ele_size;
}
return result;
}
以上代码存在漏洞问题。在某些 ele_cnt
和 ele_size
值下,代码可能会崩溃。我怀疑它与 malloc
和 memcpy
发生的无符号 - 有符号转换有关,但我不确定如何正确利用它。如有帮助,将不胜感激!
我觉得下一个问题是+= ele_size不是你想的那样。添加指针时,它会自动与偏移量相乘。您可以在 for 循环中打印下一个值,以便您可以使用 printf("%p", next)
检查它是否为真
发布的代码存在多个问题:
- 由于
ele_cnt
是用有符号类型定义的,因此应该测试传递的值是负数还是零,并且 return NULL
无需尝试分配大量内存,这可能会导致运行时错误。
- 对于防御性编码,
ele_size
也不应为零。
next += ele_size;
无效,因为 next
具有 void *
类型。一些编译器允许它作为扩展,但代码不可移植。
- 一次复制一个元素效率低下,一次调用
memcpy
就足够了。
这是修改后的版本:
#include <stdlib.h>
#include <string.h>
void *copy_elements(const void *ele_src[], int ele_cnt, size_t ele_size)
{
/*
* Allocate buffer for ele_cnt objects, each of ele_size bytes
* and copy from locations designated by ele_src
*/
void *result;
if (ele_cnt <= 0 || ele_size == 0) {
/* invalid arguments */
return NULL;
}
if ((result = malloc(ele_cnt * ele_size)) == NULL) {
/* malloc failure */
return NULL;
}
/* copy all elements with a single call to memcpy */
return memcpy(result, ele_src, ele_cnt * ele_size);
}
void *copy_elements(void *ele_src[], int ele_cnt, size_t ele_size)
{
/*
* Allocate buffer for ele_cnt objects, each of ele_size bytes
* and copy from locations designated by ele_src
*/
void *result = malloc(ele_cnt * ele_size);
if (result == NULL)
/* malloc failed */
return NULL;
void *next = result;
int i;
for (i = 0; i < ele_cnt; i++) {
/* Copy object i to destination */
memcpy(next, ele_src[i], ele_size);
/* Move pointer to next memory region */
next += ele_size;
}
return result;
}
以上代码存在漏洞问题。在某些 ele_cnt
和 ele_size
值下,代码可能会崩溃。我怀疑它与 malloc
和 memcpy
发生的无符号 - 有符号转换有关,但我不确定如何正确利用它。如有帮助,将不胜感激!
我觉得下一个问题是+= ele_size不是你想的那样。添加指针时,它会自动与偏移量相乘。您可以在 for 循环中打印下一个值,以便您可以使用 printf("%p", next)
检查它是否为真发布的代码存在多个问题:
- 由于
ele_cnt
是用有符号类型定义的,因此应该测试传递的值是负数还是零,并且 returnNULL
无需尝试分配大量内存,这可能会导致运行时错误。 - 对于防御性编码,
ele_size
也不应为零。 next += ele_size;
无效,因为next
具有void *
类型。一些编译器允许它作为扩展,但代码不可移植。- 一次复制一个元素效率低下,一次调用
memcpy
就足够了。
这是修改后的版本:
#include <stdlib.h>
#include <string.h>
void *copy_elements(const void *ele_src[], int ele_cnt, size_t ele_size)
{
/*
* Allocate buffer for ele_cnt objects, each of ele_size bytes
* and copy from locations designated by ele_src
*/
void *result;
if (ele_cnt <= 0 || ele_size == 0) {
/* invalid arguments */
return NULL;
}
if ((result = malloc(ele_cnt * ele_size)) == NULL) {
/* malloc failure */
return NULL;
}
/* copy all elements with a single call to memcpy */
return memcpy(result, ele_src, ele_cnt * ele_size);
}