Stringvergleich interpretieren in Assembler
-
Hallo!
Ich habe als Aufgabe herauszufinden, wann der Sprung in Zeile 11 ausgeführt wird. Dazu habe ich mir schon viele Gedanken gemacht, doch komme ich nicht weiter und weiß auch nicht, welche Aussage man tatsächlich treffen kann. Erst einmal der Code:
push %edi push %esi sub $0x14,%esp mov $0x80496b1,%edi //gesuchter String? mov $0x19,%ecx mov 0x20(%esp),%esi repz cmpsb %es:(%edi),%ds:(%esi) //Stringvergleich seta %dl setb %al cmp %al,%dl //Vergleich der Flagregister --> Sind die Strings identisch? je 1036ac <exit+0x50> //Falls ja, dann springe!
Mit cmpsb wird der Stringvergleich durchgeführt. Der String muss zuvor über das Terminal eingeben werde. In Zeile 4 wird eine Konstante ins edi Register geschoben. Ein Vergleichsoperand ist gerade das edi Register. Daraus habe ich geschlossen, dass der gesuchte String hart einprogrammiert ist. Ich habe die hexadezimale Darstellung 80496b1 als String interpretiert, doch da kommt €Ik raus. Die ist nicht der gesuchte String. Was die 0x19 im %ecx zu sucheb haben, ist mir nicht ganz klar. Übersehe ich da was?
Kann mir jemand einen Tipp geben, wie ich ihn auslesen kann?
Danke fürs Erste
-
asm_xx schrieb:
Hallo!
Ich habe als Aufgabe herauszufinden, wann der Sprung in Zeile 11 ausgeführt wird. Dazu habe ich mir schon viele Gedanken gemacht, doch komme ich nicht weiter und weiß auch nicht, welche Aussage man tatsächlich treffen kann. Erst einmal der Code:
push %edi push %esi sub $0x14,%esp mov $0x80496b1,%edi //gesuchter String?
Ich denke es ist nur die Offset-Adresse, wo sich der String befindet.
mov $0x19,%ecx mov 0x20(%esp),%esi repz cmpsb %es:(%edi),%ds:(%esi) //Stringvergleich seta %dl setb %al cmp %al,%dl //Vergleich der Flagregister --> Sind die Strings identisch? je 1036ac <exit+0x50> //Falls ja, dann springe!
Mit cmpsb wird der Stringvergleich durchgeführt. Der String muss zuvor über das Terminal eingeben werde. In Zeile 4 wird eine Konstante ins edi Register geschoben. Ein Vergleichsoperand ist gerade das edi Register.
Der Vergleich wird jeweils mit dem Inhalt von der Adresse welche sich in ES:EDI befindet und dem Inhalt von der Adresse die sich in DS:ESI befindet gemacht, aber nicht mit der Adresse selber die sich in ES:EDI, oder in DS:ESI befindet.
Ich hoffe du erkennst nun den Unterschied.
Dirk
-
push %edi ;Sichert edi (Register für Ziel-Adressen) auf dem Stack push %esi ;Sichert esi (Register für Quell-Adressen) auf dem Stack sub $0x14,%esp ;Schafft 20 Bytes Platz auf dem Stack mov $0x80496b1,%edi ;Läd Stringliteral-Adresse in edi (1ter Vergleichswert) mov $0x19,%ecx ;Läd Wert 25 in ecx (String-Länge des Literals) mov 0x20(%esp),%esi ;Läd String-Adresse, 32 Bytes vor dem jetzigen Stackbyte (also noch vor diesem Code), in esi (2ter Vergleichswert) repz cmpsb %es:(%edi),%ds:(%esi) ;Wiederholt Byte-Vergleich zwischen Strings bis ecx Durchgänge erfolgten (Stringliteral Ende erreicht) oder die Zero-Flag nicht mehr gesetzt ist (String Unterschied entdeckt) seta %dl ;Setzt Byte falls letzterer Vergleich einen größeren Wert hervorbrachte (CF=0 und ZF=0) setb %al ;Setzt Byte falls letzterer Vergleich einen geringeren Wert hervorbrachte (CF=1) cmp %al,%dl ;Letztens verglichene Bytes gleich? je 1036ac <exit+0x50> ;Sprung bei erfolgreichem letzteren Vergleich (String beginnt mit Stringliteral!)