ret,retf,iret等的区别

2018-4-4 流沙 保护模式学习总结

ret:也可以叫做近返回,即段内返回。处理器从堆栈中弹出IP或者EIP,然后根据当前的CS:IP跳转到新的执行地址。如果之前压栈的还有其余的参数,则这些参数也会被弹出。

 

retf:也叫远返回,从一个段返回到另一个段。先弹出堆栈中的IP/EIP,然后弹出CS,有之前压栈的参数也会弹出。(近跳转与远跳转的区别就在于CS是否压栈。)

 

iret:用于从中断返回,会弹出IP/EIP,然后CS,以及一些标志。然后从CS:IP执行。

 

iretw:先后弹出IP,CS和标志位,每次都以2个字节为一个单位弹出,总共6个字节。

iretd:以4字节为单位弹出EIP,然后再弹4个字节,这四个字节的前两个字节被抛弃,低两个字节留下写入CS,然后弹出4字节的标志。(主要因为CS只有16位)

 

iret是iretw或者iretd的缩写,取决于一个段被申明为16位段还是32位段。

 

评论:

qqq
2019-03-21 18:21
补充一点

如果NT位为0,使用iret时返回值从堆栈中获取  ....中断返回
如果NT位值为1 ,使用iret (不是中断返回)  而是从Previous Task Link 前一个TSS段选择子找到TSS找到各个寄存器的值返回

不要调试单步执行,会进0环把NT位清零,再使用iretd 因为NT位被置0 从堆栈返回,不会取出前一个TSS里的值 直接蓝屏...坑


使用jmp指令访问任务段:
jmp 0x48:0x123456
如果0x48是TSS段描述符,先修改TR寄存器,再用TR.Base指向的TSS中的值修改当前的寄存器.
CALL 0x48:0x12345678
使用 JMP 和CALL的区别
使用CALL 会储存上一个TSS段选择子到Previous Task Link
使用JMP这个值不变
如果用JMP访问TSS段描述符 EFLAGS寄存器的NT位值不变
如果用CALL访问TSS ,EFLAGS寄存器的NT位会被置1
流沙
2019-03-23 13:40
@qqq:谢谢分享!!!

发表评论:

Powered by 流沙团

备案号:鄂ICP备15017378号-1