Grundlegende Frage zum Binärcode



  • Hallo,

    ich habe mir zu Testzwecken folgendes Programm geschrieben:

    ;...
    .DATA
    szStr		DB			"Hallo",0
    szStr2		DB			"Caption",0
    
    .CODE
    Start:
    	push	64d
    	push	OFFSET szStr2
    	push	OFFSET szStr
    	push	0d
    	call	MessageBoxA
    	push	0d
    	call	ExitProcess
    	ret
    END Start
    

    Nun habe ich es mit OllyDbg und Hex Workshop geöffnet. Mein Ziel war es, die Anwendung nachträglich so umzuschreiben, dass ein anderer Text angezeigt wird. Folgendermaßen wollte ich es realisieren (geht einfacher, aber zum lernen eben...):
    push 60 im ein jmp + Adresse am Ende des Codes. Dort am Ende wollte ich dann ein neuen String "bauen" und dann per MessageBoxA aufrufen, also:

    ...
    JMP 0123
    ...
    0122 - ...
    0123 - push 0
    0124 - push offset addresse des Strings
    ...
    012n - call MessageBoxA
    [Exit]

    Nun fielen mir ein paar seltsame Dinge auf: In Ollydbg wird z.B. "PUSH OFFSET test.szStr" (test = modul, szStr = definierter String) wie folgt übersetzt: 68 00409100. Doch im Hex Workshop lese ich "68 00 40 40 00". Warum ist das so, wird das zur Laufzeit etwa geändert?

    Vielen Dank schon einmal, ich hoffe ich konnte mich verständlich ausdrücken!



  • Stichwort: base relocation
    Der PE-loader ändert die OFFSETs beim laden: 0x404000 + 0x510000 = 0x914000
    Mit der Linker-Option /FIXED sollte dieser Effekt verschwinden.



  • Aha, das erklärt einiges 😉
    Ne, möchte den Effekt ja nicht "beseitigen", sondern eher Umgehen...
    Das heißt also:
    Adresse während der Ausführung = Base Adresse + Offset in der Binary ?



  • Wenn deine EXE von Windows verschoben wird (=>ASLR), dann kann man diese Rechnung zumindest für absolute Offsets verwenden. Das macht aber, wie schon gesagt, der PE-loader für dich.
    Image relocation wird erst seit Windows Vista unterstützt (für EXE’s) und soll bösen Jungs das Leben schwerer machen – du kannst getrost darauf verzichten (/FIXED)



  • Okay, hab mal geschaut was ASLR im Prinzip ist...
    Aber wenn ich jetzt wie oben erwähnt, z.B. folgenden Befehl habe:

    push    OFFSET szStr2
    push    OFFSET szStr
    

    [OllyDbg]
    Adresse - Bytes - Befehl
    00F71002 - 68 0640F700 - PUSH OFFSET test.szStr2
    00F71007 - 68 0040F700 - PUSH OFFSET test.szStr
    [/OllyDbg]

    [Hex Workshop]
    6806404000
    6800404000
    [/Hex Workshop]

    Was müsste ich im Hex Workshop modifizieren, damit z.B. zweimal test.szStr geladen wird...?
    Könnte es stimmen, dass:
    68 0640F700 = Push-Opcode(68) + Offset(0640F700) ?



  • Gast4321 schrieb:

    Was müsste ich im Hex Workshop modifizieren, damit z.B. zweimal test.szStr geladen wird...?
    Könnte es stimmen, dass:
    68 0640F700 = Push-Opcode(68) + Offset(0640F700) ?

    Die Adresse währen der Laufzeit hilft dir hier nicht:

    [Hex Workshop]
    6806404000 ==> 6800404000
    6800404000 ==> 6800404000
    [/Hex Workshop]
    so würde zwei Mal der gleich Zeiger übergeben.
    (die Basisadresse 0x404000 kann man im Übrigen aus dem PE Header entnehmen)

    Was erhoffst du dir den mit der Rumspielerei zu lernen? – Assembler bestimmt nicht!



  • Hm...was erhoffe ich mir mir zu lernen, gute Frage. Ich hab es nur zufällig entdeckt und bin neugierig geworden...

    Okay soweit, aber angenommen ich möchte einen neuen String nachträglich in die Anwendung einbauen. Und bei der MessageBox möchte ich diesen dann ausgeben.
    Kann ich dann für den Push-Befehl:

    68 + Adresse in der Binary, wo ich den String hingesetzt habe

    verwenden, oder hab ich da einen Denkfehler?



  • Mit OllyDbg kann man das so machen - in der PE Datei, "von Hand", nur dann, wenn noch ein paar Bytes am Ende der code oder data section frei sind (für den String). Ansonsten muss man die PE zerlegen, modifizieren und anschließend neu aufbauen, was deine Fähigkeiten derzeit wohl weit Übersteigt – am besten du benutz OllyDbg, der dies kann.



  • Alles klar, danke.

    Nein, ich wollte schon die Anwendung von Hand modifizieren, sprich ohne OllyDbg


Anmelden zum Antworten