2012-08-08 188 views
0
#include <stdio.h> 
#include <string.h> 

#define SRC_BUFF_SIZE 32 
#define DST_BUFF_SIZE 8 

int tempfn1(char *p) 
{ 
    printf("p %p\n", p); 
    return 0; 
} 

int tempfn(char *ip, int size) 
{ 
    char pttt[DST_BUFF_SIZE]; 
    printf("ip %p\n", ip); 
    tempfn1(ip); 
    // ERROR - copying more data to a local buffer of 4 bytes 

    //memcpy(pttt, ip, size); // This will lead to stack corruption as  
           // the size exceeds the size of destination 

    // IDEALLY the copy should be done with min of size of destination buffer 
    // or source size rather than source size... 
    // anyways dest can hold only the size so it is better to crop the buffer 
    // than to crash due to overflow. 
    // proper call is as follows 
    #define MIN(a,b) (((a) < (b)) ? (a) : (b)) 
    memcpy(pttt, ip, MIN(size, DST_BUFF_SIZE)); 

    printf("ip %p\n", ip); 
    tempfn1(ip); 
    return 0; 
} 

int main() 
{ 
    char ip[SRC_BUFF_SIZE] = {0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 
    0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 
    0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 
    0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2 }; 
    tempfn(ip, SRC_BUFF_SIZE); 
    return 0; 
} 

這是一個避免堆棧損壞的示例程序。是否有其他函數來檢查目標的長度以及源以避免堆棧損壞?c中的堆棧損壞

+8

通常情況下,你不應該讓在明確的工作「避免堆棧損壞」。你應該正確編程。 – 2012-08-08 09:46:52

+1

請注意,您必須**將'%p'的參數強制轉換爲'void *'以避免未定義的行爲。 – Jens 2012-08-08 09:55:34

回答

3

您指向的概念不適用於堆棧損壞。它通常用於避免內存溢出。內存溢出可能會導致在與堆棧變量一起使用時損壞堆棧,或者在與堆變量一起使用時導致堆棧損壞。基本上它會導致未定義的行爲。

避免這個問題的最好的方法是:

  1. 要正確地編程(即,具有適當的邏輯),其Kerrek SB正確他的評論指出。
  2. 要使用像strncpy而不是strcpy,strncat而不是strcat等函數,這將有助於應用您在此嘗試應用的相同安全概念。

以下兩個關於安全編碼指南和實踐環節可能會有所幫助:

http://www.atsec.com/downloads/pdf/secure-coding-guidelines.pdf
https://www.securecoding.cert.org/confluence/display/seccode/Top+10+Secure+Coding+Practices

+0

這是你提到的一個非常好的網站。謝謝 – Angus 2012-08-08 10:27:52

4

你提的問題從字面上沸騰TO-

給定一個指針下來,發現它指向

這是不可能和沒有意義的內存塊的大小好。所以爲了使這個問題更簡單,你需要做一些假設,例如指針是char指針,而\0將被當作End-Of-Block指標。然後你可以使用像strlen等功能

但在你的情況下,這沒有什麼好,你在做什麼(使用MIN)似乎沒問題,並且儘可能接近你想要的。