我在逆向工程一些 IA32 汇编代码时遇到了一些麻烦。即,这些行:
0x08049d6d <+206>: mov -0xc(%ebp),%edx
0x08049d70 <+209>: mov -0x14(%ebp),%eax
0x08049d73 <+212>: mov %edx,%ecx
0x08049d75 <+214>: sub %eax,%ecx
0x08049d77 <+216>: mov %ecx,%eax
0x08049d79 <+218>: cmp $0x5,%eax
0x08049d7c <+221>: je 0x8049d83 <level_6+228>
在这里,$edx
寄存器保存了一个字符串,而$eax
寄存器保存了相同的字符串,只是删除了索引 0 处的字符。
混淆是由sub
步骤214的指令引起的。看起来,不管字符串开头的两个字符是什么,结果都是1。是在比较字符串的长度吗?
另外,调用cmp
两个字符串比较什么?
非常感谢!
编辑:
之前,有两个字符串被 cmp'd:
0x08049d68 <+201>: cmp -0xc(%ebp),%eax
0x08049d6b <+204>: jb 0x8049cfa <level_6+91>