Frage

Wie meine vorherige Frage beinhaltet dies eine Zuordnung, bei der eine Methode aufgerufen wird, die ein bestimmtes Kennwort erfordert, der Code versteckt ist und wir das Passwort aus dem Montagecode schließen müssen (ich möchte das Schlagen vermeiden. Ich habe einige Phasen ausgefüllt weit und ich werde besser verstehen, aber diese Phase hat ein paar Aspekte, mit denen ich Probleme habe. Bisher weiß ich, dass das Passwort für diese Phase zwei Ganzzahlen beträgt. Backtracing war für einige davon meine GOTO -Methode, aber nicht sehr hilfreich für diese Phase.

  1. Ich verstehe, dass CLTQ EAX (Rax) auf 4 Wörter erweitert, aber ich bin mir nicht sicher, wie sich dies auf die Berechnungen auswirkt, und auch nicht sicher, was passiert, wenn diese Zeile mehrmals getroffen wird.
  2. Die Phase5+82 -> Phase5+65 (eine Schleife?) Welche Werte versuche ich, mit so ECX (RCX) den endgültigen Vergleich zu bestehen?
  3. MOV 0x402600 (,%Rax, 4),%esex <- Was macht diese Zeile genau? Der Leerzeichen werfen mich weg, ist eine leere = 0?
  4. Jede andere Hilfe, um zu verstehen, was los ist und wie ich mich nähern sollte, um herauszufinden, ob die Eingabe hilfreich ist. Ich habe versucht, dies wieder in C -Code umzuwandeln, wie frühere Phasen

    0x00000000004010b4 <phase_5+0>:         sub    $0x18,%rsp
    0x00000000004010b8 <phase_5+4>:         lea    0x10(%rsp),%rcx
    0x00000000004010bd <phase_5+9>:         lea    0x14(%rsp),%rdx
    0x00000000004010c2 <phase_5+14>:        mov    $0x4026aa,%esi
    0x00000000004010c7 <phase_5+19>:        mov    $0x0,%eax
    0x00000000004010cc <phase_5+24>:        callq  0x400b80<sscanf@plt>
    0x00000000004010d1 <phase_5+29>:        cmp    $0x1,%eax
    0x00000000004010d4 <phase_5+32>:        jg     0x4010db<phase_5+39>
    0x00000000004010d6 <phase_5+34>:        callq  0x401421(explode_bomb)
    0x00000000004010db <phase_5+39>:        mov    0x14(%rsp),%eax
    0x00000000004010df <phase_5+43>:        and    $0xf,%eax
    0x00000000004010e2 <phase_5+46>:        mov    %eax,0x14(%rsp)
    0x00000000004010e6 <phase_5+50>:        cmp    $0xf,%eax
    0x00000000004010e9 <phase_5+53>:        je     0x40111b <phase_5+103>
    0x00000000004010eb <phase_5+55>:        mov    $0x0,%edx
    0x00000000004010f0 <phase_5+60>:        mov    $0x0,%ecx
    0x00000000004010f5 <phase_5+65>:        add    $0x1,%edx
    0x00000000004010f8 <phase_5+68>:        cltq   
    0x00000000004010fa <phase_5+70>:        mov    0x402600(,%rax,4),%eax
    0x0000000000401101 <phase_5+77>:        add    %eax,%ecx
    0x0000000000401103 <phase_5+79>:        cmp    $0xf,%eax
    0x0000000000401106 <phase_5+82>:        jne    0x4010f5 <phase_5+65>
    0x0000000000401108 <phase_5+84>:        movl   $0xf,0x14(%rsp)
    0x0000000000401110 <phase_5+92>:        cmp    $0xf,%edx
    0x0000000000401113 <phase_5+95>:        jne    0x40111b <phase_5+103>
    0x0000000000401115 <phase_5+97>:        cmp    %ecx,0x10(%rsp)
    0x0000000000401119 <phase_5+101>:       je     0x401120 <phase_5+108>
    0x000000000040111b <phase_5+103>:       callq  0x401421 <explode_bomb>
    0x0000000000401120 <phase_5+108>:       add    $0x18,%rsp
    0x0000000000401124 <phase_5+112>:       retq   
    
War es hilfreich?

Lösung

Der Code übersetzt dazu:

0x402600: int table[15];
0x4026aa: const char *format;

void func (const char *str)
{
    int a, b, count, sum;

    if (sscanf (str, format, &a, &b) != 2) {
        explode_bomb();
    }

    a = a & 0xF;
    if (a == 0xF) {
        explode_bomb();
    }

    sum = 0;
    count = 0;
    while (a != 0xF) {
        a = table[a];
        sum += a;
        count++;
    }

    if ((count != 0xF) || (sum != b)) {
        explode_bomb ();
    }
}

Um Ihre spezifischen Punkte zu beantworten:

CLTQ wird verwendet, um die 4 wichtigsten Bytes von Rax zu löschen, um die Adressberechnung in der folgenden Anweisung nicht zu stören. Es hat keinen Einfluss auf die Berechnung.

MOV 0x402600 (,%Rax, 4),%esex <- Was macht diese Zeile genau? Der Leerzeichen werfen mich weg, ist eine leere = 0?

Ja, das ist nur MOV DWORD EAX, [0x402600 + 0 + RAX * 4

Sobald Sie das C -Äquivalent haben, ist es leicht, herauszufinden, wie Sie eine Lösung finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top