[MM32软件] strcpy()函数的问题

[复制链接]
 楼主| OKAKAKO 发表于 2024-8-31 14:34 | 显示全部楼层 |阅读模式
问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其**吗?

  1. #include<stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     int flag = 0;
  5.     char passwd[10];

  6.     memset(passwd,0,sizeof(passwd));

  7.     strcpy(passwd, argv[1]);

  8.     if(0 == strcmp("LinuxGeek", passwd))
  9.     {
  10.         flag = 1;
  11.     }

  12.     if(flag)
  13.     {
  14.         printf("\n Password cracked \n");
  15.     }
  16.     else
  17.     {
  18.         printf("\n Incorrect passwd \n");

  19.     }
  20.     return 0;
  21. }

答:**上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。

所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如:

$ ./psswd aaaaaaaaaaaaa
Password cracked
虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。

要避免这样的问题,建议使用 strncpy()函数。

作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。
LOVEEVER 发表于 2024-8-31 20:47 | 显示全部楼层
strcpy()函数适合复制密码登录
您需要登录后才可以回帖 登录 | 注册

本版积分规则

258

主题

2007

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部