2016-12-03 1 views
-1

Hier ist mein Verständnis davon, was der Code tut, und wie ich es lösen möchte: Zuerst muss ich eine Zeichenfolge finden und dann diese Zeichenfolge zurückentwickeln, basierend auf der 16- Byte-Lookup-Tabelle, die ich gefunden habe. Ich weiß, dass die Werte dieser "Offsets" sich auf 60 addieren müssen, siehe Zeile < +53>.Entstörung einer binären Bombe: phase_5

Ich habe versucht, diese 6-stellige Zeichenfolge zu finden, indem X/s 0x4011fe, und andere Prüfbefehle (x/6c usw.), aber ich bin nicht annähernd in der Nähe zu korrigieren. Kann ich etwas ändern, um die richtige Ausgabe zu erhalten, damit ich diese Phase weiter entschärfen kann?

Sobald ich diese Zeichenfolge finden, ist meine Idee, diese erforderliche Ausgabezeichenfolge zu betrachten, dann herauszufinden, die Eingabezeichenfolge erforderlich, um die erwartete Ausgabe zu erhalten. Ich denke - schaue auf den Hexadezimalwert jedes Chars, vergleiche diese mit meiner Tabelle (niedrigste Reihenfolge) und finde dann ein entsprechendes Zeichen unter Verwendung der ASCII-Tabelle. Ich frage mich nur, ob das der richtige Ansatz ist, danke.

Lookup-Tabelle:

(gdb) x/16xw 0x402780 
<array.3600>: 0x00000002 0x0000000a 0x00000006 0x00000001 
<array.3600>: 0x0000000c 0x00000010 0x00000009 0x00000003 
<array.3600>: 0x00000004 0x00000007 0x0000000e 0x00000005 
<array.3600>: 0x0000000b 0x00000008 0x0000000f 0x0000000d 

Zerlegen von phase_5:

0x00000000004011bf <+0>: push %rbx 
0x00000000004011c0 <+1>: mov %rdi,%rbx 
0x00000000004011c3 <+4>: callq 0x401414 <string_length> 
0x00000000004011c8 <+9>: cmp $0x6,%eax //6 letter string! 
0x00000000004011cb <+12>: je  0x4011d2 <phase_5+19> //if 6, jump over the explode 
0x00000000004011cd <+14>: callq 0x401706 <explode_bomb> 
0x00000000004011d2 <+19>: mov %rbx,%rax 
0x00000000004011d5 <+22>: lea 0x6(%rbx),%rdi 
0x00000000004011d9 <+26>: mov $0x0,%ecx 
0x00000000004011de <+31>: movzbl (%rax),%edx 
0x00000000004011e1 <+34>: and $0xf,%edx //”and” each letter 
0x00000000004011e4 <+37>: add 0x402780(,%rdx,4),%ecx 
0x00000000004011eb <+44>: add $0x1,%rax 
0x00000000004011ef <+48>: cmp %rdi,%rax //compare, and then loop again. 
0x00000000004011f2 <+51>: jne 0x4011de <phase_5+31> //loop! 
0x00000000004011f4 <+53>: cmp $0x3c,%ecx //final compare, and then done! (0x3c = 60) 
0x00000000004011f7 <+56>: je  0x4011fe <phase_5+63> //jump over explode, and finish! 
0x00000000004011f9 <+58>: callq 0x401706 <explode_bomb> 
0x00000000004011fe <+63>: pop %rbx 
0x00000000004011ff <+64>: retq 
End of assembler dump. 
+2

Ich war nie begeistert von Leuten, die abstimmten, ohne zumindest ein Feedback zu geben. Ich habe nicht abgestimmt, aber da andere Ihnen nicht die Höflichkeit einer Erklärung geben: Sie haben eine Hausaufgabenfrage gestellt und grundsätzlich gesagt: "Ich weiß nicht, was ich tun soll, wie lautet die Antwort?" Sie werden viel mehr Glück haben, wenn Sie Ihre Ziele posten und nach einem Anstupsen in die richtige Richtung fragen ... obwohl ich nicht denke, dass stackoverflow.com der richtige Ort dafür ist. –

+0

Außerdem: Wenn ich gesehen habe, wie Leute Hausaufgaben posten und eine positive Antwort bekommen, hat der Autor im Allgemeinen Dinge skizziert, die sie versucht haben, so dass die Leute nicht das Gefühl haben, dass sie die Hausaufgaben des Autors machen. –

+0

Tut mir leid, @BrianVandenberg, ich schätze wirklich Ihren Kommentar! Ich habe meine Frage bearbeitet, hoffentlich ist es jetzt besser. Ich bin hauptsächlich darauf fixiert, wie man die zu untersuchende Saite findet, wie ich es schon seit ein paar Tagen war. Ich habe versucht, meinen Gedankengang zu erklären, in der Hoffnung, eine Bestätigung zu bekommen, dass ich richtig denke, ich werde versuchen, das deutlicher zu machen. Danke noch einmal! – Mary

Antwort

1

Nach reiflicher Überlegung habe ich festgestellt erfolgreich eine Antwort. Es stellt sich heraus, dass keine Zeichenfolge zum Vergleichen vorhanden ist, sondern nur der Wert von 0x3c. Überdenken scheint für mich ein üblicher Untergang zu sein, wenn es darum geht, Assemblercode zu lesen.

Im Wesentlichen musste ich 6 Zahlen aus dem Array auswählen, die Summe auf 0x3c. Wählen Sie dann 6 druckbare Zeichen oder Zahlen aus, die den entsprechenden Index als die unteren 4 Bits haben. Also, die einfachste Wahl war 0xa, die einen Index von 1 hat, (0xa = 10, also 6 Werte zu bekommen, war trivial).

Danke für die Kommentare an alle.