栈帧介绍
栈迁移背景
在栈溢出构造rop链时,有时我们会遇到构造空间不够的情况。比如我们需要构造0x30字节的数据,而read()只能读入0x28字节。但是我们可以控制ebp及ret的值,此时可以利用栈迁移的方法拓展栈空间。
栈迁移条件
能够控制rbp及ret的值。
拥有一块可执行的内存,并且可以连续两次控制该内存。
栈迁移原理
在函数调用完返回时,会执行leave,ret两条汇编指令。
leave: mov esp ebp; pop ebp
ret : pop eip
根据栈帧的结构,pop ebp后栈顶位置就是要pop到eip中的值,即此时ret返回的地址为栈顶esp指向的内存中的地址,而esp指向的位置又可以由mov esp ebp控制。所以只要我们控制了ebp的地址,就可以间接控制函数的返回地址,从而达到攻击的目的。在攻击时我们需要连续两次执行leave_ret,从而控制函数返回地址。而一般函数在返回时会自动执行一次leave_ret。我们在攻击时,先将ebp地址改为我们所需要的地址,再将ret地址改为leave_ret的地址,便可达到连续两次执行leave_ret的目的。
攻击过程
我们以main函数调用漏洞函数fun()为例演示攻击过程
例题
链接:https://pan.baidu.com/s/1Lam6HamM0BWZgXh2RHCPrg?pwd=yk2j
提取码:yk2j
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
更正了一张图片,最上面的彩色区域为bss段,即shellcode所在的区域。