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