为什么我只需要使用hexa编辑器增加更改asm指令

时间:2016-07-25 15:28:20

标签: assembly x86 reverse

我试图修改此程序并显示"它不相同"只使用objdump和十六进制编辑器。

#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意味着&#34;跳跃不等于&#34;但是如果返回值IS等于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 <puts@plt>
  40054c:       eb 0a                   jmp    400558 <main+0x32>
  40054e:       bf f1 05 40 00          mov    $0x4005f1,%edi
  400553:       e8 a8 fe ff ff          callq  400400 <puts@plt>
  400558:       b8 01 00 00 00          mov    $0x1,%eax
  40055d:       c9                      leaveq
  40055e:       c3                      retq
  40055f:       90                      nop

我在hexa编辑器中将75替换为76并且它有效。但是不明白为什么。 (顺便说一下,0c对应的是什么?)

由于

1 个答案:

答案 0 :(得分:1)

@Michael在评论中解释了为什么/如何使用JNE。

至于问题的增量部分:恰好,原始和更改指令的二进制编码(a.k.a。机器语言)相差1。