一个缓冲区溢出示例

一个缓冲区溢出示例

问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗?

 1 #include<stdio.h> 
 2 
 3 int main(int argc, char *argv[]) 
 4 {
 5     int flag = 0; 
 6     char passwd[10]; 
 7     memset(passwd,0,sizeof(passwd)); 
 8     strcpy(passwd, argv[1]); 
 9 
10     if(0 == strcmp("LinuxGeek", passwd))
11     {
12         flag = 1;
13     }
14     if(flag) 
15     {
16         printf("
 Password cracked 
");
17     }
18     else
19     {
20         printf("
 Incorrect passwd 
");
21     }
22 
23     return 0; 
24 } 
View Code

答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如:

1 $ ./psswd aaaaaaaaaaaaa 
2 
3 Password cracked 
View Code

参考:http://www.kuqin.com/language/20120909/330359.html

原文地址:https://www.cnblogs.com/tekkaman/p/3548749.html