0

我在逆向工程一些 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>
4

1 回答 1

2

感觉就像我们以前来过这里一样

寄存器不能“保存字符串”,除非它们很短。你得到的是字符串的地址,或指向字符串(的第一个字符)的指针。如果%edx持有指向字符串的指针,并且%eax持有“相同的字符串,仅删除了索引 0 处的字符”,则%eax几乎可以肯定指向字符串的第二个字符。

在这种情况下,如果你从另一个中减去一个,当然你总是会得到1,因为字符串的第二个字符总是比第一个字符远一个字节。字符是什么并不重要,因为您正在比较地址

cmp指令显然不是比较两个字符串 - 它是将文字数字5与 的内容进行比较%eax,此时这将是你1的,两个指针之间的差异。因此,cmp指令与 进行比较51如果它们相等 - 在这种情况下,它们显然不是 - jmps to 0x8049d83

话虽这么说,我怀疑你有这个背靠背。如果%edx指向字符串的开头,并%eax指向第二个字符,那么sub指令应该给你-1,而不是1. %edx并且%eax可能是相反的方式。该例程似乎被设计为何时指向jmp指向的字符串的第六个字符。0x8049d83%edx%eax

于 2014-05-18T04:12:57.737 回答