ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½Π½Π°Ρ Β«buffer β overflowΒ» Π°ΡΠ°ΠΊΠ°ΠΌ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΡΡΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π² buf. ΠΠ°Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½Π° «buffer — overflow» Π°ΡΠ°ΠΊΠ°ΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌΠΎΠΉ Π² Π±ΡΡΠ΅Ρ. ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ Π±ΡΡΠ΅Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΡΡΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π² buf. ΠΠ°Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΡΠΈΡΠ΅Π½Π° ΠΎΡ Π°ΡΠ°ΠΊ «buffer — overflow… Π§ΠΈΡΠ°ΡΡ Π΅ΡΡ >
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½Π½Π°Ρ Β«buffer β overflowΒ» Π°ΡΠ°ΠΊΠ°ΠΌ (ΡΠ΅ΡΠ΅ΡΠ°Ρ, ΠΊΡΡΡΠΎΠ²Π°Ρ, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ)
ΠΠΎΠ΄:
void main (int argc, char *argv[]).
{.
setlocale (LC_ALL," Russian");
char buf[5];
if (argc >= 2).
{.
strcpy_s (buf, argv[1]);
}.
}.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΡΡΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π² buf. ΠΠ°Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½Π° «buffer — overflow» Π°ΡΠ°ΠΊΠ°ΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌΠΎΠΉ Π² Π±ΡΡΠ΅Ρ. ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ Π±ΡΡΠ΅Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ.
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, Π·Π°ΡΠΈΡΠ΅Π½Π½Π°Ρ ΠΎΡ Π°ΡΠ°ΠΊ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°
ΠΠΎΠ΄:
void main (int argc, char *argv[]).
{.
setlocale (LC_ALL," Russian");
char buf[5];
strncpy (buf, argv[1], sizeof (buf)-1);
buf[sizeof (buf)-1] = '';
cout << buf;
getch ();
}.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΡΡΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π² buf. ΠΠ°Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΡΠΈΡΠ΅Π½Π° ΠΎΡ Π°ΡΠ°ΠΊ «buffer — overflow», ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ strncpy ΡΠ²Π»ΡΠ΅ΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ (Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² Π±ΡΡΠ΅Ρ Π»ΠΈΡΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²).
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠ°Ρ «buffer-overflow» Π°ΡΠ°ΠΊΡ
ΠΠΎΠ΄:
int main (int argc, char* argv[]).
{.
char str[256] = «» ;
char path1[100] = «C:UsersΠΠ»ΡΠ³Π°DocumentsVisual Studio 2012Projects6.1Debug6.1.exe» ;
char path2[100] = «C:UsersΠΠ»ΡΠ³Π°DocumentsVisual Studio 2012Projects6.1Debug6.2.exe» ;
strcpy_s (str, argv[1]);
if (argc == 2).
{.
strcat_s (path1, ««);
strcat_s (path1, str);
WinExec (path1, SW_SHOW);
/*strcat_s (path2, ««);
strcat_s (path2, str);
WinExec (path2, SW_SHOW);*/.
}.
return 0;
}.
ΠΠ°Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ «buffer — overflow» Π°ΡΠ°ΠΊΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ Π»ΡΠ±ΡΡ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ № 1 ΠΈΠ»ΠΈ № 2, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΡΡΡΠΎΠΊΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊΠΈ, ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠ°, ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π°ΡΠ°ΠΊΠ° «buffer — overflow». ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π²ΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π·Π°ΡΠΈΡΠ΅Π½Π° ΠΎΡ Π΄Π°Π½Π½ΡΡ Π°ΡΠ°ΠΊ.