堆溢出攻击,这个代码可能会出错

问题描述:

char *test(char *arg1, char* arg2){ 
size_t length=strlen(arg1); 
char *c= malloc(length+4); 
for(int i=length;i>0;i--) 
    *(c+i+4)=*(arg1)^(arg2[i%8]); 
*(size_t *) (c) =length; 
return c; 
} 

这段代码是否遭受堆溢出攻击?堆溢出攻击,这个代码可能会出错

很多事情可能会出现问题。最重要的是,表达式*(c+i+4)=*(arg1)^(arg2[i%8])将在循环的第一次迭代中溢出您分配的缓冲区。想象一下length==1。所以你会为c分配5个字节。第一次通过循环,i等于1.因此,表达式c+i+4解析为​​,这是您分配的内存之后的一个字节。

其他的事情可能出错:

  • arg1是无效的指针。您的程序崩溃。
  • arg1引用的字符串非常长,您无法为其分配足够的内存。 malloc失败,您的程序崩溃。
  • arg2寻址的存储器小于8个字节,因此您的代码正在读取超出分配的内存。这可能不会崩溃,但结果将是...未定义。
  • 您认为size_t是4个字节。您的malloc应该是malloc(length+sizeof(size_t))