Pwn 栈帧
google关键词 [栈帧] [stack frame]
一些资料:
https://medium.com/@sruthk/cracking-assembly-stack-frame-layout-in-x64-75eb862dde08
https://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64
在以上资料中,你可以学习到有关栈帧的知识,应当试图理解以下要点。
- 如何使用调用约定传参
- 如何使用rbp寄存器检索栈上的局部变量和参数
- 如何使用栈帧来维护调用关系
除此之外,还有两个要点。
- 栈向下生长
- 数据向上依次写入
还记得内存映射这一张的图吗?看看栈顶和栈底都在哪里?
显而易见,栈底在高地址而栈顶在低地址。因此栈push的时候,栈就会向下“生长”。而数据是从低地址写到高地址的,即“向上依次写入”。同时还有字节序的要求(小端序/大端序,通常是小端序)
下面可以结合资料思考一下,函数的返回地址存在栈帧的哪个位置?思考如果数据可以无限制地向上写入,又是否会修改掉这个返回地址。
最终你会发现了在栈溢出漏洞是如何毁掉栈帧,并控制程序跳转到任意想要执行的函数地址中去的。但是光能跳过去还不够,你想要调用的函数还需要一些参数,那么如何设置这些参数?