我在对一些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>
答案 0 :(得分:2)
感觉就像我们been here before。
寄存器不能保留字符串&#34;,除非它们是非常短的字符串。你在那里得到的是地址的字符串,或指向(字符串的第一个字符)的指针。如果%edx
包含指向字符串的指针,并且%eax
保持&#34;相同的字符串,只有删除索引0处的字符&#34;,那么%eax
几乎肯定指向字符串的第二个字符。
既然如此,如果你从另一个中减去一个,当然你总是得到1
,因为字符串的第二个字符总是比第一个字符长一个字节。字符是什么并不重要,因为您正在比较地址。
cmp
指令显然没有比较两个字符串 - 它将字面数5
与%eax
的内容进行比较,此时1
的内容将是cmp
1}},两个指针之间的区别。因此5
指令将1
与jmp
进行比较,如果它们相等 - 他们显然不是,在这种情况下,0x8049d83
为%edx
。
话虽如此,我怀疑你有这个回到前面。如果%eax
指向字符串的开头,并且sub
指向第二个字符,则-1
指令应该为您提供1
,而不是%edx
。 %eax
和jmp
可能反过来了。当0x8049d83
指向%edx
指向的字符串的第六个字符时,此例程似乎设计为%eax
到{{1}}。