栈迁移 Stack Pivoting
/LearnNote 2

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
作者
Administrator
发布于
更新于
许可