首页
社区
课程
招聘
[求助]脱壳中的汇编指令sysenter是什么作用?
发表于: 2012-12-3 23:28 8340

[求助]脱壳中的汇编指令sysenter是什么作用?

2012-12-3 23:28
8340
今天拿一个软件试手,脱壳时找OEP,软件的OEP为0043D456,执行sysenter后就跳到OEP,我用run功能追踪得到如图:(绿色是我的OEP)

.
.
774C6192  |.  0F34             sysenter   ;执行后,跳到OEP(0043D456)


我不知道这个sysenter具体做了什么,一下子就跳到了OEP。。。求大侠解答!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 239
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
在 Intel 的软件开发者手册第二、三卷(Vol.2B,Vol.3)中,4.8.7 节是关于 sysenter/sysexit 指令的详细描述。手册中说明

,sysenter 指令可用于特权级 3 的用户代码调用特权级 0 的系统内核代码,而 SYSEXIT 指令则用于特权级 0 的系统代码返回用户空间中。sysenter 指令可以在 3,2,1 这三个特权级别调用(Linux 中只用到了特权级 3),而 SYSEXIT 指令只能从特权级 0 调用。执行 sysenter 指令的系统必须满足两个条件:1.目标 Ring 0 代码段必须是平坦模式(Flat Mode)的 4GB 的可读可执行的非一致代码段。2.目标 RING0 堆栈段必须是平坦模式(Flat Mode)的 4GB 的可读可写向上扩展的栈段。在 Intel 的手册中,还提到了 sysenter/sysexit 和 int n/iret 指令的一个区别,那就是 sysenter/sysexit 指令并不成对,sysenter 指令并不会把 SYSEXIT 所需的返回地址压栈,sysexit 返回的地址并不一定是 sysenter 指令的下一个指令地址。调用sysenter/sysexit 指令地址的跳转是通过设置一组特殊寄存器实现的。这些寄存器包括:

SYSENTER_CS_MSR - 用于指定要执行的 Ring 0 代码的代码段选择符,由它还能得出目标 Ring 0 所用堆栈段的段选择符;

SYSENTER_EIP_MSR - 用于指定要执行的 Ring 0 代码的起始地址;

SYSENTER_ESP_MSR-用于指定要执行的Ring 0代码所使用的栈指针

这些寄存器可以通过 wrmsr 指令来设置,执行 wrmsr 指令时,通过寄存器 edx、eax 指定设置的值,edx 指定值的高 32 位,eax 指定值的低 32 位,在设置上述寄存器时,edx 都是 0,通过寄存器 ecx 指定填充的 MSR 寄存器,sysenter_CS_MSR、sysenter_ESP_MSR、sysenter_EIP_MSR 寄存器分别对应 0x174、0x175、0x176,需要注意的是,wrmsr 指令只能在 Ring 0 执行。

这里还要介绍一个特性,就是 Ring0、Ring3 的代码段描述符和堆栈段描述符在全局描述符表 GDT 中是顺序排列的,这样只需知道SYSENTER_CS_MSR 中指定的 Ring0 的代码段描述符,就可以推算出 Ring0 的堆栈段描述符以及 Ring3 的代码段描述符和堆栈段描述符。

在 Ring3 的代码调用了 sysenter 指令之后,CPU 会做出如下的操作:

1. 将 SYSENTER_CS_MSR 的值装载到 cs 寄存器

2. 将 SYSENTER_EIP_MSR 的值装载到 eip 寄存器

3. 将 SYSENTER_CS_MSR 的值加 8(Ring0 的堆栈段描述符)装载到 ss 寄存器。

4. 将 SYSENTER_ESP_MSR 的值装载到 esp 寄存器

5. 将特权级切换到 Ring0

6. 如果 EFLAGS 寄存器的 VM 标志被置位,则清除该标志

7. 开始执行指定的 Ring0 代码

在 Ring0 代码执行完毕,调用 SYSEXIT 指令退回 Ring3 时,CPU 会做出如下操作:

1. 将 SYSENTER_CS_MSR 的值加 16(Ring3 的代码段描述符)装载到 cs 寄存器

2. 将寄存器 edx 的值装载到 eip 寄存器

3. 将 SYSENTER_CS_MSR 的值加 24(Ring3 的堆栈段描述符)装载到 ss 寄存器

4. 将寄存器 ecx 的值装载到 esp 寄存器

5. 将特权级切换到 Ring3

6. 继续执行 Ring3 的代码

由此可知,在调用 SYSENTER 进入 Ring0 之前,一定需要通过 wrmsr 指令设置好 Ring0 代码的相关信息,在调用 SYSEXIT 之前,还要保证寄存器edx、ecx 的正确性。

根据 Intel 的 CPU 手册,我们可以通过 CPUID 指令来查看 CPU 是否支持 sysenter/sysexit 指令,做法是将 EAX 寄存器赋值1,调用 CPUID 指令,寄存器 edx 中第 11 位(这一位名称为 SEP)就表示是否支持。在调用 CPUID 指令之后,还需要查看 CPU的 Family、Model、Stepping 属性来确认,因为据称 Pentium Pro 处理器会报告 SEP 但是却不支持 sysenter/sysexit 指令。只有 Family 大于等于 6,Model 大于等于 3,Stepping 大于等于 3 的时候,才能确认 CPU 支持 sysenter/sysexit 指令。
2012-12-4 07:09
0
雪    币: 239
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
上面是Intel 开发者手册说的,我认为,什么也没有,花指令。
2012-12-4 07:15
0
雪    币: 51
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你这什么壳??这条指令是进0环了。。你跟错了吧。你跟到系统的NTDLL里去了
2012-12-4 08:10
0
雪    币: 2155
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
执行到sysenter,就意味着程序马上要call进内核了,之后的代码你用OD就不可能跟踪了,因为进到R0了嘛。

我也想知道你那是个什么壳???
2012-12-4 08:52
0
雪    币: 111
活跃值: (113)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
PEid没能检测出,可能是未知壳,有无介绍更先进的查壳软件。。
2012-12-4 14:02
0
雪    币: 111
活跃值: (113)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
谢谢解答,有无简单明了点的?
2012-12-4 14:04
0
雪    币: 209
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Intel的CPU:
sysenter指令从Ring3层进入Ring0层
sysexit指令从Ring0层返回Ring3层

AMD的CPU:
syscall指令从Ring3层进入Ring0层
sysret指令从Ring0层返回Ring3层
2012-12-4 14:39
0
雪    币: 111
活跃值: (113)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
谢谢解答!~
2012-12-5 12:42
0
雪    币: 14
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
脱壳的时候,程序跟飞了。。
2012-12-12 15:28
0
游客
登录 | 注册 方可回帖
返回
//