我正在尝试了解有关在我的程序中利用/防止缓冲区溢出的方法的更多信息。我知道如果大小是常量的话,下面的代码是易受攻击的,但是如果大小每次都是随机的呢?还有办法从堆栈中抓取它并以某种方式动态地改变溢出字符的数量吗?
void vulnFunc(int size){
char buffer[size];
gets(buffer);
// Arbitrary code
}
答案 0 :(得分:0)
考虑 fgets(buf,sizeof(buf)-1,stdin);
使用stdin并且大小与缓冲区匹配。这将是安全的。还有其他可能性,例如带有getc(stdin)的循环:当数据变大时 你的缓冲区你可以realloc()。
答案 1 :(得分:0)
它取决于用于表示数组的变量,如果它的类型为char []或char *。让我解释一下原因:
对于char [],变量名表示一个数组,sizeof
运算符返回内存中数组的大小(单元格数* sizeof(type)),所以基本上你可以得到使用以下调用的单元格数:
的sizeof(阵列)/的sizeof(数组[0])
对于char *,变量是一个指针,它保存数组的第一个单元格的值,sizeof(array)在这种情况下将返回指针在内存中的大小对于64位架构是8Byte,它与数组没有任何关系,所以你无法从这种变量中获取信息。也许您可以将分配的缓冲区的大小存储在内存中,但我不知道它是否符合您的需求。