Aufgabenblatt für Übung 3
Transcrição
Aufgabenblatt für Übung 3
Universität Mannheim Lehrstuhl für Praktische Informatik 1 Prof. Dr. Felix Freiling Dipl.-Inf. Ralf Hund Dipl.-Inform. Carsten Willems Vorlesung Software Reverse Engineering FSS 2010 Aufgabenblatt für Übung 3 8. März 2010 Hochsprachen Aufgabe 1: Erklären Sie in kurzen Worten die Aufgabe von Compiler, Linker und Interpreter! Aufgabe 2: Ermitteln Sie den arithmetischen Ausdruck, der zu folgendem Assembler-Code geführt hat und berechnen Sie schrittweise dessen Ergebnis! mov shl shr mov shl add mul eax, eax, eax, ebx, ebx, eax, eax, 5 2 3 7 3 ebx 2 Aufgabe 3: Rekonstruieren Sie die C-Funktion, die zu folgenden Assembleranweisungen compiliert wurde! 00401CA0 00401CA1 00401CA3 00401CA6 00401CA7 00401CA8 00401CA9 00401CB0 00401CB7 00401CBB 00401CBD 00401CC2 00401CC4 00401CC8 00401CCA 00401CCE 00401CD0 00401CD5 00401CD7 push mov sub push push push mov mov cmp jnz call jmp cmp jz cmp jnz call jmp mov ebp ebp, esp esp, 0x48 ebx esi edi [ebp-4], 1 [ebp-8], 2 [ebp-4], 5 401CC4 function1 401CEB [ebp-4], 3 401CD0 [ebp-8], 2 401CD7 function2 401CEB eax, [ebp-4] 1 00401CDA 00401CDD 00401CDF 00401CE4 00401CE6 00401CEB 00401CEC 00401CED 00401CEE 00401CF0 00401CF1 cmp jbe call jmp call pop pop pop mov pop retn eax, [ebp-8] 401CE6 function3 401CEB function4 edi esi ebx esp, ebp ebp Hinweis: Das Sichern und Wiederherstellen der edi, esi und ebx-Register wurde vom Compiler eingefüht und ist nicht Teil des ursprünglichen Codes. Aufgabe 4: Rekonstruieren Sie den C-Code, der folgendes Assembler-Äquivalent hat: 00401139 00401140 00401142 00401145 00401148 0040114B 0040114F 00401151 00401158 0040115D 00401160 00401163 00401166 00401169 0040116C 0040116E 00401170 00401172 mov jmp mov add mov cmp jge mov call mov mov mov add mov cmp jl jmp ... [ebp-4], 0 loc_40114B eax, [ebp-4] eax, 1 [ebp-4], eax [ebp-4], 0x0A loc_401172 [ebp-8], 0 functionXYZ eax, [ebp-8] ecx, [ebp-4] edx, [ebp-8] edx, 1 [ebp-8], edx eax, ecx loc_401158 loc_401142 Aufgabe 5: Rekonstruieren Sie den Typ der über [ebp+4] übergebenen Struktur! Beachten Sie dabei, dass es mehrere mögliche Lösungen gibt. xor mov mov mov movzx add mov mov mov ecx, ecx eax, [ebp+4] cx, ptr [eax] edx, [ebp+4] eax, word ptr [edx+2] ecx, eax edx, [ebp+4] [edx+4], ecx eax, [ebp+4] 2 movzx test jz mov mov mov ret loc1: mov movzx xor cmp setle mov mov ecx, byte ptr [eax+8] ecx, ecx loc1 eax, [ebp+4] ecx, 0 [eax+9], cl eax, [ebp+4] ecx, byte ptr [eax+0x0A] ebx, ebx ecx, 0x100 bl eax, [ebp+4] [eax+9], bl Aufgabe 6: Erklären Sie in kurzen Worten, welche Art von Datenstruktur in den folgenden Beispielen verwendet wird und begründen Sie dieses. Auch hier sind u.U. mehrere richtige Lösungen möglich. Aufgabe 6.1 00402413 0040241A 0040241C 0040241F 00402422 00402425 00402429 0040242B 0040242E 00402431 00402435 mov jmp mov add mov cmp jge mov mov mov jmp [ebp-0x38], 0 loc_402425 eax, [ebp-0x38] eax, 1 [ebp-0x38], eax [ebp-0x38], 0x0A loc_402437 eax, [ebp-0x38] ecx, [ebp-0x38] [ebp+eax*4-0x28], ecx loc_40241C mov mov mov mov eax, [ebp+0x4] byte ptr [eax+9], 0 eax, [ebp+0x4] dword ptr [eax+4], 5 Aufgabe 6.2 004013A9 004013AC 004013B0 004013B3 3 Aufgabe 6.3 0040248F 00402492 00402497 0040249A 0040249C 0040249F 004024A1 mov call mov mov mov mov call ecx, [ebp-0x3C] sub_401041 eax, [ebp-0x3C] edx, [eax] ecx, [ebp-0x3C] eax, [edx] eax Aufgabe 7: Gegeben seien folgende Klassen: class CFahrzeug { public: int AnzahlRaeder; int Farbe; virtual void GasGeben() = 0; virtual void Bremsen() = 0; }; class CAuto: public CFahrzeug { public: int AnzahlTueren; void GasGeben() { printf("CAuto:GasGeben\n"); }; void Bremsen() { printf("CAuto:Bremsen\n"); }; virtual void Hupen() { printf("CAuto:Hupen\n"); }; CAuto() { printf("CAuto:ctor\n"); }; }; class CLKW: public CAuto { public: int GroesseLadeflaeche; void Hupen() { void Beladen() { void Entladen() { CLKW() { }; printf("CLKW:Hupen\n"); }; printf("CLKW:Beladen\n"); }; printf("CLKW:Entladen\n"); }; printf("CLKW:ctor\n"); }; class CMotorrad: public CFahrzeug { public: int AnzahlSitze; void GasGeben() { printf("CMotorrad:GasGeben\n"); }; void Bremsen() { printf("CMotorrad:Bremsen\n"); }; void Rasen() { printf("CMotorrad:Rasen\n"); }; CMotorrad() { printf("CMotorrad:ctor\n"); }; }; Stellen Sie schematisch die Datenstrukturen im Speicher nach folgenden Anweisungen dar und kommentieren Sie diese! CFahrzeug *Fahrzeug1 = new CMotorrad; CAuto *Fahrzeug2 = new CLKW; 4