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

问题描述 投票:0回答:1

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

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

所以简而言之,这会立即跳转到

RETF
之后的指令,但会弄乱 32 位反汇编程序。我仍然不清楚为什么会这样。

现在,我被告知

RETF
返回到 64 位段,因此在 32 位调试器上调试它会产生错误的反汇编。当在 64 位调试器(在我的例子中是 Windbg)上运行此代码片段时,它会产生正确的结果。

我的问题是:

push 0x33
有什么特别之处吗? 0x33 是某种特殊值吗?

assembly x86 x86-64 memory-segmentation
1个回答
5
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.