You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的核心作用是触发处理器的模式切换:

  1. push 0x33 将64位代码段选择子压入栈中
  2. call $+5 把当前call指令的下一条指令地址压栈,然后跳转到add指令执行
  3. add [esp+0x10+var_10],5 等价于add [esp],5——把之前call压栈的返回地址加5,刚好指向retf之后的目标指令
  4. retf 执行时,会先弹出栈中被修改后的目标地址作为新的指令指针,再弹出0x33作为新的CS段选择子,强制处理器切换到64位模式执行后续代码

32位反汇编器/调试器因为不识别这种段切换后的64位模式,会继续按32位指令格式解析后续代码,导致反汇编结果完全错误;而64位调试器(比如WinDbg)能正确处理模式切换,所以能正常显示后续指令。

内容的提问来源于stack exchange,提问作者IRP_HANDLER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:42:54