09 长调用与短调用

上篇我们通过JMP FAR可以实现段间跳转,而要是现跨段调用则要用到CALL FAR,也就是长调用,在了解长调用前我们先看一下短调用。
短调用的指令格式:CALL 立即数/寄存器/内存
CALL指令在执行前会将返回地址压如堆栈,且ESP-4
长调用(跨段但不提权)的指令格式:CALL CS:EIP(EIP是废弃的)
CPU在执行该指令的时候并不使用EIP,CS需要我们给一个值,然后查GDT表。
CPL相同我们称为不提权,跟短调用不同的是,在执行前会将CS先压如栈中,然后才是将返回地址压栈,返回时长调用的时候我们需要用长返回RETF来返回长调用。长短调用的硬编码是不同的。
长调用(跨度安并提权)的指令格式:CALL CS:EIP(EIP是废弃的),此时他会将SS ESP CS压如堆栈然后才压返回地址。
跨段调用时,一旦有权限切换,就会切换堆栈;
CS的权限一旦改变,SS的权限也要随着改变,CS与SS的等级必须一样;
JMP FAR只能跳转到同级非一致性代码段,但CALL FAR可以通过调用门来提升CPL的权限。

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/86528699
09