理解新的gcc序言
我想知道为什么gcc在函数中引入了一个新的序言(以及尾声)——特别是main(),因为我只分析了它。例如,以前是:理解新的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 现在这有点复杂(至少要理解): 我理解它具体的作用,但我无法理解它的目的 当然。是否会使利用漏洞(堆栈溢出)的尝试变得更加棘手?另一个呼叫会议?只是为了
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