2016-07-25 22 views
0

我想修改此程序並顯示「它是不一樣的」只有使用objdump和十六進制編輯器。爲什麼我只需要增加更改asm指令使用六編輯器

#include <string.h> 
#include <stdio.h> 

int  main(int argc, char *argv[]) 
{ 
    int return_value; 

    return_value = strcmp("test", "test"); 
    if (return_value == 0) 
     printf("it's the same\n") 
    else 
     printf("it's not the same\n"); 
    return (1); 
} 

我是否使用了objdump -D並找到了JNE指令的行。 我的第一個問題是要知道它是JNE指令,爲什麼不是JE?因爲JNE的意思是「跳躍不等於」,但我寫在我的情況下,如果返回值等於0.

我的第二個問題是在標題中,爲什麼我需要增加更改指令? (如下面的鏈接)

How does one change an instruction with a hex editor?

400526:  55      push %rbp 
    400527:  48 89 e5    mov %rsp,%rbp 
    40052a:  48 83 ec 20    sub $0x20,%rsp 
    40052e:  89 7d ec    mov %edi,-0x14(%rbp) 
    400531:  48 89 75 e0    mov %rsi,-0x20(%rbp) 
    400535:  c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp) 
    40053c:  83 7d fc 00    cmpl $0x0,-0x4(%rbp) 
    400540:  75 0c     jne 40054e <main+0x28> 
    400542:  bf e4 05 40 00   mov $0x4005e4,%edi 
    400547:  e8 b4 fe ff ff   callq 400400 <[email protected]> 
    40054c:  eb 0a     jmp 400558 <main+0x32> 
    40054e:  bf f1 05 40 00   mov $0x4005f1,%edi 
    400553:  e8 a8 fe ff ff   callq 400400 <[email protected]> 
    400558:  b8 01 00 00 00   mov $0x1,%eax 
    40055d:  c9      leaveq 
    40055e:  c3      retq 
    40055f:  90      nop 

我在六編輯器取代75 76和它的工作。但不明白爲什麼。 (順便說一句,對應於0℃什麼?)

感謝

+2

_「[爲什麼是JNE指令,爲什麼不是JE?] _您沒有向我們展示足夠的彙編代碼以便能夠明確地回答。但是'return_value'!= 0時''JNE'跳到'else'-子句的可能性很大。_「什麼0c對應?」_它是目標地址,表示爲相對於當前值的有符號偏移量EIP寄存器_中的指令指針。 – Michael

+0

你好邁克爾,我添加了整個ASM代碼:)) 你不覺得JMP指令是跳轉到其他條件嗎? –

+1

不,「jmp」跳轉到「return(1);'部分。 – Michael

回答

1

@邁克爾在評論解釋了爲什麼/如何被使用JNE的。

至於你的問題的增量部分:恰好你的原始和改變的指令的二進制編碼(也稱爲機器語言)是1分開的。

+0

在這種情況下,我需要減少而不是增量? –

+0

當你想要的指令碰巧用你遞減的數字進行編碼。 –

+0

@ S7_0如果CPU設計者會認爲'jne'是'0x80 0xF0'而'je'是'0x44',那麼想到增加/減少差異不僅沒有意義,而且你還需要處理不同的問題長度。現在從2B到1B很容易,但是當人們破解一些SW時,他們通常需要從較少的字節到更多的字節......這就是樂趣開始的地方。 :D(搜索代碼的其餘部分以查看可以縮短它的位置,將其全部重寫,然後用於修改的獲得空間) – Ped7g

相關問題