IA32汇编cmp on strings

时间:2014-05-18 03:12:54

标签: string assembly ia-32 cmp

我在对一些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处的字符。

混淆起因于步骤214的sub指令。看来,无论两个字符在字符串的开头是什么,它都是1.它是否比较了字符串的长度?

另外,在两个字符串上调用cmp会比较什么?

非常感谢!

编辑:

早些时候,两个字符串是cmp&#39; d:

0x08049d68 <+201>: cmp -0xc(%ebp),%eax 
0x08049d6b <+204>: jb 0x8049cfa <level_6+91>

1 个答案:

答案 0 :(得分:2)

感觉就像我们been here before

寄存器不能保留字符串&#34;,除非它们是非常短的字符串。你在那里得到的是地址的字符串,或指向(字符串的第一个字符)的指针。如果%edx包含指向字符串的指针,并且%eax保持&#34;相同的字符串,只有删除索引0处的字符&#34;,那么%eax几乎肯定指向字符串的第二个字符。

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

cmp指令显然没有比较两个字符串 - 它将字面数5%eax的内容进行比较,此时1的内容将是cmp 1}},两个指针之间的区别。因此5指令将1jmp进行比较,如果它们相等 - 他们显然不是,在这种情况下,0x8049d83%edx

话虽如此,我怀疑你有这个回到前面。如果%eax指向字符串的开头,并且sub指向第二个字符,则-1指令应该为您提供1,而不是%edx%eaxjmp可能反过来了。当0x8049d83指向%edx指向的字符串的第六个字符时,此例程似乎设计为%eax到{{1}}。