2014-05-18 148 views
0

我在逆向工程中遇到了一些麻煩,一些IA32彙編代碼。即,這些行:IA32彙編cmp字符串

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,0123'指令產生混淆。看起來,不管字符串開頭的兩個字符是什麼,它都會出現1.它是比較字符串的長度嗎?

此外,在兩個字符串上調用cmp的比較是什麼?

非常感謝!

編輯:

早些時候,兩個字符串被cmp'd:

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

回答

2

這感覺就像我們已經been here before

註冊不能「持有字符串」,除非它們很短。你得到的是地址的字符串,或指向(字符串的第一個字符)的指針。如果%edx包含一個指向字符串的指針,並且%eax包含「相同的字符串,只有索引0處的字符被刪除」,則%eax幾乎可以肯定指向字符串的第二個字符。

既然如此,如果你從另一箇中減去一個,當然你總是會得到1,因爲字符串的第二個字符總是比第一個字符更靠前一個字節。這些字符並不重要,因爲您正在比較地址

cmp指令顯然是不能比較兩個字符串 - 它比較文字數5%eax的內容,這在一點將是你1,兩個指針之間的差異。因此,cmp指令比較51,如果它們相等 - 顯然不是 - 在這種情況下 - jmp s到0x8049d83

這就是說,我懷疑你有這個回到前面。如果%edx指向字符串的開頭,並且%eax指向第二個字符,則sub指令應該給您-1而不是1%edx%eax可能是相反的方式。此例程似乎設計爲jmp0x8049d83%edx指向%eax指向的字符串的第六個字符。

+0

再次感謝您的幫助。它很好地解釋了這個問題 - 當兩個寄存器保存地址到不同的和不同的字符串時,會發生什麼情況是'cmp''d?例如,我編輯中包含的內容到我原來的帖子 – user3635296

+1

完全一樣的東西,它只是比較地址,如果指向完全不同的字符串,顯然不會相等。 –