2016-07-25 33 views
0

erhöhen Ich versuche, dieses Programm zu ändern und anzuzeigen "es ist nicht das gleiche" nur mit objdump und einem hexadezimalen Editor.Warum muss ich nur zum Ändern eine ASM-Anweisung mit Hexa-Editor

#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); 
} 

Habe ich objdump -D verwendet und die Zeile der JNE-Anweisung gefunden. Meine erste Frage ist zu wissen, ist es eine JNE-Anweisung und warum nicht eine JE? Weil JNE "Sprung nicht gleich" bedeutet, schrieb ich in meinem Zustand, wenn der Rückgabewert gleich 0 ist.

Meine zweite Frage ist im Titel, warum muss ich für die Änderung eine Anweisung erhöhen? (Wie in der folgenden Verbindung)

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 

I ersetzen 75 von 76 in dem hexa-Editor und es funktionierte. Aber ich habe nicht verstanden warum. (Und übrigens, was 0c entsprechend?)

Dank

+2

_ "[Warum] ist es eine JNE-Anweisung und warum nicht eine JE?" _ Sie haben uns nicht genug vom Assembler-Code gezeigt, um das definitiv beantworten zu können. Aber es ist sehr wahrscheinlich, dass diese 'JNE' in die 'else'-Klausel springt, wenn' return_value!' = 0. _ "what 0c entspricht?" _ Es ist die Zieladresse, ausgedrückt als _a signed offset relativ zum aktuellen Wert des Befehlszeigers im EIP-Register_. – Michael

+0

Hallo Michael, ich füge den gesamten ASM-Code hinzu :)) Denkst du nicht, dass der JMP-Befehl eher in den else Zustand springt? –

+1

Nein, die 'jmp' springt zum' return (1); 'part. – Michael

Antwort

1

@ Michael erklärte in einem Kommentar, warum/wie JNE verwendet wird.

Wie für den Inkrement Teil Ihrer Frage: es passiert einfach, dass die binären Kodierungen (a.k.a. Maschinensprache) Ihrer ursprünglichen und geänderten Anweisungen 1 auseinander sind.

+0

In welchem ​​Fall muss ich dekrementieren statt inkrementieren? –

+0

Wenn die Anweisung, die Sie möchten, mit der Nummer kodiert wird, erhalten Sie durch Dekrementieren. –

+0

@ S7_0 Wenn der CPU-Designer entscheiden würde, dass 'jne'' 0x80 0xF0' und 'je'' _xx44' ist, wäre es nicht nur sinnlos, an Inkrement/Dekrement-Differenz zu denken, sondern Sie müssten sich auch mit anderen befassen Länge. Jetzt von 2B zu 1B ist einfach, aber wenn Menschen einige SW knacken mussten, mussten sie oft von weniger Bytes zu mehr Bytes gehen .... das ist, wo der Spaß anfängt. : D (suche den Rest des Codes, um zu sehen, wo du ihn verkürzen kannst, schreibe alles um, und dann den Platz, der für die Änderung benötigt wurde) – Ped7g