理解新的gcc序言

理解新的gcc序言,gcc,assembly,intel,Gcc,Assembly,Intel,我想知道为什么gcc在函数中引入了一个新的序言(以及尾声)——特别是main(),因为我只分析了它。例如,以前是: push ebp mov ebp, esp sub esp, 0x... ; Allocate memory space into the stack ; ... Some code ; Epilogue leave ret 现在这有点复杂(至少要理解): 我理解它具体的作用,但我无法理解它的目的 当然。是否会使利用漏洞(堆栈溢出)的尝试变得更加棘手?另一个呼叫会议?只是为了

我想知道为什么gcc在函数中引入了一个新的序言(以及尾声)——特别是main(),因为我只分析了它。例如,以前是:

push ebp
mov ebp, esp
sub esp, 0x... ; Allocate memory space into the stack

; ... Some code

; Epilogue
leave
ret
现在这有点复杂(至少要理解):

我理解它具体的作用,但我无法理解它的目的 当然。是否会使利用漏洞(堆栈溢出)的尝试变得更加棘手?另一个呼叫会议?只是为了让堆栈更安全?(自从我在一次战争游戏中遇到这种东西)

最后,我的gcc版本是: gcc版本4.3.2(Debian 4.3.2-1.1)


提前谢谢

目的是在16字节边界上对齐堆栈。

您将4.3.2与哪个版本的GCC进行比较?没有人特别关注,但我记得旧版本没有这样的开场白/尾声……好的,在分析周围的指令之后,这似乎很明显,因为“and esp,0xfffffff0”本身是不够的。干杯,雷蒙德!在16字节上对齐的原因是SSE指令的对齐要求,这些指令可能对堆栈变量进行操作。通常,这种prolog只用于共享对象中的入口点(main)或导出函数;代码的其余部分假设调用者已经处理好了。谢谢你,Igor,这一点现在越来越明显了。
lea    ecx,[esp+0x4]
and    esp,0xfffffff0
push   DWORD PTR [ecx-0x4]
push   ebp
mov    ebp,esp
push   ecx
sub    esp,0x64

; Some code

; Epilogue
add    esp,0x64
pop    ecx
pop    ebp
lea    esp,[ecx-0x4]
ret