吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4689|回复: 10
收起左侧

[系统底层] 保护模式笔记七 CALL 长调用与短调用

  [复制链接]
lyl610abc 发表于 2021-4-21 22:50

前言

所有保护模式索引链接:保护模式笔记一 保护模式介绍

在先前的保护模式笔记六 代码跨段跳转中学习了远跳转:JUMP FAR指令

但如果想要实现跨段的调用就需要学习长调用:CALL FAR指令

短调用

短调用指令格式

CALL 立即数/寄存器/内存

指令类型 指令例子 对应硬编码
CALL 立即数 call 52610610 E8 F4560A52
CALL 寄存器 call eax FFD0
CALL 内存 call dword ptr ds:[0x52610610] FF15 10066152

短调用堆栈变化

关于短调用,其实在先前的逆向基础笔记七 堆栈图(重点)中,就已经分析过短调用堆栈的变化(不了解的可以回顾)

这里再简单地过一遍:

用OD随便打开一个程序

image-20210421202636504


记录下此时的堆栈情况

相对ESP地址 堆栈地址 内容
ESP-8 0012FFBC 00000009
ESP-4 0012FFC0 0012FFF8
ESP 0012FFC4 7C817077
ESP+4 0012FFC8 005BFF80
ESP+8 0012FFCC 0012B750

按F7单步步入CALL

image-20210421203255388


此时的堆栈情况为

相对ESP地址 堆栈地址 内容
ESP-8 0012FFBC 00000009
ESP 0012FFC0 0056AF17
ESP+4 0012FFC4 7C817077
ESP+8 0012FFC8 005BFF80
ESP+C 0012FFCC 0012B750

对比前后的堆栈情况变化,可以发现:

短调用影响了ESP和EIP两个寄存器,并且会将返回地址压入到堆栈中

短调用通过RET指令返回,这里也不再赘述


长调用

长调用指令格式

CALL FAR CS:EIP(EIP是废弃的)

形如:CALL FAR 002B:00610610

CALL指令要调用的地址是由CS段选择子查GDT表得到的调用门 段描述符得来的,后面的EIP不发挥作用


长调用可以分为两种:跨段不提权和跨段提权

长调用通过RETF指令返回

跨段不提权

所谓的跨段不提权就是指要跳转段和当前段的特权级别相同

和短调用不同,长调用会先将CS压入堆栈,然后再将返回地址压入堆栈

跨段不提权的长调用影响了ESP EIP CS 三个寄存器,并且会将CS和返回地址压入到堆栈中

下面给出堆栈变化图:

image-20210421222141134


跨段提权

与跨段不提权相对,所谓的跨段提权就是指要跳转段和当前段的特权级别不同

跨段提权的长调用 涉及到了权限的变化,一旦涉及到了权限的变化,堆栈也将随之切换,因此相比跨段不提权,还会影响SS寄存器

跨段提权的长调用影响了ESP EIP CS SS 四个寄存器,并且会将SS、ESP、CS和返回地址压入到堆栈中

为什么要压入SS和ESP?

因为当跨段提权时,堆栈会发生切换,压入SS和ESP是为了在调用结束后将堆栈恢复成原来的(切换前)的堆栈

堆栈切换的来源是什么?

堆栈切换的来源是TSS段,这个留作之后再深入


下面给出由RING3切换到RING0的跨段提权堆栈变化图

image-20210421224121996


总结

跨段调用时,一旦有权限切换,就会切换堆栈

CS的权限一旦改变,SS的权限也要随着改变,CS与SS的特权级别必须一致(INTEL定义的规则)

JMP FAR 只能跳转到同级代码段,但CALL FAR可以通过调用门进行提权(提升CPL的权限)

由于长调用还涉及到调用门和TSS,于是此次笔记没有具体分析长调用的实例,留作之后补充

免费评分

参与人数 10吾爱币 +12 热心值 +9 收起 理由
junjia215 + 1 + 1 用心讨论,共获提升!
pj521 + 1 用心讨论,共获提升!
erh + 1 + 1 谢谢@Thanks!
游叶子明 + 1 + 1 用心讨论,共获提升!
山上雪云间月 + 1 + 1 热心回复!
debug_cat + 2 + 1 大佬牛逼
bailemenmlbj + 1 + 1 谢谢@Thanks!
小哲哲你来了 + 1 + 1 我很赞同!
sam喵喵 + 1 谢谢@Thanks!
正己 + 3 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

正己 发表于 2021-4-21 22:54
前排支持一下大佬
渊宇AAAAA 发表于 2021-4-21 22:56
helanzhu1 发表于 2021-4-22 06:38
cn奔跑的子弹 发表于 2021-4-22 08:13
继续支持努力的人
love514415 发表于 2021-4-22 12:10
学到秃头为止
有、 发表于 2021-4-22 16:51
谢谢大佬  努力学习
minibeetuaman 发表于 2021-4-22 20:38
在protected mode里面因为寄存器是32bit的关系用普通的跳转已经能访问ring3的全部区域,long jump会带一个selector,在从ring3 switch到ring 0的时候切换到内核的段选择子,完成系统级别的切换
erh 发表于 2021-4-26 21:46
跨段不提权那个图,两个状态的堆栈一样吗?
xtay1987 发表于 2021-4-27 12:34
先收藏下,留着以后备用了。谢谢楼主了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 14:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表