Heap 堆溢出攻击,这段代码会出什么问题

Heap 堆溢出攻击,这段代码会出什么问题,heap,buffer-overflow,buffer-overrun,Heap,Buffer Overflow,Buffer Overrun,此代码是否遭受堆溢出攻击 那里很多事情都会出错。最重要的是,表达式*(c+i+4)=*(arg1)^(arg2[i%8])将在循环的第一次迭代中溢出分配的缓冲区 假设length==1。因此,您将为c分配5个字节。第一次通过循环时,i等于1。因此表达式c+i+4解析为c+5,比您分配的内存多出一个字节 其他可能出错的事情: arg1是无效指针。你的程序崩溃了 arg1引用的字符串非常长,您无法为其分配足够的内存malloc失败,程序崩溃 由arg2寻址的内存小于8个字节,因此代码的读取超出了分

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

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

假设
length==1
。因此,您将为
c
分配5个字节。第一次通过循环时,
i
等于1。因此表达式
c+i+4
解析为
c+5
,比您分配的内存多出一个字节

其他可能出错的事情:

  • arg1
    是无效指针。你的程序崩溃了
  • arg1
    引用的字符串非常长,您无法为其分配足够的内存<代码>malloc失败,程序崩溃
  • arg2
    寻址的内存小于8个字节,因此代码的读取超出了分配的内存。这可能不会崩溃,但结果将是。。。未定义
  • 您假定
    size\u t
    为4个字节。您的
    malloc
    应该是
    malloc(长度+sizeof(大小)
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;
}