Decodierung der Assemblersprache (Bomb Lab Phase 5)

Okay, das ist das immer so beliebte Bombenlabor und ich befinde mich derzeit in Phase 5 und stecke nur in zwei Zeilen fest. Hier ist der Assembler-Code:

Dump of assembler code for function phase_5:
   0x08048e29 <+0>: push   %ebx
   0x08048e2a <+1>: sub    $0x18,%esp
   0x08048e2d <+4>: mov    0x20(%esp),%ebx
   0x08048e31 <+8>: mov    %ebx,(%esp)
   0x08048e34 <+11>:    call   0x804908b <string_length>
   0x08048e39 <+16>:    cmp    $0x6,%eax
   0x08048e3c <+19>:    je     0x8048e43 <phase_5+26>
   0x08048e3e <+21>:    call   0x80493a5 <explode_bomb>
   0x08048e43 <+26>:    mov    $0x0,%edx
   0x08048e48 <+31>:    mov    $0x0,%eax
   0x08048e4d <+36>:    movzbl (%ebx,%eax,1),%ecx
   0x08048e51 <+40>:    and    $0xf,%ecx
   0x08048e54 <+43>:    add    0x804a4a0(,%ecx,4),%edx
   0x08048e5b <+50>:    add    $0x1,%eax
   0x08048e5e <+53>:    cmp    $0x6,%eax
   0x08048e61 <+56>:    jne    0x8048e4d <phase_5+36>
=> 0x08048e63 <+58>:    cmp    $0x42,%edx
   0x08048e66 <+61>:    je     0x8048e6d <phase_5+68>
   0x08048e68 <+63>:    call   0x80493a5 <explode_bomb>
   0x08048e6d <+68>:    add    $0x18,%esp
   0x08048e70 <+71>:    pop    %ebx
   0x08048e71 <+72>:    ret    
---Type <return> to continue, or q <return> to quit---
End of assembler dump.

Hier ist ein Barebone-Look, wenn ich ihn durch einen Decompiler starte:

void phase_5(__size8 *param1) {
__size32 eax; // r24
int eax_1; // r24{48}
unsigned int ecx; // r25
__size32 edx; // r26
eax = string_length(param1);
if (eax != 6) {
explode_bomb();
}
edx = 0;
eax = 0;
do {
eax_1 = eax;
ecx = *(unsigned char*)(param1 + eax_1);
edx += array.3142[(ecx & 0xf)];
eax = eax_1 + 1;
} while (eax_1 + 1 != 6);
if (edx != 66) {
explode_bomb();
}
return;
}

Die allgemeine Zusammenfassung dieser Phase lautet, dass die Zeichenfolge 6 Zeichen lang sein muss. Anschließend durchläuft sie eine do while-Schleife, nimmt die Zeichenfolge und wandelt sie durch ihren Algorithmus in eine Zahl um Ende. Meine Frage ist, was machen diese beiden Zeilen:

ecx = (unsigned char) (param1 + eax_1); edx + = array.3142 [(ecx & 0xf)];

Mehr speziell die erste. Die zweite Zeile ist der Wert der ersten Zeile mit 15, der im Wesentlichen die letzten 4 Bits von ecx ergibt. Aber was bewirkt das Hinzufügen des Strings (param1) mit dem Schleifenzähler (eax_1)? Ist dies auch die Zeile, die jedes Zeichen in der Zeichenfolge in eine Zahl umwandelt? Jede Hilfe wäre sehr dankbar!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage