#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;
}
这是一个避免堆栈损坏的示例程序。是否还有其他功能来检查目的地长度和来源以避免堆栈损坏?
答案 0 :(得分:4)
你的问题字面意思是 -
给定指针,找到它指向的内存块的大小
不可能,也没有意义。因此,为了使此硬问题更简单,您需要做出一些假设,例如指针是char
指针,\0
将被视为End-Of-Block
指标。然后你可以使用像strlen
等
但是在你的情况下,这一切都没有好处,你正在做什么(使用MIN
)似乎没问题,而且你可以得到你想要的东西。
答案 1 :(得分:3)
您指向的概念不仅适用于堆栈损坏。它通常用于避免内存溢出。当与堆变量一起使用时,内存溢出可能导致堆栈损坏,或者当与堆变量一起使用时,堆会导致堆损坏。基本上它会导致不确定的行为。
避免这种情况的最佳方法是:
以下有关安全编码指南和实践的两个链接可能会有所帮助:
http://www.atsec.com/downloads/pdf/secure-coding-guidelines.pdf
https://www.securecoding.cert.org/confluence/display/seccode/Top+10+Secure+Coding+Practices