Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 1 » Software Reverse Engineering 2015-08-04   (Übersicht)

Software Reverse Engineering 2015-08-04

Fach: Software Reverse Engineering

Prüfer: Tilo Müller

Beisitzer: Mykola Protsenko

Angenehme Atmosphäre. Wie in allen Reversing-Prüfungen gab es ein A4-Blatt mit Assembler-Code, Platz für C-Code und leeren Stack-Darstellungen (bei mir nicht benutzt)

Fragen

kleines x86 Assembly Programm (strcat)

F: 32 oder 64 Bit?

A: 64 wegen Registernamen mit 'r'.

F: Wie viele Parameter, welcher Typ, was wird getan, C-Code hinschreiben

F: Hier steht ja cmp [rax + 0x1337], 0. Was führt das intern aus und welche Möglichkeit gäbe es stattdessen?

A: Eine Subtraktion. Alternativ könnte man test benutzen, was einer Verundung entspricht – dann ist der zweite Operand aber nicht 0, sondern auch der Wert. Das geht aber nicht, weil nur ein Operand indirekten Speicherzugriff kann → muesste man nochmal in ein Register zwischenspeichern.

F: Welche Calling-Convention haben wir hier denn?

A: Sysv-unix, weil parameter in rdi/rsi

F: Welche Calling-Convention gibt es noch auf 64 Bit und wie unterscheidet sie sich?

A: Die von Microsoft.

F: Parameterreihenfolge bei beiden?

F: Genau. Auf x86 gibt es ja Carry- und Overflow-Flag. Warum diese Unterscheidung?

A: CF fuer unsigned, overflow fuer signed.

F: Was tut Resume und Trap flag? A: bei hardwarebreakpoints weitermachen bzw singlestepping

F: Beispiel hinmalen (-1 + 1 in 8bit) um CF vs OF zu illustrieren

F: Zeichne doch mal das x86-Befehlsformat auf Byte-Ebene bitte.

A: Prefix, Opcode, MOD/RM, SIB, Displacement, Immediate

F: (Immer zwischendurch:) Was steht z.B. im Prefix? Wie lang sind die einzelnen Teile? Wie viele Byte jeweils für Mod, R und M?

F: Softwareschutz: Was ist ein Quine?

A: Ein Programm, das seinen eigenen Code ausgibt.

F: Wie lautet die Definition eines Virtual-Black-Box-Obfuscators, Indistinguable Obfusc.

F: Zusammenhang zu Quines?

F: Beispiel zu Indist. Obfusc A: → one point functions

F: Shellcode. Hier hast du den Linuxshellcode aus der Vorlesung als Assembly (mit data section). Welche Zwei sachen muss man machen um ihn auf dem Stack auszufuehren (quasi woertlich) A: eines ist: datensegment entfernen. ein zweites faellt mir nicht ein, ausser das NUL-frei-machen; aber das ist nicht Voraussetzung, um Shellcode auf dem Stack ausfuehren zu koennen, sondern nur Voraussetzung, dass er nicht an strcpy und Co kaputt geht.

F: oh da hast du recht (lacht). Mach beides mal. A: Nullfreimachen mit xor und co. Datensegment entfernen ist mir entfallen, habe ein bisschen rumgedruckst und es mir quasi hergeleitet: Den String mitten in den Shellcode schreiben, und mittels JMP ueberspringen.

F: aber woher kriegen wir dann den Pointer auf den string? und das ist noch an der falschen stelle! A: oh ja stimmt, nicht ueberJMPen, sondern ueberCALLen, dann kriegen wir den pointer auf das zeug nach dem CALL (also meinen string) auf den stack. und falsche stelle, ich finde das passt da.

F: hmm. das ist sogar einfacher als in der VL, joa, das funktioniert auch!

Bewertung

1.0. Besonders gefreut hat ihn meine Improvisation am schluss (shellcode/ueberCALLen), weil das zeigte, dass ich nicht nur die Folien auswendiggelernt habe, sondern den Stoff tatsaechlich verstanden. Deshalb kann man auch ueber kleinere Fehler, die ich weitestgehend selbst korrigiert habe, in dem Zusammenhang hinwegsehen.

Vorbereitung

in 3-4 Tagen alle Folien durchgesehen und auf etwa 6 Seiten zusammengefasst.