2012-08-08 232 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)似乎没问题,并且尽可能接近你想要的。