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

在以上资料中,你可以学习到有关栈帧的知识,应当试图理解以下要点。

  1. 如何使用调用约定传参
  2. 如何使用rbp寄存器检索栈上的局部变量和参数
  3. 如何使用栈帧来维护调用关系

除此之外,还有两个要点。

  1. 栈向下生长
  2. 数据向上依次写入

还记得内存映射这一张的图吗?看看栈顶和栈底都在哪里?

显而易见,栈底在高地址而栈顶在低地址。因此栈push的时候,栈就会向下“生长”。而数据是从低地址写到高地址的,即“向上依次写入”。同时还有字节序的要求(小端序/大端序,通常是小端序)


下面可以结合资料思考一下,函数的返回地址存在栈帧的哪个位置?思考如果数据可以无限制地向上写入,又是否会修改掉这个返回地址。

最终你会发现了在栈溢出漏洞是如何毁掉栈帧,并控制程序跳转到任意想要执行的函数地址中去的。但是光能跳过去还不够,你想要调用的函数还需要一些参数,那么如何设置这些参数?

下一章节: Pwn —— ROP技术