📄 00000002.htm
字号:
/* root */ <BR> <BR> while (*now&&*now!=':') now++; /* 这是超级大安全漏洞 */ <BR> <BR> if (!*now) return 0; <BR> <BR> *now = 0; now++; <BR> <BR> strcpy(user->root,start); /* 这会导致buffer overflow */ <BR> <BR> start = now; <BR> <BR> /* shell */ <BR> <BR> while (*now&&*now!=':') now++; /* 这是超级大安全漏洞 */ <BR> <BR> *now = 0; now++; <BR> <BR> strcpy(user->shell,start); /* 这会导致buffer overflow */ <BR> <BR> start = now; <BR> <BR> return 1; <BR> <BR> } <BR> <BR> <BR> int read_password(char *filename,account *users) <BR> <BR> { <BR> <BR> FILE *fp; <BR> <BR> char buf[1024]; <BR> <BR> int n; <BR> <BR> <BR> n = 0; <BR> <BR> fp = fopen(filename,"rt"); <BR> <BR> while (fgets(buf,1024,fp)!=NULL) { <BR> <BR> if (acc_info(buf,&users[n])) n++; <BR> <BR> } <BR> <BR> fclose(fp); <BR> <BR> return n; <BR> <BR> } <BR> <BR> <BR> void main(int argc,char **argv) <BR> <BR> { <BR> <BR> int n,i,done; <BR> <BR> account ACC[128]; <BR> <BR> char username[256]; <BR> <BR> char password[256]; <BR> <BR> char * passwd; <BR> <BR> char salt[4]; <BR> <BR> <BR> if (argc<2) { <BR> <BR> printf("username:"); <BR> <BR> scanf("%s",username); /* 这是超级大安全漏洞 */ <BR> <BR> } else strcpy(username,argv[1]); /* 这是超级大安全漏洞 */ <BR> <BR> if (argc<3) { <BR> <BR> printf("password:"); <BR> <BR> scanf("%s",password); /* 这是超级大安全漏洞 */ <BR> <BR> } else strcpy(password,argv[2]); /* 这是超级大安全漏洞 */ <BR> <BR> <BR> n = read_password("/etc/passwd",ACC); <BR> <BR> <BR> for (i=0,done=0;i<n;i++) <BR> <BR> if (strcmp(username,ACC[i].username)==0) { <BR> <BR> salt[0] = ACC[i].passwd[0]; <BR> <BR> salt[1] = ACC[i].passwd[1]; <BR> <BR> salt[2] = 0; <BR> <BR> passwd = crypt(password,salt); <BR> <BR> printf("%s %s %s\n",ACC[i].username,ACC[i].passwd,passwd); <BR> <BR> if (strcmp(passwd,ACC[i].passwd)==0) { <BR> <BR> printf("login successfully!\n"); <BR> <BR> } else { <BR> <BR> printf("incorrect password!\n"); <BR> <BR> } <BR> <BR> done = 1; <BR> <BR> } <BR> <BR> if (!done) printf("invalid username!\n"); <BR> <BR> } <BR> <BR> <BR> 编译 <BR> <BR> <BR> gcc -o verify_passwd verify_passwd.c -lcrypt <BR> <BR> <BR> 检验 <BR> <BR> <BR> ./verify_passwd your_username your_password <BR> <BR> <BR> 避免安全漏洞 <BR> <BR> <BR> buffer overflow是个很严重的安全漏洞,通常您不可使用像char buf[xxxx]的 <BR> <BR> 宣告。在这一类与安全有相关的任何程式写作中(不是只有密码,例如像 <BR> <BR> www/ftp/telnet的这一类对外窗口都要算在内),您应该要先检查字串长度。例 <BR> <BR> 如以下例子: <BR> <BR> <BR> len = strlen(incoming_username); <BR> <BR> if (len>xxx) invalid; <BR> <BR> new_string = (char*)malloc(len+1); <BR> <BR> strcpy(new_string,incoming_username); <BR> <BR> your_own_operations... <BR> <BR> <BR> 如此才能避免buffer overflow,万万不可滥做假设,切记切记,连许多数十年 <BR> <BR> 经验丰富的老手都会犯这个错误。 <BR> <BR> <BR> <BR> 与crypt函数相关者尚有以下三个: <BR> <BR> <BR> void setkey (const char *key); <BR> <BR> void encrypt (char *block, int edflag); <BR> <BR> void swab (const char *from, char *to, ssize_t n); <BR> <BR> <BR> 一般来说,除非您有特殊需求,你不会用到这三个。 <BR> <BR> <BR> <BR> OK STATION, Webmaster, Brian Lin <BR> <BR> <BR> <BR> <BR>-- <BR>在江湖中,只要拿起了刀,就是一场无涯的梦。 <BR> <BR>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 159.226.21.168] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -