堆栈中的损坏

时间:2012-08-08 09:40:42

标签: c

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

这是一个避免堆栈损坏的示例程序。是否还有其他功能来检查目的地长度和来源以避免堆栈损坏?

2 个答案:

答案 0 :(得分:4)

你的问题字面意思是 -

  

给定指针,找到它指向的内存块的大小

不可能,也没有意义。因此,为了使此问题更简单,您需要做出一些假设,例如指针是char指针,\0将被视为End-Of-Block指标。然后你可以使用像strlen

这样的函数

但是在你的情况下,这一切都没有好处,你正在做什么(使用MIN)似乎没问题,而且你可以得到你想要的东西。

答案 1 :(得分:3)

您指向的概念不仅适用于堆栈损坏。它通常用于避免内存溢出。当与堆变量一起使用时,内存溢出可能导致堆栈损坏,或者当与堆变量一起使用时,堆会导致堆损坏。基本上它会导致不确定的行为。

避免这种情况的最佳方法是:

  1. 正确编程(即使用正确的逻辑),正如Kerrek SB在评论中正确指出的那样。
  2. 使用strncpy而不是strcpy,strncat而不是strcat等函数,这将有助于应用您尝试在此处应用的相同安全概念。
  3. 以下有关安全编码指南和实践的两个链接可能会有所帮助:

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