假设我们有以下c代码
void fun(void){
printf("this is fun\n");
}
然后,我们以调试模式进行编译,得到以下反汇编代码:
push ebp
mov ebp,esp
sub esp, 0xc0
...
好的,我们只讨论:
sub esp, 0xc0
我的问题是:为什么这里的默认值是0xc0
,而不是其他值,例如0xF0
,0xFF
…等?
答案 0 :(得分:1)
这是标准的堆栈框架设置,先保存堆栈指针,然后使用EBP进行索引。从ESP减去的数量就是为过程的本地变量存储分配的数量,可以通过引用[EBP- ??]访问本地变量。
在没有看到您的过程的代码的情况下,很难说出为什么要分配这么多的存储空间。编译器没有使用默认值,它始终准确分配所需的内容。这样做是因为必须明确声明局部变量类型,并且编译器知道每种类型使用了多少空间。它没有随机性或不确定性,也没有分配额外存储空间的好处。我也看不到将局部变量存储大小随机化如何防止任何基于堆栈的攻击。大多数现代处理器都采用了防止硬件数据执行的措施,因此无论如何都无法进行这些攻击。