C函数栈帧

x86_64 & x86
函数基本结构

1
2
3
4
5
6
push rbp
mov rbp, rsp
...
mov rsp, rbp
pop rbp
ret


进入新函数的栈帧前,要要将调用函数指令的下一条指令地址压入栈里(调用者的栈帧)。

64位函数栈帧

再调用新函数前

rsp是00
调用新函数后

先把下一条指令的地址:jmp main+175 压入栈
此时rsp是08
因此在新函数栈帧中第一个push前rsp需要是08

若涉及栈对齐问题
可考虑在返回地址处先塞一个 ret 指令的地址
或者跳过第一个push

ret = pop ip(利用栈中的数据切换ip值)

像这种情况(ret2libc)

跳转到plt后
执行完plt中的句子
跳转到puts函数地址

32位函数栈帧


C函数栈帧
http://example.com/2025/03/04/C函数栈帧/
作者
yvyvSunlight
发布于
2025年3月4日
许可协议