2017-05-09 67 views
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; 
} 

這段代碼是否遭受堆溢出攻擊?堆溢出攻擊,這個代碼可能會出錯

回答

1

很多事情可能會出現問題。最重要的是,表達式*(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))