2016-07-25 1 views
0

私はこのプログラムを修正しようとしていますが、objdumpと16進エディタを使用しているだけです。ヘキサエディタを使用して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に等しい場合は私の状態で書きました。

私の2番目の質問は、命令を変更するためにインクリメントする必要がありますか?

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 

(次のリンクのように)私はヘキサエディタで76で75を交換し、それが働きました。しかし、理由を理解できませんでした。 (および方法によって、何0Cはに相当?)

おかげ

+2

_「なぜJNE命令ですか、なぜJEではないのですか?」_あなたは、それに確実に答えるにはアセンブリコードを十分に表示していません。しかし、 'return_value'!= 0のとき' JNE'は 'else'節にジャンプしている可能性が非常に高いです_ _" 0cは? "に対応_ _ターゲットアドレスです。 EIPレジスタ_の命令ポインタの値。 – Michael

+0

こんにちはMichael、私はASMコード全体を追加:)) JMP命令がむしろelse条件にジャンプしているとは思わない? –

+1

いいえ、 'jmp'は' return(1); '部分にジャンプしています。 – Michael

答えて

1

@MichaelはJNEが使用されている理由を/どのようにコメントで説明しました。

質問のインクリメント部分については、元の命令と変更された命令のバイナリエンコーディング(a.k.a.機械語)が1つ離れているだけです。

+0

この場合、増分の代わりに減分する必要がありますか? –

+0

必要な命令が、デクリメントすることによって得られた番号でエンコードされた場合。 –

+0

@ S7_0 CPU設計者が 'jne'が' 0x80 0xF0'で、 'je'が' 0x44 'であると判断した場合、増分/減分の違いを考えるのは無意味ではありませんが、長さ今は2Bから1Bまでは簡単ですが、SWをクラッキングしているときは、より少ないバイトからより多くのバイトに移動する必要があることがよくあります。楽しみが始まるところです。 :D(コードの残りの部分を検索して、どこで短縮するか、すべて書き直してから、変更に使用されたスペースを確認してください) – Ped7g

関連する問題