栈迁移

栈迁移原理

先回顾一下 ret,leave 两条汇编指令

leave <=> mov esp,ebp; pop ebp

ret <=> pop eip

栈迁移基本原理

栈迁移核心特点在于汇编代码中有两个连续的leave,ret指令

利用其他类型的漏洞修改掉rbp ( ebp )的值

过程简单分析

最初正常程序执行时栈的情况:

esp—> …..
……
……
ebp—> last_func_ebp_addr
ret_addr

被攻击者攻击修改后的情况:

esp—> ……
…..
…..
ebp—> changed_address
ret_addr

其中 changed_address 往往是一片我们可写的区域,便于后续栈的结构的布置

随后进行leave,ret

leave_1:

……..
………
………
esp—> last_func_ebp_addr
ret_addr
ebp—> writeable_addr

ret_1:

程序正常进行下一个leave,ret

leave_2:

…….
……..
………
………
……….
writeable_addr
ebp—> writeable_addr +
esp—> writeable_addr +

这个时候就已经完成了栈迁移,这个时候esp 指向的内容已经完全由我们编写,包括ebp的位置也是我们能够控制的

ret_2:

这个时候的ret_addr就是我们第一次的changed_address下一个位置,随后就可以控制程序流程


栈迁移
http://example.com/栈迁移原理/
作者
briteny-pwn
发布于
2025年5月11日
许可协议