Crackme挑战:关于汇编指令bnd jmp执行后EAX寄存器值变化的技术疑问
理解
bnd jmp qword[reloc.ifunc_4e67b0]与EAX寄存器变化的原因 嘿,作为汇编新手碰到这种看起来和目标寄存器没关系但又影响它的指令,确实容易摸不着头脑,我来帮你一步步拆解清楚:
首先拆解这条指令的组成
bnd:这是Intel MPX(内存保护扩展)的前缀指令,主要用于内存边界检查,防止越界访问。不过在这个场景里,它更多是编译器自动添加的安全标记,核心逻辑还是后面的跳转部分。jmp qword[reloc.ifunc_4e67b0]:这是一个间接跳转,目标是reloc.ifunc_4e67b0这个重定位项。重点是:ifunc代表间接函数(Indirect Function),这意味着这个地址不是固定的函数入口,而是程序运行时会动态解析出实际要执行的函数地址。
为什么EAX的值会变化?
问题的核心就在这个IFUNC指向的函数上:
在x86/x64汇编的调用约定里,函数通常会把返回值存放在EAX(32位)或RAX(64位)寄存器中。当bnd jmp执行时,实际上是跳转到了IFUNC解析后的目标函数,这个函数执行完毕后,会把计算结果(比如密码验证的结果)写入EAX寄存器,这就是你看到EAX值变化的原因——哪怕指令表面没直接操作EAX,函数内部已经修改了它。
结合你的场景来看,这个函数大概率就是密码验证的核心逻辑:它会处理输入的密码,计算后返回0(验证通过)或非0(验证失败),正好对应后面test eax, eax的判断逻辑。
新手实操建议(基于radare2)
- 查看IFUNC的解析内容:在radare2中输入
pd @ reloc.ifunc_4e67b0,可以查看这个重定位项的具体信息,找到它最终指向的函数。 - 跟踪EAX变化:在调试时,执行这条指令前后分别用
dr eax命令查看EAX的值,对比变化,也可以用dbs设置断点,单步跟踪函数内部的执行流程。 - 分析目标函数:找到实际函数后,用
af命令对函数进行自动分析,然后用pdf查看函数的反汇编代码,就能看到它是如何计算并修改EAX的了。
内容的提问来源于stack exchange,提问作者Howlghii
相关产品推荐
相关产品推荐

