栈迁移 Stack Pivoting
Stack pivohng是一种将程序真实的堆栈转移到伪造堆栈上的攻击技术,主要在控制sp和bp
漏洞原理:
函数入口和结尾对寄存器的处理的汇编代码:
(开始)
push rbp
mov rbp, rsp
(结尾)
leave:
mov esp,ebp
pop ebp
retn:
pop eip
从栈帧结构上来理解这个过程

图中给出主调函数(caller)和被调函数(callee)的栈帧布局,完整的表示:
caller之前的函数stackframe
caller调用完后EIP(代码段跳转)
caller的EBP始终指向此处,内容为caller之前的函数的ebp的地址
caller栈上的内容
(开始调用callee)
callee调用完后EIP
内容为caller的ebp的地址,现在callee的ebp始终指向此处
callee栈上内容
直观感受这个过程:
ebp-> -0xAX(不可能有负地址,这里只是方便表示)
~~~
esp-> 0x00 返回地址(在call的时候会push eip,假设现在已经执行)
0x04
0x08
0x0C
0x10
现在:
push ebp mov ebp, esp
(ebp1)-> -0xAX
~~~
0x00 返回地址
ebp,esp-> 0x04 -0xAX
0x08
0x0C
0x10
可以看到现在的ebp指向上个函数的基址,ebp=esp代表新函数的栈开始开辟,新函数的基址就是0x04
函数结束时:
leave
(move esp,ebp)
(ebp1)-> -0xAX
~~~
0x00 返回地址
ebp,esp-> 0x04 -0xAX
0x08
0x0C
0x10
ebp=esp代表栈清空了
(pop ebp)
(ebp1)ebp-> -0xAX
~~~
esp-> 0x00 返回地址
0x04 -0xAX
0x08 ?
0x0C ?
0x10 ?
看到指针状态都复原了
然后retn,在原有栈帧上继续执行
栈迁移 Stack Pivoting
http://47.100.250.251:8091/archives/zhan-qian-yi-stack-pivoting