x86 - 通过 RETF 从 32 位切换到 64 位

x86 - Switching from 32-bit to 64-bit via RETF

提问人:IRP_HANDLER 提问时间:11/8/2023 最后编辑:Sep RolandIRP_HANDLER 更新时间:11/13/2023 访问量:59

问:

我正在研究一些反反汇编技术,并遇到了以下片段:

push 0x33
call $+5
add  [esp+0x10+var_10], 5
retf
; next instruction here

因此,简而言之,这将立即跳转到 之后的指令,但会弄乱 32 位反汇编器。我仍然不清楚为什么会这样。RETF

现在,我被告知返回到 64 位段,因此在 32 位调试器上调试会产生错误的反汇编。在 64 位调试器(在我的情况下是 windbg)上运行此代码片段时,它会生成正确的结果。RETF

我的问题是:推送0x33有什么特别之处吗?0x33是某种特殊价值吗?

程序集 x86-64 内存分段

评论


答:

5赞 Joseph Sible-Reinstate Monica 11/8/2023 #1

retf本身并不意味着“返回到 64 位段”。它的意思是“返回指定的段和地址”,而不是“返回指定地址而不改变段”的意思。这是要返回到的段,恰好是用于 64 位代码的段。( 是 32 位段。ret0x330x23

评论

5赞 fuz 11/8/2023
请注意,段号取决于操作系统,有时取决于操作系统版本。