【一个缓冲区溢出示例】
问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗?
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("\n Password cracked \n"); 17 } 18 else 19 { 20 printf("\n Incorrect passwd \n"); 21 } 22 23 return 0; 24 }
答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如:
1 $ ./psswd aaaaaaaaaaaaa 2 3 Password cracked