栈迁移
栈迁移原理
先回顾一下 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/栈迁移原理/