Unschlüsseler Assembly -Code verstehen/dekodieren
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.
- 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.
- Die Phase5+82 -> Phase5+65 (eine Schleife?) Welche Werte versuche ich, mit so ECX (RCX) den endgültigen Vergleich zu bestehen?
- MOV 0x402600 (,%Rax, 4),%esex <- Was macht diese Zeile genau? Der Leerzeichen werfen mich weg, ist eine leere = 0?
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
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.