相信大家都不陌生call指令了,但除了常见的段内调用(CS当前指向的段)外,还有其他几种不同的调用,手册上说明是有4种,在第 2A 卷: 指令集参考(A-L)中的CALL—Call Procedure

其中我们要说的另一种就是Far Call(段间调用),Far Call也分为两种类型,一种是特权级别相同的段间调用,一种是特权级别不同的段间调用
我们先来看看段内调用和段间调用的区别,在手册中第 1 卷: 基本架构的6.31中


共同点是都会改变Stack和EIP,不同点是Far Call还会改变CS并且会把调用前的CS压入栈中,在返回的时候也不同,Far Call会将栈顶返回地址popeip中,然后再将段选择子popcs中,返回时候具体区别在第 2B 卷: 指令集参考(M-Z)中的RET—Return from Procedure

还有一种就是特权级别不同之间的Far Call和return,这个解释在手册中的第 1 卷: 基本架构 6.3.6 CALL and RET Operation Between Privilege Levels




这里改变的值有eip cs ss esp,压入堆栈的东西也不同,保存了切换前代码段的堆栈位置,因为特权级别的不同发生了堆栈的切换,但切换esp和ss的值从哪来,这里有说明

  1. Temporarily saves (internally) the current contents of the SS, ESP, CS, and EIP registers.
  2. Loads the segment selector and stack pointer for the new stack (that is, the stack for the privilege level being
    called) from the TSS into the SS and ESP registers and switches to the new stack.
  3. Pushes the temporarily saved SS and ESP values for the calling procedure’s stack onto the new stack.

这里要注意的一点是如果在Far Calls in Protected Mode下(第 2A 卷: 指令集参考(A-L)CALL—Call Procedure),那么

大概意思就是会通过提供的段选择子来进行对段描述符的访问

这里提出了如果是不同权限间的代码段调用,使用调用门是首选的办法,使用调用门会进行权限的提升,后面还说了

When executing an inter-privilege-level far call, the code segment for the procedure being called must be accessed through a call gate. The segment selector specified by the target operand identifies the call gate. Here again, the target operand can specify the call gate segment selector either directly with a pointer (ptr16:16 or ptr16:32) or indirectly with a memory location (m16:16 or m16:32). The processor obtains the segment selector for the new code segment and the new instruction pointer (offset) from the call gate descriptor. (The offset from the target operand is ignored when a call gate is used.) On inter-privilege-level calls, the processor switches to the stack for the privilege level of the called procedure. The segment selector for the new stack segment is specified in the TSS for the currently running task. The branch to the new code segment occurs after the stack switch. (Note that when using a call gate to perform a far call to a segment at the same privilege level, no stack switch occurs.) On the new stack, the processor pushes the segment selector and stack pointer for the calling procedure’s stack, an (optional) set of parameters from the calling procedures stack, and the segment selector and instruction pointer for the calling procedure’s code segment. (A value in the call gate descriptor determines how many parameters to copy to the new stack.) Finally, the processor branches to the address of the procedure being called within the new code segment.

大概理解一下就是在执行特权级之间的远距离调用时,必须通过调用门访问被调用过程的代码段。目标操作数指定的段选择子标识了调用门。处理器从调用门描述符中获取新代码段的段选择子和新指令指针(偏移量).(使用调用门时,与目标操作数的偏移将被忽略。)
举个例子,call cs:eip这里这条指令
在执行特权级之间的远距离调用时,必须通过调用门,而cs指向的段描述符必须是一个调用门,而我们cpu最终执行代码的位置并不是由后面接的操作数eip决定的,而是通过cs中指向的调用门中获取新代码段的段选择子和新指令指针(偏移量),也就是在使用调用门时候后面的eip是被忽略的

如果是同级别的话

A far call to the same privilege level in protected mode is very similar to one carried out in real-address or virtual-8086 mode. The target operand specifies an absolute far address either directly with a pointer (ptr16:16 or ptr16:32) or indirectly with a memory location (m16:16 or m16:32). The operandsize attribute determines the size of the offset (16 or 32 bits) in the far address. The new code segment selector and its descriptor are loaded into CS register, and the offset from the instruction is loaded into the EIP register

大概意思就是 目标操作数可以直接使用指针(ptr16:16或ptr16:32)或间接使用内存位置(m16:16或m16:32)指定绝对远程地址。
新的代码段选择器及其描述符被加载到CS寄存器中,指令的偏移量被加载到EIP寄存器中。也就说是后面的EIP是有效的

总结一下:
1.跨段调用时,一旦有权限切换,就会切换堆栈
2.CS的权限一旦改变,SS的权限也要跟随改变,CS和SS的权限等级必须一致
3.JMP FAR 只能跳转到同级非一致代码段,但CALL FAR 可以通过调用们进行提权,提升CPL权限
4.切换栈时候ESP和SS从哪来,参见TSS段
5.执行特权级之间的远距离调用时call cs:eip中的Eip是被忽略的,如果是同级别权限eip则是有效的

[windows内核]长调用与短调用相关推荐

  1. Windows保护模式(三)长调用与短调用调用门

    长调用与短调用 短调用 指令格式 CALL 立即数 / 寄存器 / 内存 堆栈变化 发生改变的寄存器 ESP EIP 长调用(跨段不提权) 指令格式 CALL CS:EIP(如果是通过调用门则 EIP ...

  2. 保护模式(四)长调用与短调用 调用门

    Windows保护模式学习笔记(三)-- 长调用/短调用/调用门 前言 要点回顾 长调用与短调用 一.短调用 二.长调用(跨段不提权) 三.长调用(跨段并提权) 长调用执行时: 执行返回(RETF)时 ...

  3. 段间转移、长调用、短调用

    段间转移不同于段内转移,段间转移同时修改CS:EIP,而段内转移只修改EIP 如JMP FAR 与JMP之间的区别 段间转移 JMP 0x20:0x004183D7 流程             1. ...

  4. 【2021.03.19】长调用与短调用

    要点回顾 通过前文知道JMP FAR可以实现段间跳转,如果要实现跨段的调用就必须要学习CALL FAR,也就是长调用. CALL FAR 比 JMP FAR 要复杂,JMP并不影响堆栈,而CALL指令 ...

  5. 长调用与短调用 调用门

    cs里的是一个段选择子 1:拆分段选择子,查GDT表 2:该段描述符为系统描述符,s位为0,TYPE为1100,是一个门描述符(DPL必须为3,不然该描述符的权限检查过不去) 3:该描述符的16到31 ...

  6. 10.[保护模式]长调用与短调用

    CALL FAR 长调用最终需要执行的代码由CS段选择子找到的调用门决定的 提权的时候堆栈发生了切换,保留原CS,ESP,SS 返回也是RETF 总结: 1.跨段调用时,一旦有权限切换,就会切换堆栈: ...

  7. Windows保护模式学习笔记(三)—— 长调用/短调用/调用门

    Windows保护模式学习笔记(三)-- 长调用/短调用/调用门 要点回顾 长调用与短调用 一.短调用 二.长调用(跨段不提权) 三.长调用(跨段并提权) 长调用执行时: 执行返回(RETF)时: 总 ...

  8. (9)跨段跳转,短调用和长调用堆栈图

    一.回顾 上一节,我们学习了 JMP FAR 实现段间跳转,该指令修改了 CS 和 EIP.本节我们学习长调用 CALL FAR,该指令除了修改 CS和EIP,还会修改堆栈. 二.CALL 堆栈图 学 ...

  9. [转](9)跨段跳转,短调用和长调用堆栈图

    一.回顾 上一节,我们学习了 JMP FAR 实现段间跳转,该指令修改了 CS 和 EIP.本节我们学习长调用 CALL FAR,该指令除了修改 CS和EIP,还会修改堆栈. 二.CALL 堆栈图 学 ...

最新文章

  1. PHP CURL 多线程 GET/POST 类
  2. 前端教程丨手把手教你用 Next.js 搭建个人博客,从入门到吃鸡
  3. (九)python3 只需3小时带你轻松入门——函数自定义
  4. 远程办公招聘_招聘远程人才时要寻找的5种技能
  5. opengl png图片 qt_Qt资源文件的格式,并用CMake添加Qt资源文件
  6. 品质创新,江铃控股携手华天软件CAPP系统决战SUV中高端市场
  7. Android 开发之旅:深入分析布局文件又是“Hello World!”
  8. 监控摄像机的区别和分类
  9. Google Protocol Buffer
  10. python决策树代码解读_建模分析之机器学习算法(附pythonR代码)
  11. Emacs 中英文字体设置
  12. ASM 管理 转自三思笔记
  13. 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)
  14. 基于SPI协议的Flash驱动控制-数据普通读操作
  15. 【更新】四种WinRAR永久去广告方法
  16. [GYCTF2020]Ez_Express
  17. nyoj 81 迷宫寻宝
  18. 解决Vue路由重复跳转报错
  19. 台式计算机质量检测标准,电脑机箱及整机外观检验标准.pdf
  20. 计算机网络安全漏洞及防范措施论文,浅谈计算机网络安全漏洞及防范措施论文.doc...

热门文章

  1. java之xml进阶教程——使用castor框架
  2. 172 Factorial Trailing Zeroes(阶乘后的零)————附带详细思路和代码
  3. Windows 10任务栏中托盘区(通知区域)图标消失的解决方法
  4. 《实时控制软件设计》第一次编程作业
  5. 仙剑奇侠传四服务器维护,《仙剑奇侠传四》无法登录怎么办_无法登录解决办法_3DM手游...
  6. 设置 SSH 通过密钥登录
  7. C语言——报数问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
  8. 费马小定理看了等于没看证明
  9. 传奇手游怎么开服?需要投资多少?需要那些东西?
  10. 恋恋有词 - 高频版