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

时间:2017-05-09 04:17:33

标签: heap buffer-overflow buffer-overrun

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;
}

此代码是否遭受堆溢出攻击?

1 个答案:

答案 0 :(得分:1)

那里有很多事情可能会出错。最重要的是,表达式*(c+i+4)=*(arg1)^(arg2[i%8])将在循环的第一次迭代中溢出分配的缓冲区。

想象一下length==1。因此,您将为c分配5个字节。第一次循环时,i等于1.因此表达式c+i+4解析为c+5,这比您分配的内存高一个字节。

其他可能出错的事情:

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