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