2016-07-25 1 views
0

이 프로그램을 수정하고 objdump 및 16 진수 편집기를 사용하여 "동일하지 않습니다"라고 표시하려고합니다. 왜 hexa 편집기를 사용하여 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); 
} 

내가 -D를 objdump를 사용하고 JNE 명령의 선을 발견 마십시오. 첫 번째 질문은 JNE 교육인지, JE가 아닌지를 아는 것입니다. 그러나 JNE는 "점등하지 않음"을 의미하기 때문에 반환 값이 0이면 결과 값을 반환합니다.

내 두 번째 질문은 제목을 변경하는 이유는 무엇입니까? (아래 링크에서와 같이)

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 

How does one change an instruction with a hex editor?

나는 헥사 편집기에서 76 (75)을 교체하고 일했다. 그러나 이유를 이해하지 못했습니다. JNE이 어떻게 사용되고 있는지 이유/(그건 그렇고, 무엇을 0 ℃에 대응?)

감사

+2

_ "왜 JNE 교육입니까? JE가 아닌 이유는 무엇입니까?"_ 확실하게 대답 할 수 있도록 어셈블리 코드를 충분히 표시하지 못했습니다. 그러나'return_value'! = 0 일 때'JNE'가'else' 절로 점프하고있을 확률이 높습니다. _ "0c는 무엇에 해당합니까?"_ 목표 주소이고 _a는 현재 값을 기준으로 한 부호있는 오프셋 EIP 레지스터에있는 명령어 포인터의 _. – Michael

+0

Hello Michael, 전체 ASM 코드 추가) :) JMP 명령어가 else 상태로 점프하고 있다고 생각하지 않습니까? –

+1

아니요,'jmp'가'return (1);'부분으로 점프하고 있습니다. – Michael

답변

1

을 @Michael 주석에 설명했다.

질문의 증가 부분은 원래의 명령어와 변경된 명령어의 바이너리 인코딩 (a.k.a. 기계어)이 1만큼 떨어져 있다는 것입니다.

+0

어떤 경우에는 증분 대신 감소해야합니까? –

+0

원하는 명령어가 숫자를 줄이면 인코딩됩니다. –

+0

@ S7_0 CPU 설계자가'jne'이'0x80 0xF0'이고'je'가'0x44 '라고 결정하면 증분과 감소의 차이를 생각하는 것이 무의미 할뿐만 아니라 다른 점도 고려해야합니다 길이. 이제 2B에서 1B까지는 쉽습니다. 그러나 사람들이 SW를 해킹했을 때, 그들은 더 적은 바이트에서 더 많은 바이트로 갈 필요가있었습니다. 그것이 바로 재미가 시작되는 곳입니다. : D (코드의 나머지 부분을 검색하여 단축 할 수있는 곳을 찾아 다시 작성한 다음 수정에 사용 된 공간 확보) – Ped7g