私はこのプログラムを修正しようとしていますが、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はに相当?)
おかげ
_「なぜJNE命令ですか、なぜJEではないのですか?」_あなたは、それに確実に答えるにはアセンブリコードを十分に表示していません。しかし、 'return_value'!= 0のとき' JNE'は 'else'節にジャンプしている可能性が非常に高いです_ _" 0cは? "に対応_ _ターゲットアドレスです。 EIPレジスタ_の命令ポインタの値。 – Michael
こんにちはMichael、私はASMコード全体を追加:)) JMP命令がむしろelse条件にジャンプしているとは思わない? –
いいえ、 'jmp'は' return(1); '部分にジャンプしています。 – Michael