PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DEP, NX, XD testen


Vertex
2005-01-07, 17:32:22
Gibts ne einfache Möglichkeit DEP (Data Execution Prevention) zu testen, also Code auszuführen der abgefangen wird bzw. nicht...

Sollte sich aber nicht um irgend einen bösartigen Code handeln. Zumindest das Konzept wäre schon brauchbar...

THX

Xero
2005-01-07, 18:20:43
int _tmain(int argc, _TCHAR* argv[])
{
void* v = VirtualAlloc(0,100,MEM_COMMIT,PAGE_READWRITE);
*(unsigned char*)v = 0xc3; // __asm ret
__asm // versuch den speicher auszuführen... ohne DEP problemlos möglich
{
mov eax,v
call eax
}
return 0;
}


;)

Vertex
2005-01-07, 19:26:05
int _tmain(int argc, _TCHAR* argv[])
{
void* v = VirtualAlloc(0,100,MEM_COMMIT,PAGE_READWRITE);
*(unsigned char*)v = 0xc3; // __asm ret
__asm // versuch den speicher auszuführen... ohne DEP problemlos möglich
{
mov eax,v
call eax
}
return 0;
}


;)funzt perfekt...
jetzt müsste ich nur noch 2 dinge wissen:

was ist daran so schlimm? besser gesagt was wird da genau gemacht? ;) Du forderst Speicher an... und schreibst dann nen wert drauf... dann rufst du ihn auf... ???
was für ein register ist eax? also was tut es?
thx für kurze erklärung :)

Lokadamus
2005-01-07, 20:16:51
mmm...

Wenn ich mich richtig erinnere:
AL : die niederen 8 Bit
AH : die höheren 8 Bit, zusammen ergeben die beiden Register das
AX : 16 Bit Register in der CPU
EAX : 32 Bit Register in der CPU

Es gibt die 4 Register A, B, C und D, damit hantiert die CPU je nach Befehl herum...

zeckensack
2005-01-07, 22:48:37
*huuuust*@Xero
int _tmain(int argc, _TCHAR* argv[])
{
void* v = VirtualAlloc(0,100,MEM_COMMIT,PAGE_READWRITE);
*(unsigned char*)v = 0xc3; // __asm ret
__asm // versuch den speicher auszuführen... ohne DEP problemlos möglich
{
mov eax,v
call eax
}
VirtualFree(v,0,MEM_RELEASE);
return 0;
}

Vertex
2005-01-08, 18:52:33
mmm...

Wenn ich mich richtig erinnere:
AL : die niederen 8 Bit
AH : die höheren 8 Bit, zusammen ergeben die beiden Register das
AX : 16 Bit Register in der CPU
EAX : 32 Bit Register in der CPU

Es gibt die 4 Register A, B, C und D, damit hantiert die CPU je nach Befehl herum...THX@ Lokadamus

*huuuust*@Xero
int _tmain(int argc, _TCHAR* argv[])
{
void* v = VirtualAlloc(0,100,MEM_COMMIT,PAGE_READWRITE);
*(unsigned char*)v = 0xc3; // __asm ret
__asm // versuch den speicher auszuführen... ohne DEP problemlos möglich
{
mov eax,v
call eax
}
VirtualFree(v,0,MEM_RELEASE);
return 0;
}
@zeckensack: THX auch an dich :). hat das denn ne größere Auswirkung bei nem kleinen Testprogramm? Das OS müsste es doch eh wieder freigeben oder? Oder war das nur zur Vollständigkeit (weil man ja normalerweise den dyn. Speicher wieder frei gibt)?

Könnte der Sinn darin liegen, dass nur "100" vom Speicher angefodert wurden, aber auf die Stelle "195" (0xc3) versucht wird zuzugreifen? Wenn ja... dann hab ichs verstanden...