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

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

4

1 回答 1

1

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

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

其他可能出错的事情:

  • arg1是一个无效的指针。你的程序崩溃了。
  • 引用的字符串arg1真的很长,你无法为其分配足够的内存。malloc失败并且您的程序崩溃。
  • 寻址的内存arg2小于 8 个字节,因此您的代码正在读取超出分配的内存。这可能不会崩溃,但结果将是......未定义。
  • 您假设这size_t是 4 个字节。你malloc应该是malloc(length+sizeof(size_t))
于 2017-05-10T14:00:26.060 回答