x86架构中push 0x33与RETF切换32到64位的技术疑问
反反汇编代码中0x33的特殊含义
先看你给出的代码片段:
push 0x33 call $+5 add [esp+0x10+var_10], 5 retf ; next instruction here
0x33确实是个特殊值,它是Windows系统中用户态64位代码段(CS)的段选择子,具体拆解属性如下:
- 低2位是请求特权级(RPL):0b11,对应特权级3(用户态权限)
- 第3位是TI(Table Indicator)位:0,表示使用全局描述符表(GDT)而非局部描述符表(LDT)
- 高13位是段索引:0x33右移3位得到0x6,对应GDT中索引为6的条目,也就是Windows预定义的用户态64位代码段
结合这段反反汇编代码的执行流程,0x33的核心作用是触发处理器的模式切换:
push 0x33将64位代码段选择子压入栈中call $+5把当前call指令的下一条指令地址压栈,然后跳转到add指令执行add [esp+0x10+var_10],5等价于add [esp],5——把之前call压栈的返回地址加5,刚好指向retf之后的目标指令retf执行时,会先弹出栈中被修改后的目标地址作为新的指令指针,再弹出0x33作为新的CS段选择子,强制处理器切换到64位模式执行后续代码
32位反汇编器/调试器因为不识别这种段切换后的64位模式,会继续按32位指令格式解析后续代码,导致反汇编结果完全错误;而64位调试器(比如WinDbg)能正确处理模式切换,所以能正常显示后续指令。
内容的提问来源于stack exchange,提问作者IRP_HANDLER
相关产品推荐
相关产品推荐

